Author: rmacklem
Date: Fri Dec 17 22:18:09 2010
New Revision: 216510
URL: http://svn.freebsd.org/changeset/base/216510

Log:
  Fix two vnode locking problems in nfsd_recalldelegation() in the
  experimental NFSv4 server. The first was a bogus use of VOP_ISLOCKED()
  in a KASSERT() and the second was the need to lock the vnode for the
  nfsrv_checkremove() call. Also, delete a "__unused" that was bogus,
  since the argument is used.
  
  Reviewed by:  zack.kirsch at isilon.com
  MFC after:    2 weeks

Modified:
  head/sys/fs/nfsserver/nfs_nfsdstate.c

Modified: head/sys/fs/nfsserver/nfs_nfsdstate.c
==============================================================================
--- head/sys/fs/nfsserver/nfs_nfsdstate.c       Fri Dec 17 22:09:55 2010        
(r216509)
+++ head/sys/fs/nfsserver/nfs_nfsdstate.c       Fri Dec 17 22:18:09 2010        
(r216510)
@@ -4275,7 +4275,7 @@ nfsrv_clientconflict(struct nfsclient *c
  */
 static int
 nfsrv_delegconflict(struct nfsstate *stp, int *haslockp, NFSPROC_T *p,
-    __unused vnode_t vp)
+    vnode_t vp)
 {
        struct nfsclient *clp = stp->ls_clp;
        int gotlock, error, retrycnt, zapped_clp;
@@ -4568,8 +4568,6 @@ nfsd_recalldelegation(vnode_t vp, NFSPRO
        int32_t starttime;
        int error;
 
-       KASSERT(!VOP_ISLOCKED(vp), ("vp %p is locked", vp));
-
        /*
         * First, check to see if the server is currently running and it has
         * been called for a regular file when issuing delegations.
@@ -4578,6 +4576,7 @@ nfsd_recalldelegation(vnode_t vp, NFSPRO
            nfsrv_issuedelegs == 0)
                return;
 
+       KASSERT((VOP_ISLOCKED(vp) != LK_EXCLUSIVE), ("vp %p is locked", vp));
        /*
         * First, get a reference on the nfsv4rootfs_lock so that an
         * exclusive lock cannot be acquired by another thread.
@@ -4593,7 +4592,12 @@ nfsd_recalldelegation(vnode_t vp, NFSPRO
        NFSGETNANOTIME(&mytime);
        starttime = (u_int32_t)mytime.tv_sec;
        do {
-               error = nfsrv_checkremove(vp, 0, p);
+               vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
+               if ((vp->v_iflag & VI_DOOMED) == 0)
+                       error = nfsrv_checkremove(vp, 0, p);
+               else
+                       error = EPERM;
+               VOP_UNLOCK(vp, 0);
                if (error == NFSERR_DELAY) {
                        NFSGETNANOTIME(&mytime);
                        if (((u_int32_t)mytime.tv_sec - starttime) >
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to