btrfs: qgroup: fix quota disable during rescan
There's a race condition that leads to a NULL pointer dereference if you disable quotas while a quota rescan is running. To fix this, we just need to wait for the quota rescan worker to actually exit before tearing down the quota structures. Signed-off-by: Justin Maggard <jmaggard@netgear.com> Signed-off-by: Chris Mason <clm@fb.com>
This commit is contained in:
parent
036a9348dc
commit
967ef5131e
1 changed files with 2 additions and 1 deletions
|
@ -993,9 +993,10 @@ int btrfs_quota_disable(struct btrfs_trans_handle *trans,
|
||||||
mutex_lock(&fs_info->qgroup_ioctl_lock);
|
mutex_lock(&fs_info->qgroup_ioctl_lock);
|
||||||
if (!fs_info->quota_root)
|
if (!fs_info->quota_root)
|
||||||
goto out;
|
goto out;
|
||||||
spin_lock(&fs_info->qgroup_lock);
|
|
||||||
fs_info->quota_enabled = 0;
|
fs_info->quota_enabled = 0;
|
||||||
fs_info->pending_quota_state = 0;
|
fs_info->pending_quota_state = 0;
|
||||||
|
btrfs_qgroup_wait_for_completion(fs_info);
|
||||||
|
spin_lock(&fs_info->qgroup_lock);
|
||||||
quota_root = fs_info->quota_root;
|
quota_root = fs_info->quota_root;
|
||||||
fs_info->quota_root = NULL;
|
fs_info->quota_root = NULL;
|
||||||
fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_ON;
|
fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_ON;
|
||||||
|
|
Loading…
Add table
Reference in a new issue