nfsd: fix dentry refcounting on create
b44061d0b9
introduced a dentry ref counting bug. Previously we were grabbing one ref to dchild in nfsd_create(), but with the creation of nfsd_create_locked() we have a ref for dchild from the lookup in nfsd_create(), and then another ref in nfsd_create_locked(). The ref from the lookup in nfsd_create() is never dropped and results in dentries still in use at unmount. Signed-off-by: Josef Bacik <jbacik@fb.com> Fixes:b44061d0b9
"nfsd: reorganize nfsd_create" Reported-by: kernel test robot <xiaolong.ye@intel.com> Reviewed-by: Jeff Layton <jlayton@redhat.com> Acked-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
parent
29b4817d40
commit
502aa0a5be
|
@ -1252,10 +1252,13 @@ nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
||||||
if (IS_ERR(dchild))
|
if (IS_ERR(dchild))
|
||||||
return nfserrno(host_err);
|
return nfserrno(host_err);
|
||||||
err = fh_compose(resfhp, fhp->fh_export, dchild, fhp);
|
err = fh_compose(resfhp, fhp->fh_export, dchild, fhp);
|
||||||
if (err) {
|
/*
|
||||||
|
* We unconditionally drop our ref to dchild as fh_compose will have
|
||||||
|
* already grabbed its own ref for it.
|
||||||
|
*/
|
||||||
dput(dchild);
|
dput(dchild);
|
||||||
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
}
|
|
||||||
return nfsd_create_locked(rqstp, fhp, fname, flen, iap, type,
|
return nfsd_create_locked(rqstp, fhp, fname, flen, iap, type,
|
||||||
rdev, resfhp);
|
rdev, resfhp);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue