diff options
author | Chris Mason <chris.mason@oracle.com> | 2007-09-11 11:15:39 -0400 |
---|---|---|
committer | David Woodhouse <dwmw2@hera.kernel.org> | 2007-09-11 11:15:39 -0400 |
commit | 5ce14bbcdd1b5d9233d26a1e89faf3a26c820c58 (patch) | |
tree | 6e2a2964e9b01c03dd1b4d58c976d76664747b64 /fs/btrfs/transaction.c | |
parent | 0e2752a72cb37075b24899f01e9bc6a589de3b6c (diff) |
Btrfs: Find and remove dead roots the first time a root is loaded.
Dead roots are trees left over after a crash, and they were either in the
process of being removed or were waiting to be removed when the box crashed.
Before, a search of the entire tree of root pointers was done on mount
looking for dead roots. Now, the search is done the first time we load
a root.
This makes mount faster when there are a large number of snapshots, and it
enables the block accounting code to properly update the block counts on
the latest root as old versions of the root are reaped after a crash.
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/transaction.c')
-rw-r--r-- | fs/btrfs/transaction.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 2b15daa3a9f2..29755593de65 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c | |||
@@ -239,7 +239,9 @@ struct dirty_root { | |||
239 | struct btrfs_root *latest_root; | 239 | struct btrfs_root *latest_root; |
240 | }; | 240 | }; |
241 | 241 | ||
242 | int btrfs_add_dead_root(struct btrfs_root *root, struct list_head *dead_list) | 242 | int btrfs_add_dead_root(struct btrfs_root *root, |
243 | struct btrfs_root *latest, | ||
244 | struct list_head *dead_list) | ||
243 | { | 245 | { |
244 | struct dirty_root *dirty; | 246 | struct dirty_root *dirty; |
245 | 247 | ||
@@ -247,6 +249,7 @@ int btrfs_add_dead_root(struct btrfs_root *root, struct list_head *dead_list) | |||
247 | if (!dirty) | 249 | if (!dirty) |
248 | return -ENOMEM; | 250 | return -ENOMEM; |
249 | dirty->root = root; | 251 | dirty->root = root; |
252 | dirty->latest_root = latest; | ||
250 | list_add(&dirty->list, dead_list); | 253 | list_add(&dirty->list, dead_list); |
251 | return 0; | 254 | return 0; |
252 | } | 255 | } |
@@ -412,7 +415,6 @@ static int drop_dirty_roots(struct btrfs_root *tree_root, | |||
412 | 415 | ||
413 | while(1) { | 416 | while(1) { |
414 | trans = btrfs_start_transaction(tree_root, 1); | 417 | trans = btrfs_start_transaction(tree_root, 1); |
415 | |||
416 | ret = btrfs_drop_snapshot(trans, dirty->root); | 418 | ret = btrfs_drop_snapshot(trans, dirty->root); |
417 | if (ret != -EAGAIN) { | 419 | if (ret != -EAGAIN) { |
418 | break; | 420 | break; |