The branch stable/13 has been updated by rmacklem:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=9ac4d1af5a758fa49693ce4e09a2232f1175c9bd

commit 9ac4d1af5a758fa49693ce4e09a2232f1175c9bd
Author:     Rick Macklem <rmack...@freebsd.org>
AuthorDate: 2022-05-04 20:52:33 +0000
Commit:     Rick Macklem <rmack...@freebsd.org>
CommitDate: 2022-05-20 20:50:02 +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 70243fa7ed2f..c25edf64094e 100644
--- a/sys/fs/nfsserver/nfs_nfsdport.c
+++ b/sys/fs/nfsserver/nfs_nfsdport.c
@@ -1259,8 +1259,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)
@@ -1929,8 +1929,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,

Reply via email to