git: f6be8e515519 - stable/12 - nfs server: improve use of the VFS KPI

Konstantin Belousov kib at FreeBSD.org
Sat Jan 9 01:34:11 UTC 2021


The branch stable/12 has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=f6be8e5155195f5eeac763fa24d6afa2d5417fa0

commit f6be8e5155195f5eeac763fa24d6afa2d5417fa0
Author:     Konstantin Belousov <kib at FreeBSD.org>
AuthorDate: 2021-01-01 15:35:44 +0000
Commit:     Konstantin Belousov <kib at FreeBSD.org>
CommitDate: 2021-01-09 01:33:55 +0000

    nfs server: improve use of the VFS KPI
    
    (cherry picked from commit 51a9b978e75021415fdced616b4e4bc373a20a8a)
---
 sys/fs/nfsserver/nfs_nfsdport.c   | 33 ++++++++++++++++++++-------------
 sys/fs/nfsserver/nfs_nfsdsocket.c |  6 ++----
 2 files changed, 22 insertions(+), 17 deletions(-)

diff --git a/sys/fs/nfsserver/nfs_nfsdport.c b/sys/fs/nfsserver/nfs_nfsdport.c
index f159e9c89a87..0bb3edbddec9 100644
--- a/sys/fs/nfsserver/nfs_nfsdport.c
+++ b/sys/fs/nfsserver/nfs_nfsdport.c
@@ -3086,28 +3086,35 @@ nfsd_fhtovp(struct nfsrv_descript *nd, struct nfsrvfh *nfp, int lktype,
     struct vnode **vpp, struct nfsexstuff *exp,
     struct mount **mpp, int startwrite, struct thread *p)
 {
-	struct mount *mp;
+	struct mount *mp, *mpw;
 	struct ucred *credanon;
 	fhandle_t *fhp;
+	int error;
 
+	if (mpp != NULL)
+		*mpp = NULL;
+	*vpp = NULL;
 	fhp = (fhandle_t *)nfp->nfsrvfh_data;
-	/*
-	 * Check for the special case of the nfsv4root_fh.
-	 */
 	mp = vfs_busyfs(&fhp->fh_fsid);
-	if (mpp != NULL)
-		*mpp = mp;
 	if (mp == NULL) {
-		*vpp = NULL;
 		nd->nd_repstat = ESTALE;
 		goto out;
 	}
 
 	if (startwrite) {
-		vn_start_write(NULL, mpp, V_WAIT);
+		mpw = mp;
+		error = vn_start_write(NULL, &mpw, V_WAIT);
+		if (error != 0) {
+			mpw = NULL;
+			vfs_unbusy(mp);
+			nd->nd_repstat = ESTALE;
+			goto out;
+		}
 		if (lktype == LK_SHARED && !(MNT_SHARED_WRITES(mp)))
 			lktype = LK_EXCLUSIVE;
-	}
+	} else
+		mpw = NULL;
+
 	nd->nd_repstat = nfsvno_fhtovp(mp, fhp, nd->nd_nam, lktype, vpp, exp,
 	    &credanon);
 	vfs_unbusy(mp);
@@ -3119,6 +3126,7 @@ nfsd_fhtovp(struct nfsrv_descript *nd, struct nfsrvfh *nfp, int lktype,
 	if (!nd->nd_repstat && exp->nes_exflag == 0 &&
 	    !(nd->nd_flag & ND_NFSV4)) {
 		vput(*vpp);
+		*vpp = NULL;
 		nd->nd_repstat = EACCES;
 	}
 
@@ -3166,11 +3174,10 @@ nfsd_fhtovp(struct nfsrv_descript *nd, struct nfsrvfh *nfp, int lktype,
 	if (credanon != NULL)
 		crfree(credanon);
 	if (nd->nd_repstat) {
-		if (startwrite)
-			vn_finished_write(mp);
+		vn_finished_write(mpw);
 		*vpp = NULL;
-		if (mpp != NULL)
-			*mpp = NULL;
+	} else if (mpp != NULL) {
+		*mpp = mpw;
 	}
 
 out:
diff --git a/sys/fs/nfsserver/nfs_nfsdsocket.c b/sys/fs/nfsserver/nfs_nfsdsocket.c
index 718737ec184c..a678e3acfeab 100644
--- a/sys/fs/nfsserver/nfs_nfsdsocket.c
+++ b/sys/fs/nfsserver/nfs_nfsdsocket.c
@@ -543,8 +543,7 @@ nfsrvd_dorpc(struct nfsrv_descript *nd, int isdgram, u_char *tag, int taglen,
 		nfsrvd_statstart(nfsv3to4op[nd->nd_procnum], /*now*/ NULL);
 		nfsrvd_statend(nfsv3to4op[nd->nd_procnum], /*bytes*/ 0,
 		   /*now*/ NULL, /*then*/ NULL);
-		if (mp != NULL && nfsrv_writerpc[nd->nd_procnum] != 0)
-			vn_finished_write(mp);
+		vn_finished_write(mp);
 		goto out;
 	}
 
@@ -574,8 +573,7 @@ nfsrvd_dorpc(struct nfsrv_descript *nd, int isdgram, u_char *tag, int taglen,
 			error = (*(nfsrv3_procs0[nd->nd_procnum]))(nd, isdgram,
 			    vp, p, &nes);
 		}
-		if (mp != NULL && nfsrv_writerpc[nd->nd_procnum] != 0)
-			vn_finished_write(mp);
+		vn_finished_write(mp);
 
 		nfsrvd_statend(nfsv3to4op[nd->nd_procnum], /*bytes*/ 0,
 		    /*now*/ NULL, /*then*/ &start_time);


More information about the dev-commits-src-all mailing list