Commit 8696c533 authored by Miao Xie's avatar Miao Xie Committed by Josef Bacik

Btrfs: fix memory leak of pending_snapshot->inherit

The argument "inherit" of btrfs_ioctl_snap_create_transid() was assigned
to NULL during we created the snapshots, so we didn't free it though we
called kfree() in the caller.

But since we are sure the snapshot creation is done after the function -
btrfs_ioctl_snap_create_transid() - completes, it is safe that we don't
assign the pointer "inherit" to NULL, and just free it in the caller of
btrfs_ioctl_snap_create_transid(). In this way, the code can become more
readable.
Reported-by: default avatarAlex Lyakas <alex.btrfs@zadarastorage.com>
Cc: Arne Jansen <sensille@gmx.net>
Signed-off-by: default avatarMiao Xie <miaox@cn.fujitsu.com>
Signed-off-by: default avatarJosef Bacik <jbacik@fusionio.com>
parent 2b8195bb
...@@ -367,7 +367,7 @@ static noinline int create_subvol(struct btrfs_root *root, ...@@ -367,7 +367,7 @@ static noinline int create_subvol(struct btrfs_root *root,
struct dentry *dentry, struct dentry *dentry,
char *name, int namelen, char *name, int namelen,
u64 *async_transid, u64 *async_transid,
struct btrfs_qgroup_inherit **inherit) struct btrfs_qgroup_inherit *inherit)
{ {
struct btrfs_trans_handle *trans; struct btrfs_trans_handle *trans;
struct btrfs_key key; struct btrfs_key key;
...@@ -401,8 +401,7 @@ static noinline int create_subvol(struct btrfs_root *root, ...@@ -401,8 +401,7 @@ static noinline int create_subvol(struct btrfs_root *root,
if (IS_ERR(trans)) if (IS_ERR(trans))
return PTR_ERR(trans); return PTR_ERR(trans);
ret = btrfs_qgroup_inherit(trans, root->fs_info, 0, objectid, ret = btrfs_qgroup_inherit(trans, root->fs_info, 0, objectid, inherit);
inherit ? *inherit : NULL);
if (ret) if (ret)
goto fail; goto fail;
...@@ -533,7 +532,7 @@ static noinline int create_subvol(struct btrfs_root *root, ...@@ -533,7 +532,7 @@ static noinline int create_subvol(struct btrfs_root *root,
static int create_snapshot(struct btrfs_root *root, struct dentry *dentry, static int create_snapshot(struct btrfs_root *root, struct dentry *dentry,
char *name, int namelen, u64 *async_transid, char *name, int namelen, u64 *async_transid,
bool readonly, struct btrfs_qgroup_inherit **inherit) bool readonly, struct btrfs_qgroup_inherit *inherit)
{ {
struct inode *inode; struct inode *inode;
struct btrfs_pending_snapshot *pending_snapshot; struct btrfs_pending_snapshot *pending_snapshot;
...@@ -552,10 +551,7 @@ static int create_snapshot(struct btrfs_root *root, struct dentry *dentry, ...@@ -552,10 +551,7 @@ static int create_snapshot(struct btrfs_root *root, struct dentry *dentry,
pending_snapshot->dentry = dentry; pending_snapshot->dentry = dentry;
pending_snapshot->root = root; pending_snapshot->root = root;
pending_snapshot->readonly = readonly; pending_snapshot->readonly = readonly;
if (inherit) { pending_snapshot->inherit = inherit;
pending_snapshot->inherit = *inherit;
*inherit = NULL; /* take responsibility to free it */
}
trans = btrfs_start_transaction(root->fs_info->extent_root, 6); trans = btrfs_start_transaction(root->fs_info->extent_root, 6);
if (IS_ERR(trans)) { if (IS_ERR(trans)) {
...@@ -695,7 +691,7 @@ static noinline int btrfs_mksubvol(struct path *parent, ...@@ -695,7 +691,7 @@ static noinline int btrfs_mksubvol(struct path *parent,
char *name, int namelen, char *name, int namelen,
struct btrfs_root *snap_src, struct btrfs_root *snap_src,
u64 *async_transid, bool readonly, u64 *async_transid, bool readonly,
struct btrfs_qgroup_inherit **inherit) struct btrfs_qgroup_inherit *inherit)
{ {
struct inode *dir = parent->dentry->d_inode; struct inode *dir = parent->dentry->d_inode;
struct dentry *dentry; struct dentry *dentry;
...@@ -1458,7 +1454,7 @@ static noinline int btrfs_ioctl_resize(struct file *file, ...@@ -1458,7 +1454,7 @@ static noinline int btrfs_ioctl_resize(struct file *file,
static noinline int btrfs_ioctl_snap_create_transid(struct file *file, static noinline int btrfs_ioctl_snap_create_transid(struct file *file,
char *name, unsigned long fd, int subvol, char *name, unsigned long fd, int subvol,
u64 *transid, bool readonly, u64 *transid, bool readonly,
struct btrfs_qgroup_inherit **inherit) struct btrfs_qgroup_inherit *inherit)
{ {
int namelen; int namelen;
int ret = 0; int ret = 0;
...@@ -1567,7 +1563,7 @@ static noinline int btrfs_ioctl_snap_create_v2(struct file *file, ...@@ -1567,7 +1563,7 @@ static noinline int btrfs_ioctl_snap_create_v2(struct file *file,
ret = btrfs_ioctl_snap_create_transid(file, vol_args->name, ret = btrfs_ioctl_snap_create_transid(file, vol_args->name,
vol_args->fd, subvol, ptr, vol_args->fd, subvol, ptr,
readonly, &inherit); readonly, inherit);
if (ret == 0 && ptr && if (ret == 0 && ptr &&
copy_to_user(arg + copy_to_user(arg +
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment