Author: rmacklem
Date: Fri May 29 20:22:53 2015
New Revision: 283753
URL: https://svnweb.freebsd.org/changeset/base/283753

Log:
  Make the NFS server use shared vnode locks for a few cases
  that are allowed by the VFS/VOP interface instead of using
  exclusive locks.
  
  MFC after:    2 weeks

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

Modified: head/sys/fs/nfsserver/nfs_nfsdsocket.c
==============================================================================
--- head/sys/fs/nfsserver/nfs_nfsdsocket.c      Fri May 29 20:00:02 2015        
(r283752)
+++ head/sys/fs/nfsserver/nfs_nfsdsocket.c      Fri May 29 20:22:53 2015        
(r283753)
@@ -440,9 +440,12 @@ nfsrvd_dorpc(struct nfsrv_descript *nd, 
                        if (nd->nd_procnum == NFSPROC_READ ||
                            nd->nd_procnum == NFSPROC_WRITE ||
                            nd->nd_procnum == NFSPROC_READDIR ||
+                           nd->nd_procnum == NFSPROC_READDIRPLUS ||
                            nd->nd_procnum == NFSPROC_READLINK ||
                            nd->nd_procnum == NFSPROC_GETATTR ||
-                           nd->nd_procnum == NFSPROC_ACCESS)
+                           nd->nd_procnum == NFSPROC_ACCESS ||
+                           nd->nd_procnum == NFSPROC_FSSTAT ||
+                           nd->nd_procnum == NFSPROC_FSINFO)
                                lktype = LK_SHARED;
                        else
                                lktype = LK_EXCLUSIVE;
@@ -544,7 +547,7 @@ static void
 nfsrvd_compound(struct nfsrv_descript *nd, int isdgram, u_char *tag,
     int taglen, u_int32_t minorvers, NFSPROC_T *p)
 {
-       int i, op, op0 = 0;
+       int i, lktype, op, op0 = 0;
        u_int32_t *tl;
        struct nfsclient *clp, *nclp;
        int numops, error = 0, igotlock;
@@ -953,11 +956,15 @@ nfsrvd_compound(struct nfsrv_descript *n
                                panic("nfsrvd_compound");
                        if (nfsv4_opflag[op].needscfh) {
                                if (vp != NULL) {
-                                       if (nfsv4_opflag[op].modifyfs)
+                                       lktype = nfsv4_opflag[op].lktype;
+                                       if (nfsv4_opflag[op].modifyfs) {
                                                vn_start_write(vp, &temp_mp,
                                                    V_WAIT);
-                                       if (NFSVOPLOCK(vp, 
nfsv4_opflag[op].lktype)
-                                           == 0)
+                                               if (op == NFSV4OP_WRITE &&
+                                                   MNT_SHARED_WRITES(temp_mp))
+                                                       lktype = LK_SHARED;
+                                       }
+                                       if (NFSVOPLOCK(vp, lktype) == 0)
                                                VREF(vp);
                                        else
                                                nd->nd_repstat = NFSERR_PERM;
_______________________________________________
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