diff options
author | Filipe Manana <fdmanana@suse.com> | 2016-01-05 16:24:05 +0000 |
---|---|---|
committer | Sasha Levin <sasha.levin@oracle.com> | 2016-04-13 17:14:21 -0400 |
commit | 9bf972e8aa6110d750cf1ddab68511f478a6a751 (patch) | |
tree | bb1e7d998ed8a91ec5f165b41ccecb8f55f82214 /fs | |
parent | a1f535acffbd95ae6ae81656e8bba39af094c3f0 (diff) | |
download | lwn-9bf972e8aa6110d750cf1ddab68511f478a6a751.tar.gz lwn-9bf972e8aa6110d750cf1ddab68511f478a6a751.zip |
Btrfs: fix transaction handle leak on failure to create hard link
[ Upstream commit 271dba4521aed0c37c063548f876b49f5cd64b2e ]
If we failed to create a hard link we were not always releasing the
the transaction handle we got before, resulting in a memory leak and
preventing any other tasks from being able to commit the current
transaction.
Fix this by always releasing our transaction handle.
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: Liu Bo <bo.li.liu@oracle.com>
Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/btrfs/inode.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 62af0d3b0e4f..f751ab47e9a5 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -6421,7 +6421,7 @@ out_unlock_inode: static int btrfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry) { - struct btrfs_trans_handle *trans; + struct btrfs_trans_handle *trans = NULL; struct btrfs_root *root = BTRFS_I(dir)->root; struct inode *inode = d_inode(old_dentry); u64 index; @@ -6447,6 +6447,7 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir, trans = btrfs_start_transaction(root, 5); if (IS_ERR(trans)) { err = PTR_ERR(trans); + trans = NULL; goto fail; } @@ -6480,9 +6481,10 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir, btrfs_log_new_name(trans, inode, NULL, parent); } - btrfs_end_transaction(trans, root); btrfs_balance_delayed_items(root); fail: + if (trans) + btrfs_end_transaction(trans, root); if (drop_inode) { inode_dec_link_count(inode); iput(inode); |