summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQu Wenruo <wqu@suse.com>2026-01-22 09:37:58 +1030
committerDavid Sterba <dsterba@suse.com>2026-02-03 07:56:19 +0100
commitd77b90cfe08f4cf20dbbc255f8ef13bee831be63 (patch)
treef30be9de2342ac261135acbe47f0c2b9b029e27f
parent571e75f4c0dba42e57496015987285ed4380d041 (diff)
btrfs: tests: remove invalid file extent map tests
In the inode self tests, there are several problems: - Invalid file extents E.g. hole range [4K, 4K + 4) is completely invalid. Only inlined extent maps can have an unaligned ram_bytes, and even for that case, the generated extent map will use sectorsize as em->len. - Unaligned hole after inlined extent The kernel never does this by itself, the current btrfs_get_extent() will only return a single inlined extent map that covers the first block. - Incorrect numbers in the comment E.g. 12291 no matter if you add or dec 1, is not aligned to 4K. The properly number for 12K is 12288, I don't know why there is even a diff of 3, and this completely doesn't match the extent map we inserted later. - Hard-to-modify sequence in setup_file_extents() If some unfortunate person, just like me, needs to modify setup_file_extents(), good luck not screwing up the file offset. Fix them by: - Remove invalid unaligned extent maps This mostly means remove the [4K, 4K + 4) hole case. The remaining ones are already properly aligned. This slightly changes the on-disk data extent allocation, with that removed, the regular extents at [4K, 8K) and [8K , 12K) can be merged. So also add a 4K gap between those two data extents to prevent em merge. - Remove the implied hole after an inlined extent Just like what the kernel is doing for inlined extents in the real world. - Update the commit using proper numbers with 'K' suffixes Since there is no unaligned range except the first inlined one, we can always use numbers with 'K' suffixes, which is way more easier to read, and will always be aligned to 1024 at least. - Add comments in setup_file_extents() So that we're clear about the file offset for each test file extent. Reviewed-by: Filipe Manana <fdmanana@suse.com> Signed-off-by: Qu Wenruo <wqu@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
-rw-r--r--fs/btrfs/tests/inode-tests.c96
1 files changed, 49 insertions, 47 deletions
diff --git a/fs/btrfs/tests/inode-tests.c b/fs/btrfs/tests/inode-tests.c
index 6bd17d059ae6..b04fbcaf0a1d 100644
--- a/fs/btrfs/tests/inode-tests.c
+++ b/fs/btrfs/tests/inode-tests.c
@@ -81,17 +81,20 @@ static void insert_inode_item_key(struct btrfs_root *root)
* diagram of how the extents will look though this may not be possible we still
* want to make sure everything acts normally (the last number is not inclusive)
*
- * [0 - 6][ 6 - 4096 ][ 4096 - 4100][4100 - 8195][8195 - 12291]
- * [inline][hole but no extent][ hole ][ regular ][regular1 split]
+ * The numbers are using 4K fs block size as an example, the real test will scale
+ * all the extent maps (except the inlined one) according to the block size.
*
- * [12291 - 16387][16387 - 24579][24579 - 28675][ 28675 - 32771][32771 - 36867 ]
- * [ hole ][regular1 split][ prealloc ][ prealloc1 ][prealloc1 written]
+ * [ 0 - 6 ][ 6 - 4K ][ 4K - 8K ][ 8K - 12K ]
+ * [ inline ][ implied hole ][ regular ][ regular1 split ]
*
- * [36867 - 45059][45059 - 53251][53251 - 57347][57347 - 61443][61443- 69635]
- * [ prealloc1 ][ compressed ][ compressed1 ][ regular ][ compressed1]
+ * [ 12K - 16K ][ 16K - 24K ][ 24K - 28K ][ 28K - 32K ][ 32K - 36K ]
+ * [ hole ][ regular1 split ][ prealloc ][ prealloc1 ][ prealloc1 written ]
*
- * [69635-73731][ 73731 - 86019 ][86019-90115]
- * [ regular ][ hole but no extent][ regular ]
+ * [ 36K - 44K ][ 44K - 52K ][ 52K - 56K ][ 56K - 60K ][ 60K - 68 K ]
+ * [ prealloc1 ][ compressed ][ compressed1 ][ regular ][ compressed1 ]
+ *
+ * [ 68K - 72K ][ 72K - 84K ][ 84K - 88K ]
+ * [ regular ][ hole but no extent ][ regular ]
*/
static void setup_file_extents(struct btrfs_root *root, u32 sectorsize)
{
@@ -100,6 +103,8 @@ static void setup_file_extents(struct btrfs_root *root, u32 sectorsize)
u64 offset = 0;
/*
+ * Start 0, length 6, inlined.
+ *
* Tree-checker has strict limits on inline extents that they can only
* exist at file offset 0, thus we can only have one inline file extent
* at most.
@@ -109,20 +114,18 @@ static void setup_file_extents(struct btrfs_root *root, u32 sectorsize)
slot++;
offset = sectorsize;
- /* Now another hole */
- insert_extent(root, offset, 4, 4, 0, 0, 0, BTRFS_FILE_EXTENT_REG, 0,
- slot);
+ /* Start 1 * blocksize, length 1 * blocksize, regular. */
+ insert_extent(root, offset, sectorsize, sectorsize, 0,
+ disk_bytenr, sectorsize, BTRFS_FILE_EXTENT_REG, 0, slot);
slot++;
- offset += 4;
- /* Now for a regular extent */
- insert_extent(root, offset, sectorsize - 1, sectorsize - 1, 0,
- disk_bytenr, sectorsize - 1, BTRFS_FILE_EXTENT_REG, 0, slot);
- slot++;
- disk_bytenr += sectorsize;
- offset += sectorsize - 1;
+ /* We don't want the regular em merged with the next one. */
+ disk_bytenr += 2 * sectorsize;
+ offset += sectorsize;
/*
+ * Start 2 * blocksize, length 1 * blocksize, regular.
+ *
* Now for 3 extents that were split from a hole punch so we test
* offsets properly.
*/
@@ -130,10 +133,14 @@ static void setup_file_extents(struct btrfs_root *root, u32 sectorsize)
4 * sectorsize, BTRFS_FILE_EXTENT_REG, 0, slot);
slot++;
offset += sectorsize;
+
+ /* Start 3 * blocksize, length 1 * blocksize, regular, explicit hole. */
insert_extent(root, offset, sectorsize, sectorsize, 0, 0, 0,
BTRFS_FILE_EXTENT_REG, 0, slot);
slot++;
offset += sectorsize;
+
+ /* Start 4 * blocksize, length 2 * blocksize, regular. */
insert_extent(root, offset, 2 * sectorsize, 4 * sectorsize,
2 * sectorsize, disk_bytenr, 4 * sectorsize,
BTRFS_FILE_EXTENT_REG, 0, slot);
@@ -141,7 +148,7 @@ static void setup_file_extents(struct btrfs_root *root, u32 sectorsize)
offset += 2 * sectorsize;
disk_bytenr += 4 * sectorsize;
- /* Now for a unwritten prealloc extent */
+ /* Start 6 * blocksize, length 1 * blocksize, preallocated. */
insert_extent(root, offset, sectorsize, sectorsize, 0, disk_bytenr,
sectorsize, BTRFS_FILE_EXTENT_PREALLOC, 0, slot);
slot++;
@@ -154,6 +161,8 @@ static void setup_file_extents(struct btrfs_root *root, u32 sectorsize)
disk_bytenr += 2 * sectorsize;
/*
+ * Start 7 * blocksize, length 1 * blocksize, prealloc.
+ *
* Now for a partially written prealloc extent, basically the same as
* the hole punch example above. Ram_bytes never changes when you mark
* extents written btw.
@@ -162,11 +171,15 @@ static void setup_file_extents(struct btrfs_root *root, u32 sectorsize)
4 * sectorsize, BTRFS_FILE_EXTENT_PREALLOC, 0, slot);
slot++;
offset += sectorsize;
+
+ /* Start 8 * blocksize, length 1 * blocksize, regular. */
insert_extent(root, offset, sectorsize, 4 * sectorsize, sectorsize,
disk_bytenr, 4 * sectorsize, BTRFS_FILE_EXTENT_REG, 0,
slot);
slot++;
offset += sectorsize;
+
+ /* Start 9 * blocksize, length 2 * blocksize, prealloc. */
insert_extent(root, offset, 2 * sectorsize, 4 * sectorsize,
2 * sectorsize, disk_bytenr, 4 * sectorsize,
BTRFS_FILE_EXTENT_PREALLOC, 0, slot);
@@ -174,7 +187,7 @@ static void setup_file_extents(struct btrfs_root *root, u32 sectorsize)
offset += 2 * sectorsize;
disk_bytenr += 4 * sectorsize;
- /* Now a normal compressed extent */
+ /* Start 11 * blocksize, length 2 * blocksize, regular. */
insert_extent(root, offset, 2 * sectorsize, 2 * sectorsize, 0,
disk_bytenr, sectorsize, BTRFS_FILE_EXTENT_REG,
BTRFS_COMPRESS_ZLIB, slot);
@@ -183,17 +196,21 @@ static void setup_file_extents(struct btrfs_root *root, u32 sectorsize)
/* No merges */
disk_bytenr += 2 * sectorsize;
- /* Now a split compressed extent */
+ /* Start 13 * blocksize, length 1 * blocksize, regular. */
insert_extent(root, offset, sectorsize, 4 * sectorsize, 0, disk_bytenr,
sectorsize, BTRFS_FILE_EXTENT_REG,
BTRFS_COMPRESS_ZLIB, slot);
slot++;
offset += sectorsize;
+
+ /* Start 14 * blocksize, length 1 * blocksize, regular. */
insert_extent(root, offset, sectorsize, sectorsize, 0,
disk_bytenr + sectorsize, sectorsize,
BTRFS_FILE_EXTENT_REG, 0, slot);
slot++;
offset += sectorsize;
+
+ /* Start 15 * blocksize, length 2 * blocksize, regular. */
insert_extent(root, offset, 2 * sectorsize, 4 * sectorsize,
2 * sectorsize, disk_bytenr, sectorsize,
BTRFS_FILE_EXTENT_REG, BTRFS_COMPRESS_ZLIB, slot);
@@ -201,12 +218,19 @@ static void setup_file_extents(struct btrfs_root *root, u32 sectorsize)
offset += 2 * sectorsize;
disk_bytenr += 2 * sectorsize;
- /* Now extents that have a hole but no hole extent */
+ /* Start 17 * blocksize, length 1 * blocksize, regular. */
insert_extent(root, offset, sectorsize, sectorsize, 0, disk_bytenr,
sectorsize, BTRFS_FILE_EXTENT_REG, 0, slot);
slot++;
offset += 4 * sectorsize;
disk_bytenr += sectorsize;
+
+ /*
+ * Start 18 * blocksize, length 3 * blocksize, implied hole (aka no
+ * file extent item).
+ *
+ * Start 21 * blocksize, length 1 * blocksize, regular.
+ */
insert_extent(root, offset, sectorsize, sectorsize, 0, disk_bytenr,
sectorsize, BTRFS_FILE_EXTENT_REG, 0, slot);
}
@@ -316,28 +340,6 @@ static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
offset = btrfs_extent_map_end(em);
btrfs_free_extent_map(em);
- em = btrfs_get_extent(BTRFS_I(inode), NULL, offset, sectorsize);
- if (IS_ERR(em)) {
- test_err("got an error when we shouldn't have");
- goto out;
- }
- if (em->disk_bytenr != EXTENT_MAP_HOLE) {
- test_err("expected a hole, got %llu", em->disk_bytenr);
- goto out;
- }
- if (em->start != offset || em->len != 4) {
- test_err(
- "unexpected extent wanted start %llu len 4, got start %llu len %llu",
- offset, em->start, em->len);
- goto out;
- }
- if (em->flags != 0) {
- test_err("unexpected flags set, want 0 have %u", em->flags);
- goto out;
- }
- offset = btrfs_extent_map_end(em);
- btrfs_free_extent_map(em);
-
/* Regular extent */
em = btrfs_get_extent(BTRFS_I(inode), NULL, offset, sectorsize);
if (IS_ERR(em)) {
@@ -348,10 +350,10 @@ static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
test_err("expected a real extent, got %llu", em->disk_bytenr);
goto out;
}
- if (em->start != offset || em->len != sectorsize - 1) {
+ if (em->start != offset || em->len != sectorsize) {
test_err(
- "unexpected extent wanted start %llu len 4095, got start %llu len %llu",
- offset, em->start, em->len);
+ "unexpected extent wanted start %llu len %u, got start %llu len %llu",
+ offset, sectorsize, em->start, em->len);
goto out;
}
if (em->flags != 0) {