]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/nfs/nfs_socket.c
xnu-4570.1.46.tar.gz
[apple/xnu.git] / bsd / nfs / nfs_socket.c
index 191a8fa29ce2785c29b5a482d135ca78cbe8cd18..5ade6666b1da6f024062f3b79321807646b1bd01 100644 (file)
@@ -3727,7 +3727,7 @@ nfs_request_destroy(struct nfsreq *req)
 
        if (!req || !(req->r_flags & R_INITTED))
                return;
-       nmp  = req->r_np ? NFSTONMP(req->r_np) : req->r_nmp;
+       nmp  = req->r_nmp;
        req->r_flags &= ~R_INITTED;
        if (req->r_lflags & RL_QUEUED)
                nfs_reqdequeue(req);
@@ -3851,7 +3851,7 @@ nfs_request_add_header(struct nfsreq *req)
                req->r_mhead = NULL;
        }
 
-       nmp = req->r_np ? NFSTONMP(req->r_np) : req->r_nmp;
+       nmp = req->r_nmp;
        if (nfs_mount_gone(nmp))
                return (ENXIO);
 
@@ -3860,7 +3860,7 @@ nfs_request_add_header(struct nfsreq *req)
                return (error);
 
        req->r_mreqlen = mbuf_pkthdr_len(req->r_mhead);
-       nmp = req->r_np ? NFSTONMP(req->r_np) : req->r_nmp;
+       nmp = req->r_nmp;
        if (nfs_mount_gone(nmp))
                return (ENXIO);
        lck_mtx_lock(&nmp->nm_lock);
@@ -3889,7 +3889,7 @@ nfs_request_send(struct nfsreq *req, int wait)
 
        lck_mtx_lock(nfs_request_mutex);
 
-       nmp = req->r_np ? NFSTONMP(req->r_np) : req->r_nmp;
+       nmp = req->r_nmp;
        if (nfs_mount_gone(nmp)) {
                lck_mtx_unlock(nfs_request_mutex);
                return (ENXIO);
@@ -3963,7 +3963,7 @@ nfs_request_finish(
 
        mrep = req->r_nmrep.nmc_mhead;
 
-       nmp = req->r_np ? NFSTONMP(req->r_np) : req->r_nmp;
+       nmp = req->r_nmp;
 
        if ((req->r_flags & R_CWND) && nmp) {
                /*
@@ -4901,6 +4901,13 @@ restart:
                            !(nmp->nm_sockflags & (NMSOCK_POKE|NMSOCK_UNMOUNT)) &&
                            (nmp->nm_sockflags & NMSOCK_READY)) {
                                nmp->nm_sockflags |= NMSOCK_POKE;
+                               /*
+                                * We take a ref on the mount so that we know the mount will still be there
+                                * when we process the nfs_mount_poke_queue. An unmount request will block
+                                * in nfs_mount_drain_and_cleanup until after the poke is finished. We release
+                                * the reference after calling nfs_sock_poke below;
+                                */
+                               nmp->nm_ref++;
                                TAILQ_INSERT_TAIL(&nfs_mount_poke_queue, nmp, nm_pokeq);
                        }
                        lck_mtx_unlock(&nmp->nm_lock);
@@ -4973,6 +4980,7 @@ restart:
        while ((nmp = TAILQ_FIRST(&nfs_mount_poke_queue))) {
                TAILQ_REMOVE(&nfs_mount_poke_queue, nmp, nm_pokeq);
                nfs_sock_poke(nmp);
+               nfs_mount_rele(nmp);
        }
 
        nfs_interval_timer_start(nfs_request_timer_call, NFS_REQUESTDELAY);