Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 27 Feb 2025 02:32:23 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: 8ac895f924e7 - stable/14 - nfscl: Fix setting of mtime for the NFSv4.n client
Message-ID:  <202502270232.51R2WN9R004151@gitrepo.freebsd.org>

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

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

commit 8ac895f924e719be32a6173e06a6ee5d3e507932
Author:     Rick Macklem <rmacklem@FreeBSD.org>
AuthorDate: 2025-02-24 20:58:27 +0000
Commit:     Rick Macklem <rmacklem@FreeBSD.org>
CommitDate: 2025-02-27 02:31:01 +0000

    nfscl: Fix setting of mtime for the NFSv4.n client
    
    It was reported on freebsd-fs@ that unrolling a tarball
    failed to set the correct modify time if delegations
    were being issued.
    
    This patch fixes the problem.
    
    This bug only affects NFSv4 mounts where delegations
    are being issued.  Not running the nfscbd or disabling
    delegations on the NFSv4 server avoids the problem.
    
    (cherry picked from commit b616d997cb48eaafe13069eecd95f0495b2358eb)
---
 sys/fs/nfs/nfs_var.h           | 2 +-
 sys/fs/nfsclient/nfs_clstate.c | 7 +++++--
 sys/fs/nfsclient/nfs_clvnops.c | 4 +++-
 3 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/sys/fs/nfs/nfs_var.h b/sys/fs/nfs/nfs_var.h
index 950e0c097457..c726d956fee2 100644
--- a/sys/fs/nfs/nfs_var.h
+++ b/sys/fs/nfs/nfs_var.h
@@ -626,7 +626,7 @@ int nfscl_renamedeleg(vnode_t, nfsv4stateid_t *, int *, vnode_t,
     nfsv4stateid_t *, int *, NFSPROC_T *);
 void nfscl_reclaimnode(vnode_t);
 void nfscl_newnode(vnode_t);
-void nfscl_delegmodtime(vnode_t);
+void nfscl_delegmodtime(struct vnode *, struct timespec *);
 void nfscl_deleggetmodtime(vnode_t, struct timespec *);
 int nfscl_trydelegreturn(struct nfscldeleg *, struct ucred *,
     struct nfsmount *, NFSPROC_T *);
diff --git a/sys/fs/nfsclient/nfs_clstate.c b/sys/fs/nfsclient/nfs_clstate.c
index 0a1eb51e279f..a666792c17f9 100644
--- a/sys/fs/nfsclient/nfs_clstate.c
+++ b/sys/fs/nfsclient/nfs_clstate.c
@@ -5104,7 +5104,7 @@ nfscl_newnode(vnode_t vp)
  * to the local clock time.
  */
 void
-nfscl_delegmodtime(vnode_t vp)
+nfscl_delegmodtime(struct vnode *vp, struct timespec *mtime)
 {
 	struct nfsclclient *clp;
 	struct nfscldeleg *dp;
@@ -5128,7 +5128,10 @@ nfscl_delegmodtime(vnode_t vp)
 	}
 	dp = nfscl_finddeleg(clp, np->n_fhp->nfh_fh, np->n_fhp->nfh_len);
 	if (dp != NULL && (dp->nfsdl_flags & NFSCLDL_WRITE)) {
-		nanotime(&dp->nfsdl_modtime);
+		if (mtime != NULL)
+			dp->nfsdl_modtime = *mtime;
+		else
+			nanotime(&dp->nfsdl_modtime);
 		dp->nfsdl_flags |= NFSCLDL_MODTIMESET;
 	}
 	NFSUNLOCKCLSTATE();
diff --git a/sys/fs/nfsclient/nfs_clvnops.c b/sys/fs/nfsclient/nfs_clvnops.c
index bf24a161b94b..a0bb781e5e5d 100644
--- a/sys/fs/nfsclient/nfs_clvnops.c
+++ b/sys/fs/nfsclient/nfs_clvnops.c
@@ -1120,7 +1120,7 @@ nfs_setattr(struct vop_setattr_args *ap)
 			     * Call nfscl_delegmodtime() to set the modify time
 			     * locally, as required.
 			     */
-			    nfscl_delegmodtime(vp);
+			    nfscl_delegmodtime(vp, NULL);
  			} else
 			    NFSUNLOCKNODE(np);
 			/*
@@ -1158,6 +1158,8 @@ nfs_setattr(struct vop_setattr_args *ap)
 			NFSUNLOCKNODE(np);
 		}
 	}
+	if (vap->va_mtime.tv_sec != VNOVAL && error == 0)
+		nfscl_delegmodtime(vp, &vap->va_mtime);
 	return (error);
 }
 



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