summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2019-03-28 10:40:39 +0300
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-23 00:08:19 +0300
commitd5f70c1f2750f0917025ea6b1ee0591cd65a6097 (patch)
treeb38cef627662b7d117678d6751dc9e63250001e0
parentccaa61c9f6a9db28f2e0b480927f6f2c97ff72af (diff)
downloadlinux-d5f70c1f2750f0917025ea6b1ee0591cd65a6097.tar.xz
bcachefs: Write out alloc info more carefully
In flight btree updates could update alloc info until they're flushed - so we have to try writing again after they've been flushed. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r--fs/bcachefs/super.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/fs/bcachefs/super.c b/fs/bcachefs/super.c
index dd1496af9a06..369c533e677b 100644
--- a/fs/bcachefs/super.c
+++ b/fs/bcachefs/super.c
@@ -175,7 +175,7 @@ static void __bch2_fs_read_only(struct bch_fs *c)
{
struct bch_dev *ca;
bool wrote;
- unsigned i;
+ unsigned i, clean_passes = 0;
int ret;
bch2_rebalance_stop(c);
@@ -195,15 +195,15 @@ static void __bch2_fs_read_only(struct bch_fs *c)
goto allocator_not_running;
do {
- ret = bch2_alloc_write(c, false, &wrote);
+ ret = bch2_stripes_write(c, &wrote);
if (ret) {
- bch2_fs_inconsistent(c, "error writing out alloc info %i", ret);
+ bch2_fs_inconsistent(c, "error writing out stripes");
break;
}
- ret = bch2_stripes_write(c, &wrote);
+ ret = bch2_alloc_write(c, false, &wrote);
if (ret) {
- bch2_fs_inconsistent(c, "error writing out stripes");
+ bch2_fs_inconsistent(c, "error writing out alloc info %i", ret);
break;
}
@@ -221,7 +221,9 @@ static void __bch2_fs_read_only(struct bch_fs *c)
*/
closure_wait_event(&c->btree_interior_update_wait,
!bch2_btree_interior_updates_nr_pending(c));
- } while (wrote);
+
+ clean_passes = wrote ? 0 : clean_passes + 1;
+ } while (clean_passes < 2);
allocator_not_running:
for_each_member_device(ca, c, i)
bch2_dev_allocator_stop(ca);