diff options
author | Jeff Layton <jlayton@kernel.org> | 2021-06-18 13:05:06 -0400 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2021-06-29 00:15:52 +0200 |
commit | 4c18347238ab5a4ee0e71ca765460d84c75a26b5 (patch) | |
tree | b6ab8e47ccb7d6e50ea4a5ccdf4aba6bd50133b1 /fs/ceph/mds_client.c | |
parent | 23c2c76ead541b3b7c9336bd4f3737494736b2ee (diff) | |
download | lwn-4c18347238ab5a4ee0e71ca765460d84c75a26b5.tar.gz lwn-4c18347238ab5a4ee0e71ca765460d84c75a26b5.zip |
ceph: take reference to req->r_parent at point of assignment
Currently, we set the r_parent pointer but then don't take a reference
to it until we submit the request. If we end up freeing the req before
that point, then we'll do a iput when we shouldn't.
Instead, take the inode reference in the callers, so that it's always
safe to call ceph_mdsc_put_request on the req, even before submission.
Signed-off-by: Jeff Layton <jlayton@kernel.org>
Reviewed-by: Luis Henriques <lhenriques@suse.de>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Diffstat (limited to 'fs/ceph/mds_client.c')
-rw-r--r-- | fs/ceph/mds_client.c | 1 |
1 files changed, 0 insertions, 1 deletions
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index f8a7fbf81980..a818213c972f 100644 --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c @@ -2982,7 +2982,6 @@ int ceph_mdsc_submit_request(struct ceph_mds_client *mdsc, struct inode *dir, ceph_take_cap_refs(ci, CEPH_CAP_PIN, false); __ceph_touch_fmode(ci, mdsc, fmode); spin_unlock(&ci->i_ceph_lock); - ihold(req->r_parent); } if (req->r_old_dentry_dir) ceph_get_cap_refs(ceph_inode(req->r_old_dentry_dir), |