/* Internal sanity checks for btrfs debug builds. */
static void validate_extent_map(struct btrfs_fs_info *fs_info, struct extent_map *em)
{
+ const u32 blocksize = fs_info->sectorsize;
+
if (!IS_ENABLED(CONFIG_BTRFS_DEBUG))
return;
+
+ if (!IS_ALIGNED(em->start, blocksize) ||
+ !IS_ALIGNED(em->len, blocksize))
+ dump_extent_map(fs_info, "unaligned start offset or length members", em);
+
if (em->disk_bytenr < EXTENT_MAP_LAST_BYTE) {
if (em->disk_num_bytes == 0)
dump_extent_map(fs_info, "zero disk_num_bytes", em);
dump_extent_map(fs_info,
"ram_bytes mismatch with disk_num_bytes for non-compressed em",
em);
+ if (!IS_ALIGNED(em->disk_bytenr, blocksize) ||
+ !IS_ALIGNED(em->disk_num_bytes, blocksize) ||
+ !IS_ALIGNED(em->offset, blocksize) ||
+ !IS_ALIGNED(em->ram_bytes, blocksize))
+ dump_extent_map(fs_info, "unaligned members", em);
} else if (em->offset) {
dump_extent_map(fs_info, "non-zero offset for hole/inline", em);
}