uint8_t raw[16];
} __attribute__((packed));
+struct bcachefs_sb_layout {
+ uint8_t magic[16];
+ uint8_t layout_type;
+ uint8_t sb_max_size_bits;
+ uint8_t nr_superblocks;
+ uint8_t pad[5];
+ uint64_t sb_offset[61];
+} __attribute__((packed));
+
struct bcachefs_super_block {
union bcachefs_sb_csum csum;
uint16_t version;
uint64_t flags[8];
uint64_t features[2];
uint64_t compat[2];
- uint8_t layout[512];
+ struct bcachefs_sb_layout layout;
struct bcachefs_sb_field _start[];
} __attribute__((packed));
/* granularity of offset and length fields within superblock */
#define BCACHEFS_SECTOR_SIZE 512
/* maximum superblock size */
-#define BCACHEFS_SB_MAX_SIZE 4096
+#define BCACHEFS_SB_MAX_SIZE 0x100000
/* fields offset within super block */
#define BCACHEFS_SB_FIELDS_OFF offsetof(struct bcachefs_super_block, _start)
/* tag value for members field */
return BLKID_PROBE_NONE;
sb_size = BCACHEFS_SB_FIELDS_OFF + BYTES(bcs);
+ if (sb_size > BCACHEFS_SECTOR_SIZE << bcs->layout.sb_max_size_bits)
+ return BLKID_PROBE_NONE;
+
if (sb_size > BCACHEFS_SB_MAX_SIZE)
return BLKID_PROBE_NONE;