ceph: fix inode reference leakage in ceph_get_snapdir()
[ Upstream commit 322794d3355c33adcc4feace0045d85a8e4ed813 ] The ceph_get_inode() will search for or insert a new inode into the hash for the given vino, and return a reference to it. If new is non-NULL, its reference is consumed. We should release the reference when in error handing cases. Signed-off-by: Xiubo Li <xiubli@redhat.com> Reviewed-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Ilya Dryomov <idryomov@gmail.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
eb0e7173d9
commit
3ae7163598
@@ -87,13 +87,13 @@ struct inode *ceph_get_snapdir(struct inode *parent)
|
||||
if (!S_ISDIR(parent->i_mode)) {
|
||||
pr_warn_once("bad snapdir parent type (mode=0%o)\n",
|
||||
parent->i_mode);
|
||||
return ERR_PTR(-ENOTDIR);
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (!(inode->i_state & I_NEW) && !S_ISDIR(inode->i_mode)) {
|
||||
pr_warn_once("bad snapdir inode type (mode=0%o)\n",
|
||||
inode->i_mode);
|
||||
return ERR_PTR(-ENOTDIR);
|
||||
goto err;
|
||||
}
|
||||
|
||||
inode->i_mode = parent->i_mode;
|
||||
@@ -113,6 +113,12 @@ struct inode *ceph_get_snapdir(struct inode *parent)
|
||||
}
|
||||
|
||||
return inode;
|
||||
err:
|
||||
if ((inode->i_state & I_NEW))
|
||||
discard_new_inode(inode);
|
||||
else
|
||||
iput(inode);
|
||||
return ERR_PTR(-ENOTDIR);
|
||||
}
|
||||
|
||||
const struct inode_operations ceph_file_iops = {
|
||||
|
||||
Reference in New Issue
Block a user