summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorLiu Bo <bo.li.liu@oracle.com>2012-11-05 12:42:09 +0000
committerJosef Bacik <jbacik@fusionio.com>2012-12-12 17:15:25 -0500
commit109f2365f1928af241b2ccbd0f6ba0b93d911288 (patch)
tree60be3ee8c1154534a691c8136ce3e39e69c7cc00 /fs
parent37c4146d2208ba7e4463e8dd95a1bf9e3d865280 (diff)
downloadtalos-op-linux-109f2365f1928af241b2ccbd0f6ba0b93d911288.tar.gz
talos-op-linux-109f2365f1928af241b2ccbd0f6ba0b93d911288.zip
Btrfs: fix a double free on pending snapshots in error handling
When creating a snapshot, failing to commit a transaction can end up with aborting the transaction, following by doing a cleanup for it, where we'll free all snapshots pending to disk. So we check it and avoid double free on pending snapshots. Signed-off-by: Liu Bo <bo.li.liu@oracle.com> Signed-off-by: Chris Mason <chris.mason@fusionio.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/btrfs/ioctl.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index 14c0d2e0790c..e262cd8c4a7d 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -571,8 +571,12 @@ static int create_snapshot(struct btrfs_root *root, struct dentry *dentry,
ret = btrfs_commit_transaction(trans,
root->fs_info->extent_root);
}
- if (ret)
+ if (ret) {
+ /* cleanup_transaction has freed this for us */
+ if (trans->aborted)
+ pending_snapshot = NULL;
goto fail;
+ }
ret = pending_snapshot->error;
if (ret)
OpenPOWER on IntegriCloud