If the VOP_SETATTR() call that saves the exclusive create verifier failed,
the NFS server would leave the newly created vnode locked. This could result in a file system that would not unmount and processes wedged, waiting for the file to be unlocked. Since this VOP_SETATTR() never fails for most file systems, this bug doesn't normally manifest itself. I found it during testing of an exported GlusterFS file system, which can fail. This patch adds the vput() and changes the error to the correct NFS one. MFC after: 2 weeks
This commit is contained in:
parent
2a0941fb20
commit
c78bfcfb8f
@ -794,6 +794,11 @@ nfsvno_createsub(struct nfsrv_descript *nd, struct nameidata *ndp,
|
||||
nvap->na_atime.tv_nsec = cverf[1];
|
||||
error = VOP_SETATTR(ndp->ni_vp,
|
||||
&nvap->na_vattr, nd->nd_cred);
|
||||
if (error != 0) {
|
||||
vput(ndp->ni_vp);
|
||||
ndp->ni_vp = NULL;
|
||||
error = NFSERR_NOTSUPP;
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
@ -1422,6 +1427,11 @@ nfsvno_open(struct nfsrv_descript *nd, struct nameidata *ndp,
|
||||
nvap->na_atime.tv_nsec = cverf[1];
|
||||
nd->nd_repstat = VOP_SETATTR(ndp->ni_vp,
|
||||
&nvap->na_vattr, cred);
|
||||
if (nd->nd_repstat != 0) {
|
||||
vput(ndp->ni_vp);
|
||||
ndp->ni_vp = NULL;
|
||||
nd->nd_repstat = NFSERR_NOTSUPP;
|
||||
}
|
||||
} else {
|
||||
nfsrv_fixattr(nd, ndp->ni_vp, nvap,
|
||||
aclp, p, attrbitp, exp);
|
||||
|
Loading…
Reference in New Issue
Block a user