btrfs-progs: corrupt-block: expand corrupt_file_extent

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)

Reviewed-by: Sweet Tea Dorminy <sweettea-kernel@dorminy.me>
Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Boris Burkov <boris@bur.io>
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
Boris Burkov 2022-07-26 13:43:24 -07:00 committed by David Sterba
parent b2ada05941
commit 312a458037
1 changed files with 14 additions and 5 deletions

View File

@ -307,6 +307,7 @@ enum btrfs_inode_field {
enum btrfs_file_extent_field {
BTRFS_FILE_EXTENT_DISK_BYTENR,
BTRFS_FILE_EXTENT_TYPE,
BTRFS_FILE_EXTENT_BAD,
};
@ -379,6 +380,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;
}
@ -752,13 +755,12 @@ 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;
int ret = 0;
@ -791,9 +793,17 @@ 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);
bogus = (bogus == (u64)-1) ? generate_u64(orig) : bogus;
btrfs_set_file_extent_disk_bytenr(path->nodes[0], fi, bogus);
break;
case BTRFS_FILE_EXTENT_TYPE:
if (bogus == (u64)-1) {
fprintf(stderr, "Specify a new extent type value (-v)\n");
ret = -EINVAL;
goto out;
}
btrfs_set_file_extent_type(path->nodes[0], fi, (u8)bogus);
break;
default:
ret = -EINVAL;
break;
@ -1486,9 +1496,8 @@ 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;