From: Kent Overstreet Date: Fri, 8 Mar 2024 21:10:08 +0000 (-0500) Subject: bcachefs: Check for writing superblocks with nonsense member seq fields X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=c42006458b4239b7eb50f33af523b67c7a55e42e;p=linux.git bcachefs: Check for writing superblocks with nonsense member seq fields We're seeing some unmountable filesystems due to split brain detection going awry; it seems we somehow wrote out superblocks where we updated the superblock seq without updating any member seq fields. A given device's superblock should always have the main seq equal to it's member seq field, so this is easy to check for. Signed-off-by: Kent Overstreet --- diff --git a/fs/bcachefs/super-io.c b/fs/bcachefs/super-io.c index 38a5073202c57..010daebf987b5 100644 --- a/fs/bcachefs/super-io.c +++ b/fs/bcachefs/super-io.c @@ -470,6 +470,14 @@ static int bch2_sb_validate(struct bch_sb_handle *disk_sb, struct printbuf *out, return ret; } + if (rw == WRITE && + bch2_sb_member_get(sb, sb->dev_idx).seq != sb->seq) { + prt_printf(out, "Invalid superblock: member seq %llu != sb seq %llu", + le64_to_cpu(bch2_sb_member_get(sb, sb->dev_idx).seq), + le64_to_cpu(sb->seq)); + return -BCH_ERR_invalid_sb_members_missing; + } + return 0; }