aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/fs/nfs/nfs_var.h2
-rw-r--r--sys/fs/nfsclient/nfs_clstate.c7
-rw-r--r--sys/fs/nfsclient/nfs_clvnops.c4
3 files changed, 9 insertions, 4 deletions
diff --git a/sys/fs/nfs/nfs_var.h b/sys/fs/nfs/nfs_var.h
index 083a974516b0..b5e2cd78749e 100644
--- a/sys/fs/nfs/nfs_var.h
+++ b/sys/fs/nfs/nfs_var.h
@@ -622,7 +622,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_tryclose(struct nfsclopen *, struct ucred *,
struct nfsmount *, NFSPROC_T *, bool);
diff --git a/sys/fs/nfsclient/nfs_clstate.c b/sys/fs/nfsclient/nfs_clstate.c
index 9ab0a29e9c5d..282e9e39536f 100644
--- a/sys/fs/nfsclient/nfs_clstate.c
+++ b/sys/fs/nfsclient/nfs_clstate.c
@@ -5083,7 +5083,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;
@@ -5107,7 +5107,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 38a2f6c8f4f1..f4569068972f 100644
--- a/sys/fs/nfsclient/nfs_clvnops.c
+++ b/sys/fs/nfsclient/nfs_clvnops.c
@@ -1119,7 +1119,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);
/*
@@ -1157,6 +1157,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);
}