bcachefs: Check for writing superblocks with nonsense member seq fields
authorKent Overstreet <kent.overstreet@linux.dev>
Fri, 8 Mar 2024 21:10:08 +0000 (16:10 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Thu, 14 Mar 2024 01:22:26 +0000 (21:22 -0400)
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 <kent.overstreet@linux.dev>
fs/bcachefs/super-io.c

index 38a5073202c57ee4e24bb20a28eca224c65695da..010daebf987b5b843e217f857279bcd77dd438fe 100644 (file)
@@ -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;
 }