|
38 | 38 |
|
39 | 39 | #define FIELD_BUF_LEN 80 |
40 | 40 |
|
41 | | -static int debug_corrupt_block(struct extent_buffer *eb, |
42 | | - struct btrfs_root *root, u64 bytenr, u32 blocksize, u64 copy) |
| 41 | +static int debug_corrupt_sector(struct btrfs_root *root, u64 logical, int mirror) |
43 | 42 | { |
| 43 | + const u32 sectorsize = root->fs_info->sectorsize; |
| 44 | + struct btrfs_fs_info *fs_info = root->fs_info; |
44 | 45 | int ret; |
45 | 46 | int num_copies; |
46 | 47 | int mirror_num = 1; |
| 48 | + void *buf; |
| 49 | + |
| 50 | + buf = malloc(root->fs_info->sectorsize); |
| 51 | + if (!buf) { |
| 52 | + error_msg(ERROR_MSG_MEMORY, "allocating memory for bytenr %llu", |
| 53 | + logical); |
| 54 | + return -ENOMEM; |
| 55 | + } |
47 | 56 |
|
48 | 57 | while (1) { |
49 | | - if (!copy || mirror_num == copy) { |
50 | | - u64 read_len = eb->len; |
| 58 | + if (!mirror || mirror_num == mirror) { |
| 59 | + u64 read_len = sectorsize; |
51 | 60 |
|
52 | | - ret = read_data_from_disk(eb->fs_info, eb->data, |
53 | | - eb->start, &read_len, |
54 | | - mirror_num); |
55 | | - if (read_len < eb->len) |
| 61 | + ret = read_data_from_disk(fs_info, buf, logical, |
| 62 | + &read_len, mirror_num); |
| 63 | + if (read_len < sectorsize) |
56 | 64 | ret = -EIO; |
57 | 65 | if (ret < 0) { |
58 | 66 | errno = -ret; |
59 | | - error("cannot read eb bytenr %llu: %m", eb->start); |
| 67 | + error("cannot read bytenr %llu: %m", logical); |
60 | 68 | return ret; |
61 | 69 | } |
62 | | - printf("corrupting %llu copy %d\n", eb->start, |
63 | | - mirror_num); |
64 | | - memset(eb->data, 0, eb->len); |
65 | | - ret = write_and_map_eb(eb->fs_info, eb); |
| 70 | + printf("corrupting %llu copy %d\n", logical, mirror_num); |
| 71 | + memset(buf, 0, sectorsize); |
| 72 | + ret = write_data_to_disk(fs_info, buf, logical, sectorsize); |
66 | 73 | if (ret < 0) { |
67 | 74 | errno = -ret; |
68 | | - error("cannot write eb bytenr %llu: %m", eb->start); |
| 75 | + error("cannot write bytenr %llu: %m", logical); |
69 | 76 | return ret; |
70 | 77 | } |
71 | 78 | } |
72 | 79 |
|
73 | | - num_copies = btrfs_num_copies(root->fs_info, eb->start, |
74 | | - eb->len); |
| 80 | + num_copies = btrfs_num_copies(root->fs_info, logical, sectorsize); |
75 | 81 | if (num_copies == 1) |
76 | 82 | break; |
77 | 83 |
|
@@ -157,7 +163,7 @@ static void corrupt_keys(struct btrfs_trans_handle *trans, |
157 | 163 | u16 csum_type = fs_info->csum_type; |
158 | 164 |
|
159 | 165 | csum_tree_block_size(eb, csum_size, 0, csum_type); |
160 | | - write_and_map_eb(eb->fs_info, eb); |
| 166 | + write_data_to_disk(eb->fs_info, eb->data, eb->start, eb->len); |
161 | 167 | } |
162 | 168 | } |
163 | 169 |
|
@@ -878,7 +884,7 @@ static int corrupt_metadata_block(struct btrfs_fs_info *fs_info, u64 block, |
878 | 884 | btrfs_set_header_generation(eb, bogus); |
879 | 885 | csum_tree_block_size(eb, fs_info->csum_size, 0, |
880 | 886 | fs_info->csum_type); |
881 | | - ret = write_and_map_eb(fs_info, eb); |
| 887 | + ret = write_data_to_disk(fs_info, eb->data, eb->start, eb->len); |
882 | 888 | free_extent_buffer(eb); |
883 | 889 | if (ret < 0) { |
884 | 890 | errno = -ret; |
@@ -1607,8 +1613,11 @@ int main(int argc, char **argv) |
1607 | 1613 | goto out_close; |
1608 | 1614 | } |
1609 | 1615 |
|
1610 | | - debug_corrupt_block(eb, root, logical, |
1611 | | - root->fs_info->sectorsize, copy); |
| 1616 | + ret = debug_corrupt_sector(root, logical, (int)copy); |
| 1617 | + if (ret < 0) { |
| 1618 | + ret = 1; |
| 1619 | + goto out_close; |
| 1620 | + } |
1612 | 1621 | free_extent_buffer(eb); |
1613 | 1622 | } |
1614 | 1623 | logical += root->fs_info->sectorsize; |
|
0 commit comments