@@ -308,6 +308,7 @@ enum btrfs_inode_field {
enum btrfs_file_extent_field {
BTRFS_FILE_EXTENT_DISK_BYTENR,
+ BTRFS_FILE_EXTENT_TYPE,
BTRFS_FILE_EXTENT_BAD,
};
@@ -380,6 +381,8 @@ static enum btrfs_file_extent_field convert_file_extent_field(char *field)
{
if (!strncmp(field, "disk_bytenr", FIELD_BUF_LEN))
return BTRFS_FILE_EXTENT_DISK_BYTENR;
+ if (!strncmp(field, "type", FIELD_BUF_LEN))
+ return BTRFS_FILE_EXTENT_TYPE;
return BTRFS_FILE_EXTENT_BAD;
}
@@ -753,14 +756,14 @@ out:
static int corrupt_file_extent(struct btrfs_trans_handle *trans,
struct btrfs_root *root, u64 inode, u64 extent,
- char *field)
+ char *field, u64 bogus)
{
struct btrfs_file_extent_item *fi;
struct btrfs_path *path;
struct btrfs_key key;
enum btrfs_file_extent_field corrupt_field;
- u64 bogus;
u64 orig;
+ u8 bogus_type = bogus;
int ret = 0;
corrupt_field = convert_file_extent_field(field);
@@ -792,9 +795,18 @@ static int corrupt_file_extent(struct btrfs_trans_handle *trans,
switch (corrupt_field) {
case BTRFS_FILE_EXTENT_DISK_BYTENR:
orig = btrfs_file_extent_disk_bytenr(path->nodes[0], fi);
- bogus = generate_u64(orig);
+ if (bogus == UNSET_U64)
+ bogus = generate_u64(orig);
btrfs_set_file_extent_disk_bytenr(path->nodes[0], fi, bogus);
break;
+ case BTRFS_FILE_EXTENT_TYPE:
+ if (bogus == UNSET_U64) {
+ fprintf(stderr, "Specify a new extent type value (-v)\n");
+ ret = -EINVAL;
+ goto out;
+ }
+ btrfs_set_file_extent_type(path->nodes[0], fi, bogus_type);
+ break;
default:
ret = -EINVAL;
break;
@@ -1487,9 +1499,9 @@ int main(int argc, char **argv)
printf("corrupting inode\n");
ret = corrupt_inode(trans, root, inode, field);
} else {
- printf("corrupting file extent\n");
ret = corrupt_file_extent(trans, root, inode,
- file_extent, field);
+ file_extent, field,
+ bogus_value);
}
btrfs_commit_transaction(trans, root);
goto out_close;
To corrupt holes/prealloc/inline extents, we need to mess with extent data items. This patch makes it possible to modify disk_bytenr with a specific value (useful for hole corruptions) and to modify the type field (useful for prealloc corruptions) Signed-off-by: Boris Burkov <boris@bur.io> --- btrfs-corrupt-block.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-)