aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/qgroup.c
diff options
context:
space:
mode:
authorJan Schmidt <list.btrfs@jan-o-sch.net>2013-05-28 11:47:23 -0400
committerJosef Bacik <jbacik@fusionio.com>2013-06-14 11:30:08 -0400
commiteb1716af887375f1e2099f69bb89dfc5bd169bfa (patch)
tree634461e97227d6d75b3e05f47567bd1d1478beb2 /fs/btrfs/qgroup.c
parent4373519db4dbca05341a60b28f6e159b106e4c4b (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.c8
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 }
934out: 936out:
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}