diff options
author | Jan Schmidt <list.btrfs@jan-o-sch.net> | 2013-05-28 11:47:24 -0400 |
---|---|---|
committer | Josef Bacik <jbacik@fusionio.com> | 2013-06-14 11:30:10 -0400 |
commit | b382a324b60f4923e9fc8e11f023e4f493c51318 (patch) | |
tree | 4f93e6d8a6671abbd240df83ee49f972e212bc4b /fs/btrfs/ctree.h | |
parent | eb1716af887375f1e2099f69bb89dfc5bd169bfa (diff) |
Btrfs: fix qgroup rescan resume on mount
When called during mount, we cannot start the rescan worker thread until
open_ctree is done. This commit restuctures the qgroup rescan internals to
enable a clean deferral of the rescan resume operation.
First of all, the struct qgroup_rescan is removed, saving us a malloc and
some initialization synchronizations problems. Its only element (the worker
struct) now lives within fs_info just as the rest of the rescan code.
Then setting up a rescan worker is split into several reusable stages.
Currently we have three different rescan startup scenarios:
(A) rescan ioctl
(B) rescan resume by mount
(C) rescan by quota enable
Each case needs its own combination of the four following steps:
(1) set the progress [A, C: zero; B: state of umount]
(2) commit the transaction [A]
(3) set the counters [A, C: zero; B: state of umount]
(4) start worker [A, B, C]
qgroup_rescan_init does step (1). There's no extra function added to commit
a transaction, we've got that already. qgroup_rescan_zero_tracking does
step (3). Step (4) is nothing more than a call to the generic
btrfs_queue_worker.
We also get rid of a double check for the rescan progress during
btrfs_qgroup_account_ref, which is no longer required due to having step 2
from the list above.
As a side effect, this commit prepares to move the rescan start code from
btrfs_run_qgroups (which is run during commit) to a less time critical
section.
Signed-off-by: Jan Schmidt <list.btrfs@jan-o-sch.net>
Signed-off-by: Josef Bacik <jbacik@fusionio.com>
Diffstat (limited to 'fs/btrfs/ctree.h')
-rw-r--r-- | fs/btrfs/ctree.h | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index a07b8c0a260d..80ab1a6f4fe3 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h | |||
@@ -1609,6 +1609,7 @@ struct btrfs_fs_info { | |||
1609 | struct btrfs_key qgroup_rescan_progress; | 1609 | struct btrfs_key qgroup_rescan_progress; |
1610 | struct btrfs_workers qgroup_rescan_workers; | 1610 | struct btrfs_workers qgroup_rescan_workers; |
1611 | struct completion qgroup_rescan_completion; | 1611 | struct completion qgroup_rescan_completion; |
1612 | struct btrfs_work qgroup_rescan_work; | ||
1612 | 1613 | ||
1613 | /* filesystem state */ | 1614 | /* filesystem state */ |
1614 | unsigned long fs_state; | 1615 | unsigned long fs_state; |
@@ -3858,6 +3859,7 @@ int btrfs_quota_enable(struct btrfs_trans_handle *trans, | |||
3858 | int btrfs_quota_disable(struct btrfs_trans_handle *trans, | 3859 | int btrfs_quota_disable(struct btrfs_trans_handle *trans, |
3859 | struct btrfs_fs_info *fs_info); | 3860 | struct btrfs_fs_info *fs_info); |
3860 | int btrfs_qgroup_rescan(struct btrfs_fs_info *fs_info); | 3861 | int btrfs_qgroup_rescan(struct btrfs_fs_info *fs_info); |
3862 | void btrfs_qgroup_rescan_resume(struct btrfs_fs_info *fs_info); | ||
3861 | int btrfs_qgroup_wait_for_completion(struct btrfs_fs_info *fs_info); | 3863 | int btrfs_qgroup_wait_for_completion(struct btrfs_fs_info *fs_info); |
3862 | int btrfs_add_qgroup_relation(struct btrfs_trans_handle *trans, | 3864 | int btrfs_add_qgroup_relation(struct btrfs_trans_handle *trans, |
3863 | struct btrfs_fs_info *fs_info, u64 src, u64 dst); | 3865 | struct btrfs_fs_info *fs_info, u64 src, u64 dst); |