Skip to content

Commit

Permalink
btrfs: qgroup: Switch rescan to new mechanism.
Browse files Browse the repository at this point in the history
Switch rescan to use the new new extent oriented mechanism.

As rescan is also based on extent, new mechanism is just a perfect match
for rescan.

With re-designed internal functions, rescan is quite easy, just call
btrfs_find_all_roots() and then btrfs_qgroup_account_one_extent().

Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
Signed-off-by: Chris Mason <clm@fb.com>
  • Loading branch information
Qu Wenruo authored and Chris Mason committed Jun 10, 2015
1 parent 550d7a2 commit 9d220c9
Showing 1 changed file with 7 additions and 36 deletions.
43 changes: 7 additions & 36 deletions fs/btrfs/qgroup.c
Original file line number Diff line number Diff line change
Expand Up @@ -3002,15 +3002,13 @@ void assert_qgroups_uptodate(struct btrfs_trans_handle *trans)
*/
static int
qgroup_rescan_leaf(struct btrfs_fs_info *fs_info, struct btrfs_path *path,
struct btrfs_trans_handle *trans, struct ulist *qgroups,
struct ulist *tmp, struct extent_buffer *scratch_leaf)
struct btrfs_trans_handle *trans,
struct extent_buffer *scratch_leaf)
{
struct btrfs_key found;
struct ulist *roots = NULL;
struct seq_list tree_mod_seq_elem = SEQ_LIST_INIT(tree_mod_seq_elem);
u64 num_bytes;
u64 seq;
int new_roots;
int slot;
int ret;

Expand Down Expand Up @@ -3060,33 +3058,15 @@ qgroup_rescan_leaf(struct btrfs_fs_info *fs_info, struct btrfs_path *path,
else
num_bytes = found.offset;

ulist_reinit(qgroups);
ret = btrfs_find_all_roots(NULL, fs_info, found.objectid, 0,
&roots);
if (ret < 0)
goto out;
spin_lock(&fs_info->qgroup_lock);
seq = fs_info->qgroup_seq;
fs_info->qgroup_seq += roots->nnodes + 1; /* max refcnt */

new_roots = 0;
ret = qgroup_calc_old_refcnt(fs_info, 0, tmp, roots, qgroups,
seq, &new_roots, 1);
if (ret < 0) {
spin_unlock(&fs_info->qgroup_lock);
ulist_free(roots);
goto out;
}

ret = qgroup_adjust_counters(fs_info, 0, num_bytes, qgroups,
seq, 0, new_roots, 1);
if (ret < 0) {
spin_unlock(&fs_info->qgroup_lock);
ulist_free(roots);
/* For rescan, just pass old_roots as NULL */
ret = btrfs_qgroup_account_extent(trans, fs_info,
found.objectid, num_bytes, NULL, roots);
if (ret < 0)
goto out;
}
spin_unlock(&fs_info->qgroup_lock);
ulist_free(roots);
}
out:
btrfs_put_tree_mod_seq(fs_info, &tree_mod_seq_elem);
Expand All @@ -3100,20 +3080,13 @@ static void btrfs_qgroup_rescan_worker(struct btrfs_work *work)
qgroup_rescan_work);
struct btrfs_path *path;
struct btrfs_trans_handle *trans = NULL;
struct ulist *tmp = NULL, *qgroups = NULL;
struct extent_buffer *scratch_leaf = NULL;
int err = -ENOMEM;
int ret = 0;

path = btrfs_alloc_path();
if (!path)
goto out;
qgroups = ulist_alloc(GFP_NOFS);
if (!qgroups)
goto out;
tmp = ulist_alloc(GFP_NOFS);
if (!tmp)
goto out;
scratch_leaf = kmalloc(sizeof(*scratch_leaf), GFP_NOFS);
if (!scratch_leaf)
goto out;
Expand All @@ -3129,7 +3102,7 @@ static void btrfs_qgroup_rescan_worker(struct btrfs_work *work)
err = -EINTR;
} else {
err = qgroup_rescan_leaf(fs_info, path, trans,
qgroups, tmp, scratch_leaf);
scratch_leaf);
}
if (err > 0)
btrfs_commit_transaction(trans, fs_info->fs_root);
Expand All @@ -3139,8 +3112,6 @@ static void btrfs_qgroup_rescan_worker(struct btrfs_work *work)

out:
kfree(scratch_leaf);
ulist_free(qgroups);
ulist_free(tmp);
btrfs_free_path(path);

mutex_lock(&fs_info->qgroup_rescan_lock);
Expand Down

0 comments on commit 9d220c9

Please sign in to comment.