Skip to content

Commit 431312b

Browse files
author
Kent Overstreet
committed
bcachefs: Fix disk accounting attempting to mark invalid replicas entry
This fixes the following bug, where a disk accounting key has an invalid replicas entry, and we attempt to add it to the superblock: bcachefs (3c0860e8-07ca-4276-8954-11c1774be868): starting version 1.12: rebalance_work_acct_fix opts=metadata_replicas=2,data_replicas=2,foreground_target=ssd,background_target=hdd,nopromote_whole_extents,verbose,fsck,fix_errors=yes bcachefs (3c0860e8-07ca-4276-8954-11c1774be868): recovering from clean shutdown, journal seq 15211644 bcachefs (3c0860e8-07ca-4276-8954-11c1774be868): accounting_read... accounting not marked in superblock replicas replicas cached: 1/1 [0], fixing bcachefs (3c0860e8-07ca-4276-8954-11c1774be868): sb invalid before write: Invalid superblock section replicas_v0: invalid device 0 in entry cached: 1/1 [0] replicas_v0 (size 88): user: 2 [3 5] user: 2 [1 4] cached: 1 [2] btree: 2 [1 2] user: 2 [2 5] cached: 1 [0] cached: 1 [4] journal: 2 [1 5] user: 2 [1 2] user: 2 [2 3] user: 2 [3 4] user: 2 [4 5] cached: 1 [1] cached: 1 [3] cached: 1 [5] journal: 2 [1 2] journal: 2 [2 5] btree: 2 [2 5] user: 2 [1 3] user: 2 [1 5] user: 2 [2 4] bcachefs (3c0860e8-07ca-4276-8954-11c1774be868): inconsistency detected - emergency read only at journal seq 15211644 accounting not marked in superblock replicas replicas user: 1/1 [3], fixing bcachefs (3c0860e8-07ca-4276-8954-11c1774be868): sb invalid before write: Invalid superblock section replicas_v0: invalid device 0 in entry cached: 1/1 [0] replicas_v0 (size 96): user: 2 [3 5] user: 2 [1 3] cached: 1 [2] btree: 2 [1 2] user: 2 [2 4] cached: 1 [0] cached: 1 [4] journal: 2 [1 5] user: 1 [3] user: 2 [1 5] user: 2 [3 4] user: 2 [4 5] cached: 1 [1] cached: 1 [3] cached: 1 [5] journal: 2 [1 2] journal: 2 [2 5] btree: 2 [2 5] user: 2 [1 2] user: 2 [1 4] user: 2 [2 3] user: 2 [2 5] accounting not marked in superblock replicas replicas user: 1/2 [3 7], fixing bcachefs (3c0860e8-07ca-4276-8954-11c1774be868): sb invalid before write: Invalid superblock section replicas_v0: invalid device 7 in entry user: 1/2 [3 7] replicas_v0 (size 96): user: 2 [3 7] user: 2 [1 3] cached: 1 [2] btree: 2 [1 2] user: 2 [2 4] cached: 1 [0] cached: 1 [4] journal: 2 [1 5] user: 1 [3] user: 2 [1 5] user: 2 [3 4] user: 2 [4 5] cached: 1 [1] cached: 1 [3] cached: 1 [5] journal: 2 [1 2] journal: 2 [2 5] btree: 2 [2 5] user: 2 [1 2] user: 2 [1 4] user: 2 [2 3] user: 2 [2 5] user: 2 [3 5] done bcachefs (3c0860e8-07ca-4276-8954-11c1774be868): alloc_read... done bcachefs (3c0860e8-07ca-4276-8954-11c1774be868): stripes_read... done bcachefs (3c0860e8-07ca-4276-8954-11c1774be868): snapshots_read... done Signed-off-by: Kent Overstreet <[email protected]>
1 parent 49fd90b commit 431312b

File tree

1 file changed

+18
-3
lines changed

1 file changed

+18
-3
lines changed

fs/bcachefs/disk_accounting.c

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -671,10 +671,16 @@ int bch2_accounting_read(struct bch_fs *c)
671671
continue;
672672

673673
struct bch_replicas_padded r;
674-
675674
if (!accounting_to_replicas(&r.e, acc->k.data[i].pos))
676675
continue;
677676

677+
/*
678+
* If the replicas entry is invalid it'll get cleaned up by
679+
* check_allocations:
680+
*/
681+
if (bch2_replicas_entry_validate(&r.e, c, &buf))
682+
continue;
683+
678684
struct disk_accounting_pos k;
679685
bpos_to_disk_accounting_pos(&k, acc->k.data[i].pos);
680686

@@ -683,8 +689,17 @@ int bch2_accounting_read(struct bch_fs *c)
683689
"accounting not marked in superblock replicas\n %s",
684690
(printbuf_reset(&buf),
685691
bch2_accounting_key_to_text(&buf, &k),
686-
buf.buf)))
687-
ret = bch2_accounting_update_sb_one(c, acc->k.data[i].pos);
692+
buf.buf))) {
693+
/*
694+
* We're not RW yet and still single threaded, dropping
695+
* and retaking lock is ok:
696+
*/
697+
percpu_up_read(&c->mark_lock);
698+
ret = bch2_mark_replicas(c, &r.e);
699+
if (ret)
700+
goto fsck_err;
701+
percpu_down_read(&c->mark_lock);
702+
}
688703
}
689704

690705
preempt_disable();

0 commit comments

Comments
 (0)