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. MFC after: 2 weeks
This commit is contained in:
parent
913616b885
commit
f32bf50d43
@ -1260,8 +1260,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)
|
||||
@ -1930,8 +1930,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,
|
||||
|
Loading…
Reference in New Issue
Block a user