diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2019-03-28 03:40:39 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-22 17:08:19 -0400 |
commit | d5f70c1f2750f0917025ea6b1ee0591cd65a6097 (patch) | |
tree | b38cef627662b7d117678d6751dc9e63250001e0 /fs | |
parent | ccaa61c9f6a9db28f2e0b480927f6f2c97ff72af (diff) |
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>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/bcachefs/super.c | 14 |
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); |