Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 19 Sep 2022 00:51:30 GMT
From:      Rick Macklem <rmacklem@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: fa5a74500544 - stable/12 - nfscl: Allow "nolockd" to work for NFSv4 mounts
Message-ID:  <202209190051.28J0pUF7043740@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch stable/12 has been updated by rmacklem:

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

commit fa5a74500544efa21b32801b2a3734b9f886b4ac
Author:     Rick Macklem <rmacklem@FreeBSD.org>
AuthorDate: 2022-09-04 20:09:33 +0000
Commit:     Rick Macklem <rmacklem@FreeBSD.org>
CommitDate: 2022-09-19 00:47:21 +0000

    nfscl: Allow "nolockd" to work for NFSv4 mounts
    
    Commit 40ada74ee1da modified the NFSv4.1/4.2 client so
    that it would issue a DestroySession to the server when
    all session slots are marked bad.  This handles the
    case where session slots get broken when "intr" or "soft"
    NFSv4 fairly well.1/4.2 mounts are done.
    
    There are two other cases where having an NFSv4.1/4.2
    RPC attempt terminate without completion can leave
    state in a non-determinate condition.
    
    One is file locking RPCs.  If the "nolockd" option is
    used, this avoids file locking RPCs by doing locking
    locally within the client.
    
    The other is Open locks, but since all FreeBSD Open
    locks are done with OPEN_SHARE_DENY_NONE, the locking
    state for these should not be critical.
    
    This patch enables use of "nolockd" for NFSv4 mounts,
    so that it can be combined with "intr" and/or "soft",
    making the latter more usable.
    
    Use of "intr" or "soft" NFSv4 mounts are still not
    recommended, but when combined with "nolockd" should
    now work fairly well.
    
    A man page update will be done as a separate commit.
    
    (cherry picked from commit 33721eb991d868dbcad4726872d95ddd8f04ec27)
---
 sys/fs/nfsclient/nfs_clvfsops.c |  4 ++--
 sys/fs/nfsclient/nfs_clvnops.c  | 51 ++++++++++++++++++++++-------------------
 2 files changed, 29 insertions(+), 26 deletions(-)

diff --git a/sys/fs/nfsclient/nfs_clvfsops.c b/sys/fs/nfsclient/nfs_clvfsops.c
index b839ad347696..f0bd9bd3aeeb 100644
--- a/sys/fs/nfsclient/nfs_clvfsops.c
+++ b/sys/fs/nfsclient/nfs_clvfsops.c
@@ -2027,8 +2027,8 @@ void nfscl_retopts(struct nfsmount *nmp, char *buffer, size_t buflen)
 	    ",noncontigwr", &buf, &blen);
 	nfscl_printopt(nmp, (nmp->nm_flag & (NFSMNT_NOLOCKD | NFSMNT_NFSV4)) ==
 	    0, ",lockd", &buf, &blen);
-	nfscl_printopt(nmp, (nmp->nm_flag & (NFSMNT_NOLOCKD | NFSMNT_NFSV4)) ==
-	    NFSMNT_NOLOCKD, ",nolockd", &buf, &blen);
+	nfscl_printopt(nmp, (nmp->nm_flag & NFSMNT_NOLOCKD) != 0, ",nolockd",
+	    &buf, &blen);
 	nfscl_printopt(nmp, (nmp->nm_flag & NFSMNT_RDIRPLUS) != 0, ",rdirplus",
 	    &buf, &blen);
 	nfscl_printopt(nmp, (nmp->nm_flag & NFSMNT_KERB) == 0, ",sec=sys",
diff --git a/sys/fs/nfsclient/nfs_clvnops.c b/sys/fs/nfsclient/nfs_clvnops.c
index e37827deb723..64386afccb4c 100644
--- a/sys/fs/nfsclient/nfs_clvnops.c
+++ b/sys/fs/nfsclient/nfs_clvnops.c
@@ -3188,11 +3188,37 @@ nfs_advlock(struct vop_advlock_args *ap)
 	struct vattr va;
 	int ret, error = EOPNOTSUPP;
 	u_quad_t size;
+	struct nfsmount *nmp;
 	
 	ret = NFSVOPLOCK(vp, LK_SHARED);
 	if (ret != 0)
 		return (EBADF);
-	if (NFS_ISV4(vp) && (ap->a_flags & (F_POSIX | F_FLOCK)) != 0) {
+	nmp = VFSTONFS(vp->v_mount);
+	if (!NFS_ISV4(vp) || (nmp->nm_flag & NFSMNT_NOLOCKD) != 0) {
+		if ((nmp->nm_flag & NFSMNT_NOLOCKD) != 0) {
+			size = np->n_size;
+			NFSVOPUNLOCK(vp, 0);
+			error = lf_advlock(ap, &(vp->v_lockf), size);
+		} else {
+			if (nfs_advlock_p != NULL)
+				error = nfs_advlock_p(ap);
+			else {
+				NFSVOPUNLOCK(vp, 0);
+				error = ENOLCK;
+			}
+		}
+		if (error == 0 && ap->a_op == F_SETLK) {
+			error = NFSVOPLOCK(vp, LK_SHARED);
+			if (error == 0) {
+				/* Mark that a file lock has been acquired. */
+				NFSLOCKNODE(np);
+				np->n_flag |= NHASBEENLOCKED;
+				NFSUNLOCKNODE(np);
+				NFSVOPUNLOCK(vp, 0);
+			}
+		}
+		return (error);
+	} else if ((ap->a_flags & (F_POSIX | F_FLOCK)) != 0) {
 		if (vp->v_type != VREG) {
 			NFSVOPUNLOCK(vp, 0);
 			return (EINVAL);
@@ -3279,29 +3305,6 @@ nfs_advlock(struct vop_advlock_args *ap)
 		}
 		NFSVOPUNLOCK(vp, 0);
 		return (0);
-	} else if (!NFS_ISV4(vp)) {
-		if ((VFSTONFS(vp->v_mount)->nm_flag & NFSMNT_NOLOCKD) != 0) {
-			size = VTONFS(vp)->n_size;
-			NFSVOPUNLOCK(vp, 0);
-			error = lf_advlock(ap, &(vp->v_lockf), size);
-		} else {
-			if (nfs_advlock_p != NULL)
-				error = nfs_advlock_p(ap);
-			else {
-				NFSVOPUNLOCK(vp, 0);
-				error = ENOLCK;
-			}
-		}
-		if (error == 0 && ap->a_op == F_SETLK) {
-			error = NFSVOPLOCK(vp, LK_SHARED);
-			if (error == 0) {
-				/* Mark that a file lock has been acquired. */
-				NFSLOCKNODE(np);
-				np->n_flag |= NHASBEENLOCKED;
-				NFSUNLOCKNODE(np);
-				NFSVOPUNLOCK(vp, 0);
-			}
-		}
 	} else
 		NFSVOPUNLOCK(vp, 0);
 	return (error);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202209190051.28J0pUF7043740>