* 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)
{
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.
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.
*/
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);
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++;
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.
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);
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);
/* 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);
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);
}
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)) {
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) {