From: Boris Burkov <boris@bur.io>
To: linux-btrfs@vger.kernel.org, kernel-team@fb.com
Subject: [PATCH 2/2] btrfs-progs: expand corrupt_file_extent in btrfs-corrupt-block
Date: Thu, 4 Feb 2021 12:09:32 -0800 [thread overview]
Message-ID: <fc655b11d471dd6796e2bff93d36948e4bcc37c7.1612468824.git.boris@bur.io> (raw)
In-Reply-To: <cover.1612468824.git.boris@bur.io>
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(-)
diff --git a/btrfs-corrupt-block.c b/btrfs-corrupt-block.c
index bf1ce9c5..40d8ad8e 100644
--- a/btrfs-corrupt-block.c
+++ b/btrfs-corrupt-block.c
@@ -323,6 +323,7 @@ enum btrfs_inode_field {
enum btrfs_file_extent_field {
BTRFS_FILE_EXTENT_DISK_BYTENR,
+ BTRFS_FILE_EXTENT_TYPE,
BTRFS_FILE_EXTENT_BAD,
};
@@ -377,6 +378,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;
}
@@ -673,14 +676,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);
@@ -712,9 +715,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 == (u64)-1)
+ bogus = generate_u64(orig);
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, bogus_type);
+ break;
default:
ret = -EINVAL;
break;
@@ -1394,9 +1406,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;
--
2.24.1
prev parent reply other threads:[~2021-02-04 20:22 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-02-04 20:09 [PATCH 0/2] btrfs-corrupt-block btree data corruption Boris Burkov
2021-02-04 20:09 ` [PATCH 1/2] btrfs-progs: corrupt generic item data with btrfs-corrupt-block Boris Burkov
2021-02-09 6:22 ` Sidong Yang
2021-02-09 18:02 ` Boris Burkov
2021-02-04 20:09 ` Boris Burkov [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=fc655b11d471dd6796e2bff93d36948e4bcc37c7.1612468824.git.boris@bur.io \
--to=boris@bur.io \
--cc=kernel-team@fb.com \
--cc=linux-btrfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).