diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2022-11-25 23:14:30 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-22 17:09:51 -0400 |
commit | 5250b74d55e16246a47bdcf1182b7469e28e0652 (patch) | |
tree | b7f758f4e3a40f27caf1e1bee89eedd3df5f5924 /fs/bcachefs/recovery.c | |
parent | 19fe87e00b6a601b2ec8251d0231f4c9b3bb5002 (diff) | |
download | lwn-5250b74d55e16246a47bdcf1182b7469e28e0652.tar.gz lwn-5250b74d55e16246a47bdcf1182b7469e28e0652.zip |
bcachefs: bucket_gens btree
To improve mount times, add a btree for just bucket gens, 256 of them
per key: this means we'll have to scan drastically less metadata at
startup.
This adds
- trigger for keeping it in sync with the all btree
- initialization code, for filesystems from previous versions
- new path for reading bucket gens
- new fsck code
And a new on disk format version.
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/recovery.c')
-rw-r--r-- | fs/bcachefs/recovery.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/fs/bcachefs/recovery.c b/fs/bcachefs/recovery.c index b35590226037..b10ba8963350 100644 --- a/fs/bcachefs/recovery.c +++ b/fs/bcachefs/recovery.c @@ -929,6 +929,7 @@ static bool btree_id_is_alloc(enum btree_id id) case BTREE_ID_backpointers: case BTREE_ID_need_discard: case BTREE_ID_freespace: + case BTREE_ID_bucket_gens: return true; default: return false; @@ -1237,7 +1238,9 @@ use_clean: err = "error reading allocation information"; down_read(&c->gc_lock); - ret = bch2_alloc_read(c); + ret = c->sb.version < bcachefs_metadata_version_bucket_gens + ? bch2_alloc_read(c) + : bch2_bucket_gens_read(c); up_read(&c->gc_lock); if (ret) @@ -1362,6 +1365,16 @@ use_clean: if (ret) goto err; + if (c->sb.version < bcachefs_metadata_version_bucket_gens && + c->opts.version_upgrade) { + bch_info(c, "initializing bucket_gens"); + err = "error initializing bucket gens"; + ret = bch2_bucket_gens_init(c); + if (ret) + goto err; + bch_verbose(c, "bucket_gens init done"); + } + if (c->sb.version < bcachefs_metadata_version_snapshot_2) { /* set bi_subvol on root inode */ err = "error upgrade root inode for subvolumes"; |