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))
|
||||
return nfserrno(host_err);
|
||||
err = fh_compose(resfhp, fhp->fh_export, dchild, fhp);
|
||||
if (err) {
|
||||
dput(dchild);
|
||||
/*
|
||||
* We unconditionally drop our ref to dchild as fh_compose will have
|
||||
* already grabbed its own ref for it.
|
||||
*/
|
||||
dput(dchild);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
return nfsd_create_locked(rqstp, fhp, fname, flen, iap, type,
|
||||
rdev, resfhp);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue