|
@@ -309,7 +309,7 @@ int btrfs_read_qgroup_config(struct btrfs_fs_info *fs_info)
|
|
|
u64 flags = 0;
|
|
|
u64 rescan_progress = 0;
|
|
|
|
|
|
- if (!fs_info->quota_enabled)
|
|
|
+ if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags))
|
|
|
return 0;
|
|
|
|
|
|
fs_info->qgroup_ulist = ulist_alloc(GFP_NOFS);
|
|
@@ -463,13 +463,11 @@ next2:
|
|
|
}
|
|
|
out:
|
|
|
fs_info->qgroup_flags |= flags;
|
|
|
- if (!(fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_ON)) {
|
|
|
- fs_info->quota_enabled = 0;
|
|
|
- fs_info->pending_quota_state = 0;
|
|
|
- } else if (fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_RESCAN &&
|
|
|
- ret >= 0) {
|
|
|
+ if (!(fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_ON))
|
|
|
+ clear_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags);
|
|
|
+ else if (fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_RESCAN &&
|
|
|
+ ret >= 0)
|
|
|
ret = qgroup_rescan_init(fs_info, rescan_progress, 0);
|
|
|
- }
|
|
|
btrfs_free_path(path);
|
|
|
|
|
|
if (ret < 0) {
|
|
@@ -847,7 +845,7 @@ static int btrfs_clean_quota_tree(struct btrfs_trans_handle *trans,
|
|
|
}
|
|
|
ret = 0;
|
|
|
out:
|
|
|
- root->fs_info->pending_quota_state = 0;
|
|
|
+ set_bit(BTRFS_FS_QUOTA_DISABLING, &root->fs_info->flags);
|
|
|
btrfs_free_path(path);
|
|
|
return ret;
|
|
|
}
|
|
@@ -868,7 +866,7 @@ int btrfs_quota_enable(struct btrfs_trans_handle *trans,
|
|
|
|
|
|
mutex_lock(&fs_info->qgroup_ioctl_lock);
|
|
|
if (fs_info->quota_root) {
|
|
|
- fs_info->pending_quota_state = 1;
|
|
|
+ set_bit(BTRFS_FS_QUOTA_ENABLING, &fs_info->flags);
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
@@ -964,7 +962,7 @@ out_add_root:
|
|
|
}
|
|
|
spin_lock(&fs_info->qgroup_lock);
|
|
|
fs_info->quota_root = quota_root;
|
|
|
- fs_info->pending_quota_state = 1;
|
|
|
+ set_bit(BTRFS_FS_QUOTA_ENABLING, &fs_info->flags);
|
|
|
spin_unlock(&fs_info->qgroup_lock);
|
|
|
out_free_path:
|
|
|
btrfs_free_path(path);
|
|
@@ -993,8 +991,8 @@ int btrfs_quota_disable(struct btrfs_trans_handle *trans,
|
|
|
mutex_lock(&fs_info->qgroup_ioctl_lock);
|
|
|
if (!fs_info->quota_root)
|
|
|
goto out;
|
|
|
- fs_info->quota_enabled = 0;
|
|
|
- fs_info->pending_quota_state = 0;
|
|
|
+ clear_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags);
|
|
|
+ set_bit(BTRFS_FS_QUOTA_DISABLING, &fs_info->flags);
|
|
|
btrfs_qgroup_wait_for_completion(fs_info, false);
|
|
|
spin_lock(&fs_info->qgroup_lock);
|
|
|
quota_root = fs_info->quota_root;
|
|
@@ -1490,7 +1488,8 @@ int btrfs_qgroup_insert_dirty_extent(struct btrfs_trans_handle *trans,
|
|
|
struct btrfs_delayed_ref_root *delayed_refs;
|
|
|
int ret;
|
|
|
|
|
|
- if (!fs_info->quota_enabled || bytenr == 0 || num_bytes == 0)
|
|
|
+ if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)
|
|
|
+ || bytenr == 0 || num_bytes == 0)
|
|
|
return 0;
|
|
|
if (WARN_ON(trans == NULL))
|
|
|
return -EINVAL;
|
|
@@ -1713,7 +1712,7 @@ btrfs_qgroup_account_extent(struct btrfs_trans_handle *trans,
|
|
|
if (old_roots)
|
|
|
nr_old_roots = old_roots->nnodes;
|
|
|
|
|
|
- if (!fs_info->quota_enabled)
|
|
|
+ if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags))
|
|
|
goto out_free;
|
|
|
BUG_ON(!fs_info->quota_root);
|
|
|
|
|
@@ -1833,10 +1832,14 @@ int btrfs_run_qgroups(struct btrfs_trans_handle *trans,
|
|
|
if (!quota_root)
|
|
|
goto out;
|
|
|
|
|
|
- if (!fs_info->quota_enabled && fs_info->pending_quota_state)
|
|
|
+ if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags) &&
|
|
|
+ test_bit(BTRFS_FS_QUOTA_ENABLING, &fs_info->flags))
|
|
|
start_rescan_worker = 1;
|
|
|
|
|
|
- fs_info->quota_enabled = fs_info->pending_quota_state;
|
|
|
+ if (test_and_clear_bit(BTRFS_FS_QUOTA_ENABLING, &fs_info->flags))
|
|
|
+ set_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags);
|
|
|
+ if (test_and_clear_bit(BTRFS_FS_QUOTA_DISABLING, &fs_info->flags))
|
|
|
+ clear_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags);
|
|
|
|
|
|
spin_lock(&fs_info->qgroup_lock);
|
|
|
while (!list_empty(&fs_info->dirty_qgroups)) {
|
|
@@ -1855,7 +1858,7 @@ int btrfs_run_qgroups(struct btrfs_trans_handle *trans,
|
|
|
BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT;
|
|
|
spin_lock(&fs_info->qgroup_lock);
|
|
|
}
|
|
|
- if (fs_info->quota_enabled)
|
|
|
+ if (test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags))
|
|
|
fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_ON;
|
|
|
else
|
|
|
fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_ON;
|
|
@@ -1900,7 +1903,7 @@ int btrfs_qgroup_inherit(struct btrfs_trans_handle *trans,
|
|
|
u64 nums;
|
|
|
|
|
|
mutex_lock(&fs_info->qgroup_ioctl_lock);
|
|
|
- if (!fs_info->quota_enabled)
|
|
|
+ if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags))
|
|
|
goto out;
|
|
|
|
|
|
if (!quota_root) {
|
|
@@ -2347,7 +2350,7 @@ static void btrfs_qgroup_rescan_worker(struct btrfs_work *work)
|
|
|
err = PTR_ERR(trans);
|
|
|
break;
|
|
|
}
|
|
|
- if (!fs_info->quota_enabled) {
|
|
|
+ if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) {
|
|
|
err = -EINTR;
|
|
|
} else {
|
|
|
err = qgroup_rescan_leaf(fs_info, path, trans);
|
|
@@ -2578,8 +2581,8 @@ int btrfs_qgroup_reserve_data(struct inode *inode, u64 start, u64 len)
|
|
|
struct ulist_iterator uiter;
|
|
|
int ret;
|
|
|
|
|
|
- if (!root->fs_info->quota_enabled || !is_fstree(root->objectid) ||
|
|
|
- len == 0)
|
|
|
+ if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &root->fs_info->flags) ||
|
|
|
+ !is_fstree(root->objectid) || len == 0)
|
|
|
return 0;
|
|
|
|
|
|
changeset.bytes_changed = 0;
|
|
@@ -2676,8 +2679,8 @@ int btrfs_qgroup_reserve_meta(struct btrfs_root *root, int num_bytes)
|
|
|
{
|
|
|
int ret;
|
|
|
|
|
|
- if (!root->fs_info->quota_enabled || !is_fstree(root->objectid) ||
|
|
|
- num_bytes == 0)
|
|
|
+ if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &root->fs_info->flags) ||
|
|
|
+ !is_fstree(root->objectid) || num_bytes == 0)
|
|
|
return 0;
|
|
|
|
|
|
BUG_ON(num_bytes != round_down(num_bytes, root->nodesize));
|
|
@@ -2692,7 +2695,8 @@ void btrfs_qgroup_free_meta_all(struct btrfs_root *root)
|
|
|
{
|
|
|
int reserved;
|
|
|
|
|
|
- if (!root->fs_info->quota_enabled || !is_fstree(root->objectid))
|
|
|
+ if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &root->fs_info->flags) ||
|
|
|
+ !is_fstree(root->objectid))
|
|
|
return;
|
|
|
|
|
|
reserved = atomic_xchg(&root->qgroup_meta_rsv, 0);
|
|
@@ -2703,7 +2707,8 @@ void btrfs_qgroup_free_meta_all(struct btrfs_root *root)
|
|
|
|
|
|
void btrfs_qgroup_free_meta(struct btrfs_root *root, int num_bytes)
|
|
|
{
|
|
|
- if (!root->fs_info->quota_enabled || !is_fstree(root->objectid))
|
|
|
+ if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &root->fs_info->flags) ||
|
|
|
+ !is_fstree(root->objectid))
|
|
|
return;
|
|
|
|
|
|
BUG_ON(num_bytes != round_down(num_bytes, root->nodesize));
|