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>
This commit is contained in:
@@ -430,8 +430,10 @@ out:
|
|||||||
}
|
}
|
||||||
btrfs_free_path(path);
|
btrfs_free_path(path);
|
||||||
|
|
||||||
if (ret < 0)
|
if (ret < 0) {
|
||||||
ulist_free(fs_info->qgroup_ulist);
|
ulist_free(fs_info->qgroup_ulist);
|
||||||
|
fs_info->qgroup_ulist = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
return ret < 0 ? ret : 0;
|
return ret < 0 ? ret : 0;
|
||||||
}
|
}
|
||||||
@@ -932,8 +934,10 @@ out_free_root:
|
|||||||
kfree(quota_root);
|
kfree(quota_root);
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
if (ret)
|
if (ret) {
|
||||||
ulist_free(fs_info->qgroup_ulist);
|
ulist_free(fs_info->qgroup_ulist);
|
||||||
|
fs_info->qgroup_ulist = NULL;
|
||||||
|
}
|
||||||
mutex_unlock(&fs_info->qgroup_ioctl_lock);
|
mutex_unlock(&fs_info->qgroup_ioctl_lock);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user