git: 8063dc03202f - main - nfsd: Make Setxattr/Removexattr NFSv4.2 ops IO_SYNC
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sun, 16 Oct 2022 20:28:25 UTC
The branch main has been updated by rmacklem: URL: https://cgit.FreeBSD.org/src/commit/?id=8063dc03202fad7d6bdf34976bc8556fa3f23fa1 commit 8063dc03202fad7d6bdf34976bc8556fa3f23fa1 Author: Rick Macklem <rmacklem@FreeBSD.org> AuthorDate: 2022-10-16 20:27:32 +0000 Commit: Rick Macklem <rmacklem@FreeBSD.org> CommitDate: 2022-10-16 20:27:32 +0000 nfsd: Make Setxattr/Removexattr NFSv4.2 ops IO_SYNC When the NFS server does Setxattr or Removexattr, the operations must be done IO_SYNC. If a server crashes/reboots immediately after replying it must have the extended attribute changes. Since UFS does extended attributes asynchronously by default and there is no "ioflag" argument in the VOP calls, follow the VOP calls with VOP_FSYNC(), to ensure the operation has been done synchronously. This was found by inspection while investigating a bug discovered during a recent IETF NFSv4 testing event, where the Change attribute wasn't changed in the operation reply. This bug will take further work for ZFS and the pNFS server configuration, but is now fixed for a non-pNFS UFS exported file system. MFC after: 1 month --- sys/fs/nfsserver/nfs_nfsdport.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sys/fs/nfsserver/nfs_nfsdport.c b/sys/fs/nfsserver/nfs_nfsdport.c index 8e15237bc10c..f7a97ef04018 100644 --- a/sys/fs/nfsserver/nfs_nfsdport.c +++ b/sys/fs/nfsserver/nfs_nfsdport.c @@ -6776,6 +6776,8 @@ nfsvno_setxattr(struct vnode *vp, char *name, int len, struct mbuf *m, if (error == 0) { error = VOP_SETEXTATTR(vp, EXTATTR_NAMESPACE_USER, name, uiop, cred, p); + if (error == 0) + error = VOP_FSYNC(vp, MNT_WAIT, p); free(iv, M_TEMP); } @@ -6811,6 +6813,8 @@ nfsvno_rmxattr(struct nfsrv_descript *nd, struct vnode *vp, char *name, if (error == EOPNOTSUPP) error = VOP_SETEXTATTR(vp, EXTATTR_NAMESPACE_USER, name, NULL, cred, p); + if (error == 0) + error = VOP_FSYNC(vp, MNT_WAIT, p); out: NFSEXITCODE(error); return (error);