diff options
author | Jan Schmidt <list.btrfs@jan-o-sch.net> | 2013-05-28 11:47:23 -0400 |
---|---|---|
committer | Josef Bacik <jbacik@fusionio.com> | 2013-06-14 11:30:08 -0400 |
commit | eb1716af887375f1e2099f69bb89dfc5bd169bfa (patch) | |
tree | 634461e97227d6d75b3e05f47567bd1d1478beb2 /fs/btrfs/qgroup.c | |
parent | 4373519db4dbca05341a60b28f6e159b106e4c4b (diff) |
Btrfs: avoid double free of fs_info->qgroup_ulist
When btrfs_read_qgroup_config or btrfs_quota_enable return non-zero, we've
already freed the fs_info->qgroup_ulist. The final btrfs_free_qgroup_config
called from quota_disable makes another ulist_free(fs_info->qgroup_ulist)
call.
We set fs_info->qgroup_ulist to NULL on the mentioned error paths, turning
the ulist_free in btrfs_free_qgroup_config into a noop.
Cc: Wang Shilong <wangsl-fnst@cn.fujitsu.com>
Signed-off-by: Jan Schmidt <list.btrfs@jan-o-sch.net>
Signed-off-by: Josef Bacik <jbacik@fusionio.com>
Diffstat (limited to 'fs/btrfs/qgroup.c')
-rw-r--r-- | fs/btrfs/qgroup.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c index 74b432d0b703..c6ce64276869 100644 --- a/fs/btrfs/qgroup.c +++ b/fs/btrfs/qgroup.c | |||
@@ -430,8 +430,10 @@ out: | |||
430 | } | 430 | } |
431 | btrfs_free_path(path); | 431 | btrfs_free_path(path); |
432 | 432 | ||
433 | if (ret < 0) | 433 | if (ret < 0) { |
434 | ulist_free(fs_info->qgroup_ulist); | 434 | ulist_free(fs_info->qgroup_ulist); |
435 | fs_info->qgroup_ulist = NULL; | ||
436 | } | ||
435 | 437 | ||
436 | return ret < 0 ? ret : 0; | 438 | return ret < 0 ? ret : 0; |
437 | } | 439 | } |
@@ -932,8 +934,10 @@ out_free_root: | |||
932 | kfree(quota_root); | 934 | kfree(quota_root); |
933 | } | 935 | } |
934 | out: | 936 | out: |
935 | if (ret) | 937 | if (ret) { |
936 | ulist_free(fs_info->qgroup_ulist); | 938 | ulist_free(fs_info->qgroup_ulist); |
939 | fs_info->qgroup_ulist = NULL; | ||
940 | } | ||
937 | mutex_unlock(&fs_info->qgroup_ioctl_lock); | 941 | mutex_unlock(&fs_info->qgroup_ioctl_lock); |
938 | return ret; | 942 | return ret; |
939 | } | 943 | } |