Author: rmacklem
Date: Sat Jan  1 18:50:49 2011
New Revision: 216875
URL: http://svn.freebsd.org/changeset/base/216875

Log:
  Add support for shared vnode locks for the Read operation
  in the experimental NFSv4 server.
  
  Reviewed by:  kib
  MFC after:    2 weeks

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

Modified: head/sys/fs/nfs/nfs_commonsubs.c
==============================================================================
--- head/sys/fs/nfs/nfs_commonsubs.c    Sat Jan  1 17:39:38 2011        
(r216874)
+++ head/sys/fs/nfs/nfs_commonsubs.c    Sat Jan  1 18:50:49 2011        
(r216875)
@@ -109,7 +109,7 @@ struct nfsv4_opflag nfsv4_opflag[NFSV4OP
        { 1, 0, 0, 0, LK_EXCLUSIVE },           /* PutFH */
        { 1, 0, 0, 0, LK_EXCLUSIVE },           /* PutPubFH */
        { 1, 0, 0, 0, LK_EXCLUSIVE },           /* PutRootFH */
-       { 0, 1, 0, 0, LK_EXCLUSIVE },           /* Read */
+       { 0, 1, 0, 0, LK_SHARED },              /* Read */
        { 0, 1, 0, 0, LK_SHARED },              /* Readdir */
        { 0, 1, 0, 0, LK_SHARED },              /* ReadLink */
        { 0, 2, 1, 1, LK_EXCLUSIVE },           /* Remove */

Modified: head/sys/fs/nfsserver/nfs_nfsdstate.c
==============================================================================
--- head/sys/fs/nfsserver/nfs_nfsdstate.c       Sat Jan  1 17:39:38 2011        
(r216874)
+++ head/sys/fs/nfsserver/nfs_nfsdstate.c       Sat Jan  1 18:50:49 2011        
(r216875)
@@ -4217,7 +4217,7 @@ static int
 nfsrv_clientconflict(struct nfsclient *clp, int *haslockp, __unused vnode_t vp,
     NFSPROC_T *p)
 {
-       int gotlock;
+       int gotlock, lktype;
 
        /*
         * If lease hasn't expired, we can't fix it.
@@ -4227,7 +4227,8 @@ nfsrv_clientconflict(struct nfsclient *c
                return (0);
        if (*haslockp == 0) {
                NFSUNLOCKSTATE();
-               NFSVOPUNLOCK(vp, 0, p);
+               lktype = VOP_ISLOCKED(vp);
+               VOP_UNLOCK(vp, 0);
                NFSLOCKV4ROOTMUTEX();
                nfsv4_relref(&nfsv4rootfs_lock);
                do {
@@ -4236,7 +4237,7 @@ nfsrv_clientconflict(struct nfsclient *c
                } while (!gotlock);
                NFSUNLOCKV4ROOTMUTEX();
                *haslockp = 1;
-               NFSVOPLOCK(vp, LK_EXCLUSIVE | LK_RETRY, p);
+               vn_lock(vp, lktype | LK_RETRY);
                return (1);
        }
        NFSUNLOCKSTATE();
@@ -4278,7 +4279,7 @@ nfsrv_delegconflict(struct nfsstate *stp
     vnode_t vp)
 {
        struct nfsclient *clp = stp->ls_clp;
-       int gotlock, error, retrycnt, zapped_clp;
+       int gotlock, error, lktype, retrycnt, zapped_clp;
        nfsv4stateid_t tstateid;
        fhandle_t tfh;
 
@@ -4391,7 +4392,8 @@ nfsrv_delegconflict(struct nfsstate *stp
         */
        if (*haslockp == 0) {
                NFSUNLOCKSTATE();
-               NFSVOPUNLOCK(vp, 0, p);
+               lktype = VOP_ISLOCKED(vp);
+               VOP_UNLOCK(vp, 0);
                NFSLOCKV4ROOTMUTEX();
                nfsv4_relref(&nfsv4rootfs_lock);
                do {
@@ -4400,7 +4402,7 @@ nfsrv_delegconflict(struct nfsstate *stp
                } while (!gotlock);
                NFSUNLOCKV4ROOTMUTEX();
                *haslockp = 1;
-               NFSVOPLOCK(vp, LK_EXCLUSIVE | LK_RETRY, p);
+               vn_lock(vp, lktype | LK_RETRY);
                return (-1);
        }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to