git: d5c176ad6a7b - stable/12 - nfsd: Fix handling of Open/Create for the pNFS server
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 20 May 2022 21:01:09 UTC
The branch stable/12 has been updated by rmacklem: URL: https://cgit.FreeBSD.org/src/commit/?id=d5c176ad6a7b0cd78e3b893284b292e18ecb804f commit d5c176ad6a7b0cd78e3b893284b292e18ecb804f Author: Rick Macklem <rmacklem@FreeBSD.org> AuthorDate: 2022-05-04 20:52:33 +0000 Commit: Rick Macklem <rmacklem@FreeBSD.org> CommitDate: 2022-05-20 20:57:49 +0000 nfsd: Fix handling of Open/Create for the pNFS server When the MDS of a pNFS service receives an Open/Create and the file already exists, it must do a Setattr of size == 0. Without this patch, this was eroneously done via a VOP_SETAATR() call, which would set the length of the MDS file to 0 (which is already is, since all data lives on the DSs). This patch fixes the problem by doing a nfsvno_setattr() instead of VOP_SETATTR(), which knows to do a proxied Setattr on the DSs. For a non-pNFS server, the change has no effect, since nfsvno_setattr() only does a VOP_SETATTR() for that case. This was found during a recent IETF NFSv4 testing event. (cherry picked from commit f32bf50d43be1e898cebf751ce749b07d1301b8f) --- sys/fs/nfsserver/nfs_nfsdport.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sys/fs/nfsserver/nfs_nfsdport.c b/sys/fs/nfsserver/nfs_nfsdport.c index 0f3852318068..a76f0ff0554c 100644 --- a/sys/fs/nfsserver/nfs_nfsdport.c +++ b/sys/fs/nfsserver/nfs_nfsdport.c @@ -1044,8 +1044,8 @@ nfsvno_createsub(struct nfsrv_descript *nd, struct nameidata *ndp, tempsize = nvap->na_size; NFSVNO_ATTRINIT(nvap); nvap->na_size = tempsize; - error = VOP_SETATTR(*vpp, - &nvap->na_vattr, nd->nd_cred); + error = nfsvno_setattr(*vpp, nvap, + nd->nd_cred, p, exp); } } if (error) @@ -1709,8 +1709,8 @@ nfsvno_open(struct nfsrv_descript *nd, struct nameidata *ndp, tempsize = nvap->na_size; NFSVNO_ATTRINIT(nvap); nvap->na_size = tempsize; - nd->nd_repstat = VOP_SETATTR(vp, - &nvap->na_vattr, cred); + nd->nd_repstat = nfsvno_setattr(vp, + nvap, cred, p, exp); } } else if (vp->v_type == VREG) { nd->nd_repstat = nfsrv_opencheck(clientid,