diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2021-01-08 21:20:58 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-22 17:08:50 -0400 |
commit | 4291a3317f3724283023f35802c47083a05b938d (patch) | |
tree | 8b7cf9ad9c938c8a5769f1594324424cc3e0a05d /fs/bcachefs/recovery.c | |
parent | dcf64dfbbc3c3c46af5508afed9f46e906fcd748 (diff) | |
download | lwn-4291a3317f3724283023f35802c47083a05b938d.tar.gz lwn-4291a3317f3724283023f35802c47083a05b938d.zip |
bcachefs: bch2_alloc_write() should be writing for all devices
Alloc info isn't stored on a particular device, it makes no sense to
only be writing it out for rw members - this was causing fsck to not fix
alloc info errors, oops.
Also, make sure we write out alloc info in other repair paths.
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
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, 5 insertions, 10 deletions
diff --git a/fs/bcachefs/recovery.c b/fs/bcachefs/recovery.c index c5da1be46444..5a43682c26ef 100644 --- a/fs/bcachefs/recovery.c +++ b/fs/bcachefs/recovery.c @@ -938,7 +938,7 @@ int bch2_fs_recovery(struct bch_fs *c) struct bch_sb_field_clean *clean = NULL; struct jset *last_journal_entry = NULL; u64 blacklist_seq, journal_seq; - bool write_sb = false, need_write_alloc = false; + bool write_sb = false; int ret; if (c->sb.clean) @@ -1084,10 +1084,8 @@ use_clean: bch_info(c, "starting metadata mark and sweep"); err = "error in mark and sweep"; ret = bch2_gc(c, &c->journal_keys, true, true); - if (ret < 0) - goto err; if (ret) - need_write_alloc = true; + goto err; bch_verbose(c, "mark and sweep done"); } @@ -1097,10 +1095,8 @@ use_clean: bch_info(c, "starting mark and sweep"); err = "error in mark and sweep"; ret = bch2_gc(c, &c->journal_keys, true, false); - if (ret < 0) - goto err; if (ret) - need_write_alloc = true; + goto err; bch_verbose(c, "mark and sweep done"); } @@ -1124,7 +1120,8 @@ use_clean: goto err; bch_verbose(c, "journal replay done"); - if (need_write_alloc && !c->opts.nochanges) { + if (test_bit(BCH_FS_NEED_ALLOC_WRITE, &c->flags) && + !c->opts.nochanges) { /* * note that even when filesystem was clean there might be work * to do here, if we ran gc (because of fsck) which recalculated @@ -1139,8 +1136,6 @@ use_clean: goto err; } bch_verbose(c, "alloc write done"); - - set_bit(BCH_FS_ALLOC_WRITTEN, &c->flags); } if (!c->sb.clean) { |