git: d5c176ad6a7b - stable/12 - nfsd: Fix handling of Open/Create for the pNFS server

From: Rick Macklem <rmacklem_at_FreeBSD.org>
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,