diff options
Diffstat (limited to 'fs/btrfs/check-integrity.c')
-rw-r--r-- | fs/btrfs/check-integrity.c | 584 |
1 files changed, 436 insertions, 148 deletions
diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c index c053e90f2006..9cebb1fd6a3c 100644 --- a/fs/btrfs/check-integrity.c +++ b/fs/btrfs/check-integrity.c | |||
@@ -103,8 +103,6 @@ | |||
103 | #define BTRFSIC_BLOCK_STACK_FRAME_MAGIC_NUMBER 20111300 | 103 | #define BTRFSIC_BLOCK_STACK_FRAME_MAGIC_NUMBER 20111300 |
104 | #define BTRFSIC_TREE_DUMP_MAX_INDENT_LEVEL (200 - 6) /* in characters, | 104 | #define BTRFSIC_TREE_DUMP_MAX_INDENT_LEVEL (200 - 6) /* in characters, |
105 | * excluding " [...]" */ | 105 | * excluding " [...]" */ |
106 | #define BTRFSIC_BLOCK_SIZE PAGE_SIZE | ||
107 | |||
108 | #define BTRFSIC_GENERATION_UNKNOWN ((u64)-1) | 106 | #define BTRFSIC_GENERATION_UNKNOWN ((u64)-1) |
109 | 107 | ||
110 | /* | 108 | /* |
@@ -210,8 +208,9 @@ struct btrfsic_block_data_ctx { | |||
210 | u64 dev_bytenr; /* physical bytenr on device */ | 208 | u64 dev_bytenr; /* physical bytenr on device */ |
211 | u32 len; | 209 | u32 len; |
212 | struct btrfsic_dev_state *dev; | 210 | struct btrfsic_dev_state *dev; |
213 | char *data; | 211 | char **datav; |
214 | struct buffer_head *bh; /* do not use if set to NULL */ | 212 | struct page **pagev; |
213 | void *mem_to_free; | ||
215 | }; | 214 | }; |
216 | 215 | ||
217 | /* This structure is used to implement recursion without occupying | 216 | /* This structure is used to implement recursion without occupying |
@@ -243,6 +242,8 @@ struct btrfsic_state { | |||
243 | struct btrfs_root *root; | 242 | struct btrfs_root *root; |
244 | u64 max_superblock_generation; | 243 | u64 max_superblock_generation; |
245 | struct btrfsic_block *latest_superblock; | 244 | struct btrfsic_block *latest_superblock; |
245 | u32 metablock_size; | ||
246 | u32 datablock_size; | ||
246 | }; | 247 | }; |
247 | 248 | ||
248 | static void btrfsic_block_init(struct btrfsic_block *b); | 249 | static void btrfsic_block_init(struct btrfsic_block *b); |
@@ -290,8 +291,10 @@ static int btrfsic_process_superblock(struct btrfsic_state *state, | |||
290 | static int btrfsic_process_metablock(struct btrfsic_state *state, | 291 | static int btrfsic_process_metablock(struct btrfsic_state *state, |
291 | struct btrfsic_block *block, | 292 | struct btrfsic_block *block, |
292 | struct btrfsic_block_data_ctx *block_ctx, | 293 | struct btrfsic_block_data_ctx *block_ctx, |
293 | struct btrfs_header *hdr, | ||
294 | int limit_nesting, int force_iodone_flag); | 294 | int limit_nesting, int force_iodone_flag); |
295 | static void btrfsic_read_from_block_data( | ||
296 | struct btrfsic_block_data_ctx *block_ctx, | ||
297 | void *dst, u32 offset, size_t len); | ||
295 | static int btrfsic_create_link_to_next_block( | 298 | static int btrfsic_create_link_to_next_block( |
296 | struct btrfsic_state *state, | 299 | struct btrfsic_state *state, |
297 | struct btrfsic_block *block, | 300 | struct btrfsic_block *block, |
@@ -318,12 +321,13 @@ static void btrfsic_release_block_ctx(struct btrfsic_block_data_ctx *block_ctx); | |||
318 | static int btrfsic_read_block(struct btrfsic_state *state, | 321 | static int btrfsic_read_block(struct btrfsic_state *state, |
319 | struct btrfsic_block_data_ctx *block_ctx); | 322 | struct btrfsic_block_data_ctx *block_ctx); |
320 | static void btrfsic_dump_database(struct btrfsic_state *state); | 323 | static void btrfsic_dump_database(struct btrfsic_state *state); |
324 | static void btrfsic_complete_bio_end_io(struct bio *bio, int err); | ||
321 | static int btrfsic_test_for_metadata(struct btrfsic_state *state, | 325 | static int btrfsic_test_for_metadata(struct btrfsic_state *state, |
322 | const u8 *data, unsigned int size); | 326 | char **datav, unsigned int num_pages); |
323 | static void btrfsic_process_written_block(struct btrfsic_dev_state *dev_state, | 327 | static void btrfsic_process_written_block(struct btrfsic_dev_state *dev_state, |
324 | u64 dev_bytenr, u8 *mapped_data, | 328 | u64 dev_bytenr, char **mapped_datav, |
325 | unsigned int len, struct bio *bio, | 329 | unsigned int num_pages, |
326 | int *bio_is_patched, | 330 | struct bio *bio, int *bio_is_patched, |
327 | struct buffer_head *bh, | 331 | struct buffer_head *bh, |
328 | int submit_bio_bh_rw); | 332 | int submit_bio_bh_rw); |
329 | static int btrfsic_process_written_superblock( | 333 | static int btrfsic_process_written_superblock( |
@@ -375,7 +379,7 @@ static struct btrfsic_dev_state *btrfsic_dev_state_lookup( | |||
375 | static void btrfsic_cmp_log_and_dev_bytenr(struct btrfsic_state *state, | 379 | static void btrfsic_cmp_log_and_dev_bytenr(struct btrfsic_state *state, |
376 | u64 bytenr, | 380 | u64 bytenr, |
377 | struct btrfsic_dev_state *dev_state, | 381 | struct btrfsic_dev_state *dev_state, |
378 | u64 dev_bytenr, char *data); | 382 | u64 dev_bytenr); |
379 | 383 | ||
380 | static struct mutex btrfsic_mutex; | 384 | static struct mutex btrfsic_mutex; |
381 | static int btrfsic_is_initialized; | 385 | static int btrfsic_is_initialized; |
@@ -651,7 +655,7 @@ static int btrfsic_process_superblock(struct btrfsic_state *state, | |||
651 | int pass; | 655 | int pass; |
652 | 656 | ||
653 | BUG_ON(NULL == state); | 657 | BUG_ON(NULL == state); |
654 | selected_super = kmalloc(sizeof(*selected_super), GFP_NOFS); | 658 | selected_super = kzalloc(sizeof(*selected_super), GFP_NOFS); |
655 | if (NULL == selected_super) { | 659 | if (NULL == selected_super) { |
656 | printk(KERN_INFO "btrfsic: error, kmalloc failed!\n"); | 660 | printk(KERN_INFO "btrfsic: error, kmalloc failed!\n"); |
657 | return -1; | 661 | return -1; |
@@ -718,7 +722,7 @@ static int btrfsic_process_superblock(struct btrfsic_state *state, | |||
718 | 722 | ||
719 | num_copies = | 723 | num_copies = |
720 | btrfs_num_copies(&state->root->fs_info->mapping_tree, | 724 | btrfs_num_copies(&state->root->fs_info->mapping_tree, |
721 | next_bytenr, PAGE_SIZE); | 725 | next_bytenr, state->metablock_size); |
722 | if (state->print_mask & BTRFSIC_PRINT_MASK_NUM_COPIES) | 726 | if (state->print_mask & BTRFSIC_PRINT_MASK_NUM_COPIES) |
723 | printk(KERN_INFO "num_copies(log_bytenr=%llu) = %d\n", | 727 | printk(KERN_INFO "num_copies(log_bytenr=%llu) = %d\n", |
724 | (unsigned long long)next_bytenr, num_copies); | 728 | (unsigned long long)next_bytenr, num_copies); |
@@ -727,9 +731,9 @@ static int btrfsic_process_superblock(struct btrfsic_state *state, | |||
727 | struct btrfsic_block *next_block; | 731 | struct btrfsic_block *next_block; |
728 | struct btrfsic_block_data_ctx tmp_next_block_ctx; | 732 | struct btrfsic_block_data_ctx tmp_next_block_ctx; |
729 | struct btrfsic_block_link *l; | 733 | struct btrfsic_block_link *l; |
730 | struct btrfs_header *hdr; | ||
731 | 734 | ||
732 | ret = btrfsic_map_block(state, next_bytenr, PAGE_SIZE, | 735 | ret = btrfsic_map_block(state, next_bytenr, |
736 | state->metablock_size, | ||
733 | &tmp_next_block_ctx, | 737 | &tmp_next_block_ctx, |
734 | mirror_num); | 738 | mirror_num); |
735 | if (ret) { | 739 | if (ret) { |
@@ -758,7 +762,7 @@ static int btrfsic_process_superblock(struct btrfsic_state *state, | |||
758 | BUG_ON(NULL == l); | 762 | BUG_ON(NULL == l); |
759 | 763 | ||
760 | ret = btrfsic_read_block(state, &tmp_next_block_ctx); | 764 | ret = btrfsic_read_block(state, &tmp_next_block_ctx); |
761 | if (ret < (int)BTRFSIC_BLOCK_SIZE) { | 765 | if (ret < (int)PAGE_CACHE_SIZE) { |
762 | printk(KERN_INFO | 766 | printk(KERN_INFO |
763 | "btrfsic: read @logical %llu failed!\n", | 767 | "btrfsic: read @logical %llu failed!\n", |
764 | (unsigned long long) | 768 | (unsigned long long) |
@@ -768,11 +772,9 @@ static int btrfsic_process_superblock(struct btrfsic_state *state, | |||
768 | return -1; | 772 | return -1; |
769 | } | 773 | } |
770 | 774 | ||
771 | hdr = (struct btrfs_header *)tmp_next_block_ctx.data; | ||
772 | ret = btrfsic_process_metablock(state, | 775 | ret = btrfsic_process_metablock(state, |
773 | next_block, | 776 | next_block, |
774 | &tmp_next_block_ctx, | 777 | &tmp_next_block_ctx, |
775 | hdr, | ||
776 | BTRFS_MAX_LEVEL + 3, 1); | 778 | BTRFS_MAX_LEVEL + 3, 1); |
777 | btrfsic_release_block_ctx(&tmp_next_block_ctx); | 779 | btrfsic_release_block_ctx(&tmp_next_block_ctx); |
778 | } | 780 | } |
@@ -799,7 +801,10 @@ static int btrfsic_process_superblock_dev_mirror( | |||
799 | 801 | ||
800 | /* super block bytenr is always the unmapped device bytenr */ | 802 | /* super block bytenr is always the unmapped device bytenr */ |
801 | dev_bytenr = btrfs_sb_offset(superblock_mirror_num); | 803 | dev_bytenr = btrfs_sb_offset(superblock_mirror_num); |
802 | bh = __bread(superblock_bdev, dev_bytenr / 4096, 4096); | 804 | if (dev_bytenr + BTRFS_SUPER_INFO_SIZE > device->total_bytes) |
805 | return -1; | ||
806 | bh = __bread(superblock_bdev, dev_bytenr / 4096, | ||
807 | BTRFS_SUPER_INFO_SIZE); | ||
803 | if (NULL == bh) | 808 | if (NULL == bh) |
804 | return -1; | 809 | return -1; |
805 | super_tmp = (struct btrfs_super_block *) | 810 | super_tmp = (struct btrfs_super_block *) |
@@ -808,7 +813,10 @@ static int btrfsic_process_superblock_dev_mirror( | |||
808 | if (btrfs_super_bytenr(super_tmp) != dev_bytenr || | 813 | if (btrfs_super_bytenr(super_tmp) != dev_bytenr || |
809 | strncmp((char *)(&(super_tmp->magic)), BTRFS_MAGIC, | 814 | strncmp((char *)(&(super_tmp->magic)), BTRFS_MAGIC, |
810 | sizeof(super_tmp->magic)) || | 815 | sizeof(super_tmp->magic)) || |
811 | memcmp(device->uuid, super_tmp->dev_item.uuid, BTRFS_UUID_SIZE)) { | 816 | memcmp(device->uuid, super_tmp->dev_item.uuid, BTRFS_UUID_SIZE) || |
817 | btrfs_super_nodesize(super_tmp) != state->metablock_size || | ||
818 | btrfs_super_leafsize(super_tmp) != state->metablock_size || | ||
819 | btrfs_super_sectorsize(super_tmp) != state->datablock_size) { | ||
812 | brelse(bh); | 820 | brelse(bh); |
813 | return 0; | 821 | return 0; |
814 | } | 822 | } |
@@ -893,7 +901,7 @@ static int btrfsic_process_superblock_dev_mirror( | |||
893 | 901 | ||
894 | num_copies = | 902 | num_copies = |
895 | btrfs_num_copies(&state->root->fs_info->mapping_tree, | 903 | btrfs_num_copies(&state->root->fs_info->mapping_tree, |
896 | next_bytenr, PAGE_SIZE); | 904 | next_bytenr, state->metablock_size); |
897 | if (state->print_mask & BTRFSIC_PRINT_MASK_NUM_COPIES) | 905 | if (state->print_mask & BTRFSIC_PRINT_MASK_NUM_COPIES) |
898 | printk(KERN_INFO "num_copies(log_bytenr=%llu) = %d\n", | 906 | printk(KERN_INFO "num_copies(log_bytenr=%llu) = %d\n", |
899 | (unsigned long long)next_bytenr, num_copies); | 907 | (unsigned long long)next_bytenr, num_copies); |
@@ -902,7 +910,8 @@ static int btrfsic_process_superblock_dev_mirror( | |||
902 | struct btrfsic_block_data_ctx tmp_next_block_ctx; | 910 | struct btrfsic_block_data_ctx tmp_next_block_ctx; |
903 | struct btrfsic_block_link *l; | 911 | struct btrfsic_block_link *l; |
904 | 912 | ||
905 | if (btrfsic_map_block(state, next_bytenr, PAGE_SIZE, | 913 | if (btrfsic_map_block(state, next_bytenr, |
914 | state->metablock_size, | ||
906 | &tmp_next_block_ctx, | 915 | &tmp_next_block_ctx, |
907 | mirror_num)) { | 916 | mirror_num)) { |
908 | printk(KERN_INFO "btrfsic: btrfsic_map_block(" | 917 | printk(KERN_INFO "btrfsic: btrfsic_map_block(" |
@@ -966,13 +975,15 @@ static int btrfsic_process_metablock( | |||
966 | struct btrfsic_state *state, | 975 | struct btrfsic_state *state, |
967 | struct btrfsic_block *const first_block, | 976 | struct btrfsic_block *const first_block, |
968 | struct btrfsic_block_data_ctx *const first_block_ctx, | 977 | struct btrfsic_block_data_ctx *const first_block_ctx, |
969 | struct btrfs_header *const first_hdr, | ||
970 | int first_limit_nesting, int force_iodone_flag) | 978 | int first_limit_nesting, int force_iodone_flag) |
971 | { | 979 | { |
972 | struct btrfsic_stack_frame initial_stack_frame = { 0 }; | 980 | struct btrfsic_stack_frame initial_stack_frame = { 0 }; |
973 | struct btrfsic_stack_frame *sf; | 981 | struct btrfsic_stack_frame *sf; |
974 | struct btrfsic_stack_frame *next_stack; | 982 | struct btrfsic_stack_frame *next_stack; |
983 | struct btrfs_header *const first_hdr = | ||
984 | (struct btrfs_header *)first_block_ctx->datav[0]; | ||
975 | 985 | ||
986 | BUG_ON(!first_hdr); | ||
976 | sf = &initial_stack_frame; | 987 | sf = &initial_stack_frame; |
977 | sf->error = 0; | 988 | sf->error = 0; |
978 | sf->i = -1; | 989 | sf->i = -1; |
@@ -1012,21 +1023,47 @@ continue_with_current_leaf_stack_frame: | |||
1012 | } | 1023 | } |
1013 | 1024 | ||
1014 | if (sf->i < sf->nr) { | 1025 | if (sf->i < sf->nr) { |
1015 | struct btrfs_item *disk_item = leafhdr->items + sf->i; | 1026 | struct btrfs_item disk_item; |
1016 | struct btrfs_disk_key *disk_key = &disk_item->key; | 1027 | u32 disk_item_offset = |
1028 | (uintptr_t)(leafhdr->items + sf->i) - | ||
1029 | (uintptr_t)leafhdr; | ||
1030 | struct btrfs_disk_key *disk_key; | ||
1017 | u8 type; | 1031 | u8 type; |
1018 | const u32 item_offset = le32_to_cpu(disk_item->offset); | 1032 | u32 item_offset; |
1019 | 1033 | ||
1034 | if (disk_item_offset + sizeof(struct btrfs_item) > | ||
1035 | sf->block_ctx->len) { | ||
1036 | leaf_item_out_of_bounce_error: | ||
1037 | printk(KERN_INFO | ||
1038 | "btrfsic: leaf item out of bounce at logical %llu, dev %s\n", | ||
1039 | sf->block_ctx->start, | ||
1040 | sf->block_ctx->dev->name); | ||
1041 | goto one_stack_frame_backwards; | ||
1042 | } | ||
1043 | btrfsic_read_from_block_data(sf->block_ctx, | ||
1044 | &disk_item, | ||
1045 | disk_item_offset, | ||
1046 | sizeof(struct btrfs_item)); | ||
1047 | item_offset = le32_to_cpu(disk_item.offset); | ||
1048 | disk_key = &disk_item.key; | ||
1020 | type = disk_key->type; | 1049 | type = disk_key->type; |
1021 | 1050 | ||
1022 | if (BTRFS_ROOT_ITEM_KEY == type) { | 1051 | if (BTRFS_ROOT_ITEM_KEY == type) { |
1023 | const struct btrfs_root_item *const root_item = | 1052 | struct btrfs_root_item root_item; |
1024 | (struct btrfs_root_item *) | 1053 | u32 root_item_offset; |
1025 | (sf->block_ctx->data + | 1054 | u64 next_bytenr; |
1026 | offsetof(struct btrfs_leaf, items) + | 1055 | |
1027 | item_offset); | 1056 | root_item_offset = item_offset + |
1028 | const u64 next_bytenr = | 1057 | offsetof(struct btrfs_leaf, items); |
1029 | le64_to_cpu(root_item->bytenr); | 1058 | if (root_item_offset + |
1059 | sizeof(struct btrfs_root_item) > | ||
1060 | sf->block_ctx->len) | ||
1061 | goto leaf_item_out_of_bounce_error; | ||
1062 | btrfsic_read_from_block_data( | ||
1063 | sf->block_ctx, &root_item, | ||
1064 | root_item_offset, | ||
1065 | sizeof(struct btrfs_root_item)); | ||
1066 | next_bytenr = le64_to_cpu(root_item.bytenr); | ||
1030 | 1067 | ||
1031 | sf->error = | 1068 | sf->error = |
1032 | btrfsic_create_link_to_next_block( | 1069 | btrfsic_create_link_to_next_block( |
@@ -1041,7 +1078,7 @@ continue_with_current_leaf_stack_frame: | |||
1041 | &sf->num_copies, | 1078 | &sf->num_copies, |
1042 | &sf->mirror_num, | 1079 | &sf->mirror_num, |
1043 | disk_key, | 1080 | disk_key, |
1044 | le64_to_cpu(root_item-> | 1081 | le64_to_cpu(root_item. |
1045 | generation)); | 1082 | generation)); |
1046 | if (sf->error) | 1083 | if (sf->error) |
1047 | goto one_stack_frame_backwards; | 1084 | goto one_stack_frame_backwards; |
@@ -1049,7 +1086,7 @@ continue_with_current_leaf_stack_frame: | |||
1049 | if (NULL != sf->next_block) { | 1086 | if (NULL != sf->next_block) { |
1050 | struct btrfs_header *const next_hdr = | 1087 | struct btrfs_header *const next_hdr = |
1051 | (struct btrfs_header *) | 1088 | (struct btrfs_header *) |
1052 | sf->next_block_ctx.data; | 1089 | sf->next_block_ctx.datav[0]; |
1053 | 1090 | ||
1054 | next_stack = | 1091 | next_stack = |
1055 | btrfsic_stack_frame_alloc(); | 1092 | btrfsic_stack_frame_alloc(); |
@@ -1111,10 +1148,24 @@ continue_with_current_node_stack_frame: | |||
1111 | } | 1148 | } |
1112 | 1149 | ||
1113 | if (sf->i < sf->nr) { | 1150 | if (sf->i < sf->nr) { |
1114 | struct btrfs_key_ptr *disk_key_ptr = | 1151 | struct btrfs_key_ptr key_ptr; |
1115 | nodehdr->ptrs + sf->i; | 1152 | u32 key_ptr_offset; |
1116 | const u64 next_bytenr = | 1153 | u64 next_bytenr; |
1117 | le64_to_cpu(disk_key_ptr->blockptr); | 1154 | |
1155 | key_ptr_offset = (uintptr_t)(nodehdr->ptrs + sf->i) - | ||
1156 | (uintptr_t)nodehdr; | ||
1157 | if (key_ptr_offset + sizeof(struct btrfs_key_ptr) > | ||
1158 | sf->block_ctx->len) { | ||
1159 | printk(KERN_INFO | ||
1160 | "btrfsic: node item out of bounce at logical %llu, dev %s\n", | ||
1161 | sf->block_ctx->start, | ||
1162 | sf->block_ctx->dev->name); | ||
1163 | goto one_stack_frame_backwards; | ||
1164 | } | ||
1165 | btrfsic_read_from_block_data( | ||
1166 | sf->block_ctx, &key_ptr, key_ptr_offset, | ||
1167 | sizeof(struct btrfs_key_ptr)); | ||
1168 | next_bytenr = le64_to_cpu(key_ptr.blockptr); | ||
1118 | 1169 | ||
1119 | sf->error = btrfsic_create_link_to_next_block( | 1170 | sf->error = btrfsic_create_link_to_next_block( |
1120 | state, | 1171 | state, |
@@ -1127,15 +1178,15 @@ continue_with_current_node_stack_frame: | |||
1127 | force_iodone_flag, | 1178 | force_iodone_flag, |
1128 | &sf->num_copies, | 1179 | &sf->num_copies, |
1129 | &sf->mirror_num, | 1180 | &sf->mirror_num, |
1130 | &disk_key_ptr->key, | 1181 | &key_ptr.key, |
1131 | le64_to_cpu(disk_key_ptr->generation)); | 1182 | le64_to_cpu(key_ptr.generation)); |
1132 | if (sf->error) | 1183 | if (sf->error) |
1133 | goto one_stack_frame_backwards; | 1184 | goto one_stack_frame_backwards; |
1134 | 1185 | ||
1135 | if (NULL != sf->next_block) { | 1186 | if (NULL != sf->next_block) { |
1136 | struct btrfs_header *const next_hdr = | 1187 | struct btrfs_header *const next_hdr = |
1137 | (struct btrfs_header *) | 1188 | (struct btrfs_header *) |
1138 | sf->next_block_ctx.data; | 1189 | sf->next_block_ctx.datav[0]; |
1139 | 1190 | ||
1140 | next_stack = btrfsic_stack_frame_alloc(); | 1191 | next_stack = btrfsic_stack_frame_alloc(); |
1141 | if (NULL == next_stack) | 1192 | if (NULL == next_stack) |
@@ -1181,6 +1232,35 @@ one_stack_frame_backwards: | |||
1181 | return sf->error; | 1232 | return sf->error; |
1182 | } | 1233 | } |
1183 | 1234 | ||
1235 | static void btrfsic_read_from_block_data( | ||
1236 | struct btrfsic_block_data_ctx *block_ctx, | ||
1237 | void *dstv, u32 offset, size_t len) | ||
1238 | { | ||
1239 | size_t cur; | ||
1240 | size_t offset_in_page; | ||
1241 | char *kaddr; | ||
1242 | char *dst = (char *)dstv; | ||
1243 | size_t start_offset = block_ctx->start & ((u64)PAGE_CACHE_SIZE - 1); | ||
1244 | unsigned long i = (start_offset + offset) >> PAGE_CACHE_SHIFT; | ||
1245 | |||
1246 | WARN_ON(offset + len > block_ctx->len); | ||
1247 | offset_in_page = (start_offset + offset) & | ||
1248 | ((unsigned long)PAGE_CACHE_SIZE - 1); | ||
1249 | |||
1250 | while (len > 0) { | ||
1251 | cur = min(len, ((size_t)PAGE_CACHE_SIZE - offset_in_page)); | ||
1252 | BUG_ON(i >= (block_ctx->len + PAGE_CACHE_SIZE - 1) >> | ||
1253 | PAGE_CACHE_SHIFT); | ||
1254 | kaddr = block_ctx->datav[i]; | ||
1255 | memcpy(dst, kaddr + offset_in_page, cur); | ||
1256 | |||
1257 | dst += cur; | ||
1258 | len -= cur; | ||
1259 | offset_in_page = 0; | ||
1260 | i++; | ||
1261 | } | ||
1262 | } | ||
1263 | |||
1184 | static int btrfsic_create_link_to_next_block( | 1264 | static int btrfsic_create_link_to_next_block( |
1185 | struct btrfsic_state *state, | 1265 | struct btrfsic_state *state, |
1186 | struct btrfsic_block *block, | 1266 | struct btrfsic_block *block, |
@@ -1204,7 +1284,7 @@ static int btrfsic_create_link_to_next_block( | |||
1204 | if (0 == *num_copiesp) { | 1284 | if (0 == *num_copiesp) { |
1205 | *num_copiesp = | 1285 | *num_copiesp = |
1206 | btrfs_num_copies(&state->root->fs_info->mapping_tree, | 1286 | btrfs_num_copies(&state->root->fs_info->mapping_tree, |
1207 | next_bytenr, PAGE_SIZE); | 1287 | next_bytenr, state->metablock_size); |
1208 | if (state->print_mask & BTRFSIC_PRINT_MASK_NUM_COPIES) | 1288 | if (state->print_mask & BTRFSIC_PRINT_MASK_NUM_COPIES) |
1209 | printk(KERN_INFO "num_copies(log_bytenr=%llu) = %d\n", | 1289 | printk(KERN_INFO "num_copies(log_bytenr=%llu) = %d\n", |
1210 | (unsigned long long)next_bytenr, *num_copiesp); | 1290 | (unsigned long long)next_bytenr, *num_copiesp); |
@@ -1219,7 +1299,7 @@ static int btrfsic_create_link_to_next_block( | |||
1219 | "btrfsic_create_link_to_next_block(mirror_num=%d)\n", | 1299 | "btrfsic_create_link_to_next_block(mirror_num=%d)\n", |
1220 | *mirror_nump); | 1300 | *mirror_nump); |
1221 | ret = btrfsic_map_block(state, next_bytenr, | 1301 | ret = btrfsic_map_block(state, next_bytenr, |
1222 | BTRFSIC_BLOCK_SIZE, | 1302 | state->metablock_size, |
1223 | next_block_ctx, *mirror_nump); | 1303 | next_block_ctx, *mirror_nump); |
1224 | if (ret) { | 1304 | if (ret) { |
1225 | printk(KERN_INFO | 1305 | printk(KERN_INFO |
@@ -1314,7 +1394,7 @@ static int btrfsic_create_link_to_next_block( | |||
1314 | 1394 | ||
1315 | if (limit_nesting > 0 && did_alloc_block_link) { | 1395 | if (limit_nesting > 0 && did_alloc_block_link) { |
1316 | ret = btrfsic_read_block(state, next_block_ctx); | 1396 | ret = btrfsic_read_block(state, next_block_ctx); |
1317 | if (ret < (int)BTRFSIC_BLOCK_SIZE) { | 1397 | if (ret < (int)next_block_ctx->len) { |
1318 | printk(KERN_INFO | 1398 | printk(KERN_INFO |
1319 | "btrfsic: read block @logical %llu failed!\n", | 1399 | "btrfsic: read block @logical %llu failed!\n", |
1320 | (unsigned long long)next_bytenr); | 1400 | (unsigned long long)next_bytenr); |
@@ -1339,43 +1419,74 @@ static int btrfsic_handle_extent_data( | |||
1339 | u32 item_offset, int force_iodone_flag) | 1419 | u32 item_offset, int force_iodone_flag) |
1340 | { | 1420 | { |
1341 | int ret; | 1421 | int ret; |
1342 | struct btrfs_file_extent_item *file_extent_item = | 1422 | struct btrfs_file_extent_item file_extent_item; |
1343 | (struct btrfs_file_extent_item *)(block_ctx->data + | 1423 | u64 file_extent_item_offset; |
1344 | offsetof(struct btrfs_leaf, | 1424 | u64 next_bytenr; |
1345 | items) + item_offset); | 1425 | u64 num_bytes; |
1346 | u64 next_bytenr = | 1426 | u64 generation; |
1347 | le64_to_cpu(file_extent_item->disk_bytenr) + | ||
1348 | le64_to_cpu(file_extent_item->offset); | ||
1349 | u64 num_bytes = le64_to_cpu(file_extent_item->num_bytes); | ||
1350 | u64 generation = le64_to_cpu(file_extent_item->generation); | ||
1351 | struct btrfsic_block_link *l; | 1427 | struct btrfsic_block_link *l; |
1352 | 1428 | ||
1429 | file_extent_item_offset = offsetof(struct btrfs_leaf, items) + | ||
1430 | item_offset; | ||
1431 | if (file_extent_item_offset + | ||
1432 | offsetof(struct btrfs_file_extent_item, disk_num_bytes) > | ||
1433 | block_ctx->len) { | ||
1434 | printk(KERN_INFO | ||
1435 | "btrfsic: file item out of bounce at logical %llu, dev %s\n", | ||
1436 | block_ctx->start, block_ctx->dev->name); | ||
1437 | return -1; | ||
1438 | } | ||
1439 | |||
1440 | btrfsic_read_from_block_data(block_ctx, &file_extent_item, | ||
1441 | file_extent_item_offset, | ||
1442 | offsetof(struct btrfs_file_extent_item, disk_num_bytes)); | ||
1443 | if (BTRFS_FILE_EXTENT_REG != file_extent_item.type || | ||
1444 | ((u64)0) == le64_to_cpu(file_extent_item.disk_bytenr)) { | ||
1445 | if (state->print_mask & BTRFSIC_PRINT_MASK_VERY_VERBOSE) | ||
1446 | printk(KERN_INFO "extent_data: type %u, disk_bytenr = %llu\n", | ||
1447 | file_extent_item.type, | ||
1448 | (unsigned long long) | ||
1449 | le64_to_cpu(file_extent_item.disk_bytenr)); | ||
1450 | return 0; | ||
1451 | } | ||
1452 | |||
1453 | if (file_extent_item_offset + sizeof(struct btrfs_file_extent_item) > | ||
1454 | block_ctx->len) { | ||
1455 | printk(KERN_INFO | ||
1456 | "btrfsic: file item out of bounce at logical %llu, dev %s\n", | ||
1457 | block_ctx->start, block_ctx->dev->name); | ||
1458 | return -1; | ||
1459 | } | ||
1460 | btrfsic_read_from_block_data(block_ctx, &file_extent_item, | ||
1461 | file_extent_item_offset, | ||
1462 | sizeof(struct btrfs_file_extent_item)); | ||
1463 | next_bytenr = le64_to_cpu(file_extent_item.disk_bytenr) + | ||
1464 | le64_to_cpu(file_extent_item.offset); | ||
1465 | generation = le64_to_cpu(file_extent_item.generation); | ||
1466 | num_bytes = le64_to_cpu(file_extent_item.num_bytes); | ||
1467 | generation = le64_to_cpu(file_extent_item.generation); | ||
1468 | |||
1353 | if (state->print_mask & BTRFSIC_PRINT_MASK_VERY_VERBOSE) | 1469 | if (state->print_mask & BTRFSIC_PRINT_MASK_VERY_VERBOSE) |
1354 | printk(KERN_INFO "extent_data: type %u, disk_bytenr = %llu," | 1470 | printk(KERN_INFO "extent_data: type %u, disk_bytenr = %llu," |
1355 | " offset = %llu, num_bytes = %llu\n", | 1471 | " offset = %llu, num_bytes = %llu\n", |
1356 | file_extent_item->type, | 1472 | file_extent_item.type, |
1357 | (unsigned long long) | 1473 | (unsigned long long) |
1358 | le64_to_cpu(file_extent_item->disk_bytenr), | 1474 | le64_to_cpu(file_extent_item.disk_bytenr), |
1359 | (unsigned long long) | 1475 | (unsigned long long)le64_to_cpu(file_extent_item.offset), |
1360 | le64_to_cpu(file_extent_item->offset), | 1476 | (unsigned long long)num_bytes); |
1361 | (unsigned long long) | ||
1362 | le64_to_cpu(file_extent_item->num_bytes)); | ||
1363 | if (BTRFS_FILE_EXTENT_REG != file_extent_item->type || | ||
1364 | ((u64)0) == le64_to_cpu(file_extent_item->disk_bytenr)) | ||
1365 | return 0; | ||
1366 | while (num_bytes > 0) { | 1477 | while (num_bytes > 0) { |
1367 | u32 chunk_len; | 1478 | u32 chunk_len; |
1368 | int num_copies; | 1479 | int num_copies; |
1369 | int mirror_num; | 1480 | int mirror_num; |
1370 | 1481 | ||
1371 | if (num_bytes > BTRFSIC_BLOCK_SIZE) | 1482 | if (num_bytes > state->datablock_size) |
1372 | chunk_len = BTRFSIC_BLOCK_SIZE; | 1483 | chunk_len = state->datablock_size; |
1373 | else | 1484 | else |
1374 | chunk_len = num_bytes; | 1485 | chunk_len = num_bytes; |
1375 | 1486 | ||
1376 | num_copies = | 1487 | num_copies = |
1377 | btrfs_num_copies(&state->root->fs_info->mapping_tree, | 1488 | btrfs_num_copies(&state->root->fs_info->mapping_tree, |
1378 | next_bytenr, PAGE_SIZE); | 1489 | next_bytenr, state->datablock_size); |
1379 | if (state->print_mask & BTRFSIC_PRINT_MASK_NUM_COPIES) | 1490 | if (state->print_mask & BTRFSIC_PRINT_MASK_NUM_COPIES) |
1380 | printk(KERN_INFO "num_copies(log_bytenr=%llu) = %d\n", | 1491 | printk(KERN_INFO "num_copies(log_bytenr=%llu) = %d\n", |
1381 | (unsigned long long)next_bytenr, num_copies); | 1492 | (unsigned long long)next_bytenr, num_copies); |
@@ -1475,8 +1586,9 @@ static int btrfsic_map_block(struct btrfsic_state *state, u64 bytenr, u32 len, | |||
1475 | block_ctx_out->dev_bytenr = multi->stripes[0].physical; | 1586 | block_ctx_out->dev_bytenr = multi->stripes[0].physical; |
1476 | block_ctx_out->start = bytenr; | 1587 | block_ctx_out->start = bytenr; |
1477 | block_ctx_out->len = len; | 1588 | block_ctx_out->len = len; |
1478 | block_ctx_out->data = NULL; | 1589 | block_ctx_out->datav = NULL; |
1479 | block_ctx_out->bh = NULL; | 1590 | block_ctx_out->pagev = NULL; |
1591 | block_ctx_out->mem_to_free = NULL; | ||
1480 | 1592 | ||
1481 | if (0 == ret) | 1593 | if (0 == ret) |
1482 | kfree(multi); | 1594 | kfree(multi); |
@@ -1496,8 +1608,9 @@ static int btrfsic_map_superblock(struct btrfsic_state *state, u64 bytenr, | |||
1496 | block_ctx_out->dev_bytenr = bytenr; | 1608 | block_ctx_out->dev_bytenr = bytenr; |
1497 | block_ctx_out->start = bytenr; | 1609 | block_ctx_out->start = bytenr; |
1498 | block_ctx_out->len = len; | 1610 | block_ctx_out->len = len; |
1499 | block_ctx_out->data = NULL; | 1611 | block_ctx_out->datav = NULL; |
1500 | block_ctx_out->bh = NULL; | 1612 | block_ctx_out->pagev = NULL; |
1613 | block_ctx_out->mem_to_free = NULL; | ||
1501 | if (NULL != block_ctx_out->dev) { | 1614 | if (NULL != block_ctx_out->dev) { |
1502 | return 0; | 1615 | return 0; |
1503 | } else { | 1616 | } else { |
@@ -1508,38 +1621,127 @@ static int btrfsic_map_superblock(struct btrfsic_state *state, u64 bytenr, | |||
1508 | 1621 | ||
1509 | static void btrfsic_release_block_ctx(struct btrfsic_block_data_ctx *block_ctx) | 1622 | static void btrfsic_release_block_ctx(struct btrfsic_block_data_ctx *block_ctx) |
1510 | { | 1623 | { |
1511 | if (NULL != block_ctx->bh) { | 1624 | if (block_ctx->mem_to_free) { |
1512 | brelse(block_ctx->bh); | 1625 | unsigned int num_pages; |
1513 | block_ctx->bh = NULL; | 1626 | |
1627 | BUG_ON(!block_ctx->datav); | ||
1628 | BUG_ON(!block_ctx->pagev); | ||
1629 | num_pages = (block_ctx->len + (u64)PAGE_CACHE_SIZE - 1) >> | ||
1630 | PAGE_CACHE_SHIFT; | ||
1631 | while (num_pages > 0) { | ||
1632 | num_pages--; | ||
1633 | if (block_ctx->datav[num_pages]) { | ||
1634 | kunmap(block_ctx->pagev[num_pages]); | ||
1635 | block_ctx->datav[num_pages] = NULL; | ||
1636 | } | ||
1637 | if (block_ctx->pagev[num_pages]) { | ||
1638 | __free_page(block_ctx->pagev[num_pages]); | ||
1639 | block_ctx->pagev[num_pages] = NULL; | ||
1640 | } | ||
1641 | } | ||
1642 | |||
1643 | kfree(block_ctx->mem_to_free); | ||
1644 | block_ctx->mem_to_free = NULL; | ||
1645 | block_ctx->pagev = NULL; | ||
1646 | block_ctx->datav = NULL; | ||
1514 | } | 1647 | } |
1515 | } | 1648 | } |
1516 | 1649 | ||
1517 | static int btrfsic_read_block(struct btrfsic_state *state, | 1650 | static int btrfsic_read_block(struct btrfsic_state *state, |
1518 | struct btrfsic_block_data_ctx *block_ctx) | 1651 | struct btrfsic_block_data_ctx *block_ctx) |
1519 | { | 1652 | { |
1520 | block_ctx->bh = NULL; | 1653 | unsigned int num_pages; |
1521 | if (block_ctx->dev_bytenr & 4095) { | 1654 | unsigned int i; |
1655 | u64 dev_bytenr; | ||
1656 | int ret; | ||
1657 | |||
1658 | BUG_ON(block_ctx->datav); | ||
1659 | BUG_ON(block_ctx->pagev); | ||
1660 | BUG_ON(block_ctx->mem_to_free); | ||
1661 | if (block_ctx->dev_bytenr & ((u64)PAGE_CACHE_SIZE - 1)) { | ||
1522 | printk(KERN_INFO | 1662 | printk(KERN_INFO |
1523 | "btrfsic: read_block() with unaligned bytenr %llu\n", | 1663 | "btrfsic: read_block() with unaligned bytenr %llu\n", |
1524 | (unsigned long long)block_ctx->dev_bytenr); | 1664 | (unsigned long long)block_ctx->dev_bytenr); |
1525 | return -1; | 1665 | return -1; |
1526 | } | 1666 | } |
1527 | if (block_ctx->len > 4096) { | 1667 | |
1528 | printk(KERN_INFO | 1668 | num_pages = (block_ctx->len + (u64)PAGE_CACHE_SIZE - 1) >> |
1529 | "btrfsic: read_block() with too huge size %d\n", | 1669 | PAGE_CACHE_SHIFT; |
1530 | block_ctx->len); | 1670 | block_ctx->mem_to_free = kzalloc((sizeof(*block_ctx->datav) + |
1671 | sizeof(*block_ctx->pagev)) * | ||
1672 | num_pages, GFP_NOFS); | ||
1673 | if (!block_ctx->mem_to_free) | ||
1531 | return -1; | 1674 | return -1; |
1675 | block_ctx->datav = block_ctx->mem_to_free; | ||
1676 | block_ctx->pagev = (struct page **)(block_ctx->datav + num_pages); | ||
1677 | for (i = 0; i < num_pages; i++) { | ||
1678 | block_ctx->pagev[i] = alloc_page(GFP_NOFS); | ||
1679 | if (!block_ctx->pagev[i]) | ||
1680 | return -1; | ||
1532 | } | 1681 | } |
1533 | 1682 | ||
1534 | block_ctx->bh = __bread(block_ctx->dev->bdev, | 1683 | dev_bytenr = block_ctx->dev_bytenr; |
1535 | block_ctx->dev_bytenr >> 12, 4096); | 1684 | for (i = 0; i < num_pages;) { |
1536 | if (NULL == block_ctx->bh) | 1685 | struct bio *bio; |
1537 | return -1; | 1686 | unsigned int j; |
1538 | block_ctx->data = block_ctx->bh->b_data; | 1687 | DECLARE_COMPLETION_ONSTACK(complete); |
1688 | |||
1689 | bio = bio_alloc(GFP_NOFS, num_pages - i); | ||
1690 | if (!bio) { | ||
1691 | printk(KERN_INFO | ||
1692 | "btrfsic: bio_alloc() for %u pages failed!\n", | ||
1693 | num_pages - i); | ||
1694 | return -1; | ||
1695 | } | ||
1696 | bio->bi_bdev = block_ctx->dev->bdev; | ||
1697 | bio->bi_sector = dev_bytenr >> 9; | ||
1698 | bio->bi_end_io = btrfsic_complete_bio_end_io; | ||
1699 | bio->bi_private = &complete; | ||
1700 | |||
1701 | for (j = i; j < num_pages; j++) { | ||
1702 | ret = bio_add_page(bio, block_ctx->pagev[j], | ||
1703 | PAGE_CACHE_SIZE, 0); | ||
1704 | if (PAGE_CACHE_SIZE != ret) | ||
1705 | break; | ||
1706 | } | ||
1707 | if (j == i) { | ||
1708 | printk(KERN_INFO | ||
1709 | "btrfsic: error, failed to add a single page!\n"); | ||
1710 | return -1; | ||
1711 | } | ||
1712 | submit_bio(READ, bio); | ||
1713 | |||
1714 | /* this will also unplug the queue */ | ||
1715 | wait_for_completion(&complete); | ||
1716 | |||
1717 | if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) { | ||
1718 | printk(KERN_INFO | ||
1719 | "btrfsic: read error at logical %llu dev %s!\n", | ||
1720 | block_ctx->start, block_ctx->dev->name); | ||
1721 | bio_put(bio); | ||
1722 | return -1; | ||
1723 | } | ||
1724 | bio_put(bio); | ||
1725 | dev_bytenr += (j - i) * PAGE_CACHE_SIZE; | ||
1726 | i = j; | ||
1727 | } | ||
1728 | for (i = 0; i < num_pages; i++) { | ||
1729 | block_ctx->datav[i] = kmap(block_ctx->pagev[i]); | ||
1730 | if (!block_ctx->datav[i]) { | ||
1731 | printk(KERN_INFO "btrfsic: kmap() failed (dev %s)!\n", | ||
1732 | block_ctx->dev->name); | ||
1733 | return -1; | ||
1734 | } | ||
1735 | } | ||
1539 | 1736 | ||
1540 | return block_ctx->len; | 1737 | return block_ctx->len; |
1541 | } | 1738 | } |
1542 | 1739 | ||
1740 | static void btrfsic_complete_bio_end_io(struct bio *bio, int err) | ||
1741 | { | ||
1742 | complete((struct completion *)bio->bi_private); | ||
1743 | } | ||
1744 | |||
1543 | static void btrfsic_dump_database(struct btrfsic_state *state) | 1745 | static void btrfsic_dump_database(struct btrfsic_state *state) |
1544 | { | 1746 | { |
1545 | struct list_head *elem_all; | 1747 | struct list_head *elem_all; |
@@ -1617,32 +1819,39 @@ static void btrfsic_dump_database(struct btrfsic_state *state) | |||
1617 | * (note that this test fails for the super block) | 1819 | * (note that this test fails for the super block) |
1618 | */ | 1820 | */ |
1619 | static int btrfsic_test_for_metadata(struct btrfsic_state *state, | 1821 | static int btrfsic_test_for_metadata(struct btrfsic_state *state, |
1620 | const u8 *data, unsigned int size) | 1822 | char **datav, unsigned int num_pages) |
1621 | { | 1823 | { |
1622 | struct btrfs_header *h; | 1824 | struct btrfs_header *h; |
1623 | u8 csum[BTRFS_CSUM_SIZE]; | 1825 | u8 csum[BTRFS_CSUM_SIZE]; |
1624 | u32 crc = ~(u32)0; | 1826 | u32 crc = ~(u32)0; |
1625 | int fail = 0; | 1827 | unsigned int i; |
1626 | int crc_fail = 0; | ||
1627 | 1828 | ||
1628 | h = (struct btrfs_header *)data; | 1829 | if (num_pages * PAGE_CACHE_SIZE < state->metablock_size) |
1830 | return 1; /* not metadata */ | ||
1831 | num_pages = state->metablock_size >> PAGE_CACHE_SHIFT; | ||
1832 | h = (struct btrfs_header *)datav[0]; | ||
1629 | 1833 | ||
1630 | if (memcmp(h->fsid, state->root->fs_info->fsid, BTRFS_UUID_SIZE)) | 1834 | if (memcmp(h->fsid, state->root->fs_info->fsid, BTRFS_UUID_SIZE)) |
1631 | fail++; | 1835 | return 1; |
1836 | |||
1837 | for (i = 0; i < num_pages; i++) { | ||
1838 | u8 *data = i ? datav[i] : (datav[i] + BTRFS_CSUM_SIZE); | ||
1839 | size_t sublen = i ? PAGE_CACHE_SIZE : | ||
1840 | (PAGE_CACHE_SIZE - BTRFS_CSUM_SIZE); | ||
1632 | 1841 | ||
1633 | crc = crc32c(crc, data + BTRFS_CSUM_SIZE, PAGE_SIZE - BTRFS_CSUM_SIZE); | 1842 | crc = crc32c(crc, data, sublen); |
1843 | } | ||
1634 | btrfs_csum_final(crc, csum); | 1844 | btrfs_csum_final(crc, csum); |
1635 | if (memcmp(csum, h->csum, state->csum_size)) | 1845 | if (memcmp(csum, h->csum, state->csum_size)) |
1636 | crc_fail++; | 1846 | return 1; |
1637 | 1847 | ||
1638 | return fail || crc_fail; | 1848 | return 0; /* is metadata */ |
1639 | } | 1849 | } |
1640 | 1850 | ||
1641 | static void btrfsic_process_written_block(struct btrfsic_dev_state *dev_state, | 1851 | static void btrfsic_process_written_block(struct btrfsic_dev_state *dev_state, |
1642 | u64 dev_bytenr, | 1852 | u64 dev_bytenr, char **mapped_datav, |
1643 | u8 *mapped_data, unsigned int len, | 1853 | unsigned int num_pages, |
1644 | struct bio *bio, | 1854 | struct bio *bio, int *bio_is_patched, |
1645 | int *bio_is_patched, | ||
1646 | struct buffer_head *bh, | 1855 | struct buffer_head *bh, |
1647 | int submit_bio_bh_rw) | 1856 | int submit_bio_bh_rw) |
1648 | { | 1857 | { |
@@ -1652,12 +1861,19 @@ static void btrfsic_process_written_block(struct btrfsic_dev_state *dev_state, | |||
1652 | int ret; | 1861 | int ret; |
1653 | struct btrfsic_state *state = dev_state->state; | 1862 | struct btrfsic_state *state = dev_state->state; |
1654 | struct block_device *bdev = dev_state->bdev; | 1863 | struct block_device *bdev = dev_state->bdev; |
1864 | unsigned int processed_len; | ||
1655 | 1865 | ||
1656 | WARN_ON(len > PAGE_SIZE); | ||
1657 | is_metadata = (0 == btrfsic_test_for_metadata(state, mapped_data, len)); | ||
1658 | if (NULL != bio_is_patched) | 1866 | if (NULL != bio_is_patched) |
1659 | *bio_is_patched = 0; | 1867 | *bio_is_patched = 0; |
1660 | 1868 | ||
1869 | again: | ||
1870 | if (num_pages == 0) | ||
1871 | return; | ||
1872 | |||
1873 | processed_len = 0; | ||
1874 | is_metadata = (0 == btrfsic_test_for_metadata(state, mapped_datav, | ||
1875 | num_pages)); | ||
1876 | |||
1661 | block = btrfsic_block_hashtable_lookup(bdev, dev_bytenr, | 1877 | block = btrfsic_block_hashtable_lookup(bdev, dev_bytenr, |
1662 | &state->block_hashtable); | 1878 | &state->block_hashtable); |
1663 | if (NULL != block) { | 1879 | if (NULL != block) { |
@@ -1667,8 +1883,16 @@ static void btrfsic_process_written_block(struct btrfsic_dev_state *dev_state, | |||
1667 | 1883 | ||
1668 | if (block->is_superblock) { | 1884 | if (block->is_superblock) { |
1669 | bytenr = le64_to_cpu(((struct btrfs_super_block *) | 1885 | bytenr = le64_to_cpu(((struct btrfs_super_block *) |
1670 | mapped_data)->bytenr); | 1886 | mapped_datav[0])->bytenr); |
1887 | if (num_pages * PAGE_CACHE_SIZE < | ||
1888 | BTRFS_SUPER_INFO_SIZE) { | ||
1889 | printk(KERN_INFO | ||
1890 | "btrfsic: cannot work with too short bios!\n"); | ||
1891 | return; | ||
1892 | } | ||
1671 | is_metadata = 1; | 1893 | is_metadata = 1; |
1894 | BUG_ON(BTRFS_SUPER_INFO_SIZE & (PAGE_CACHE_SIZE - 1)); | ||
1895 | processed_len = BTRFS_SUPER_INFO_SIZE; | ||
1672 | if (state->print_mask & | 1896 | if (state->print_mask & |
1673 | BTRFSIC_PRINT_MASK_TREE_BEFORE_SB_WRITE) { | 1897 | BTRFSIC_PRINT_MASK_TREE_BEFORE_SB_WRITE) { |
1674 | printk(KERN_INFO | 1898 | printk(KERN_INFO |
@@ -1678,12 +1902,18 @@ static void btrfsic_process_written_block(struct btrfsic_dev_state *dev_state, | |||
1678 | } | 1902 | } |
1679 | if (is_metadata) { | 1903 | if (is_metadata) { |
1680 | if (!block->is_superblock) { | 1904 | if (!block->is_superblock) { |
1905 | if (num_pages * PAGE_CACHE_SIZE < | ||
1906 | state->metablock_size) { | ||
1907 | printk(KERN_INFO | ||
1908 | "btrfsic: cannot work with too short bios!\n"); | ||
1909 | return; | ||
1910 | } | ||
1911 | processed_len = state->metablock_size; | ||
1681 | bytenr = le64_to_cpu(((struct btrfs_header *) | 1912 | bytenr = le64_to_cpu(((struct btrfs_header *) |
1682 | mapped_data)->bytenr); | 1913 | mapped_datav[0])->bytenr); |
1683 | btrfsic_cmp_log_and_dev_bytenr(state, bytenr, | 1914 | btrfsic_cmp_log_and_dev_bytenr(state, bytenr, |
1684 | dev_state, | 1915 | dev_state, |
1685 | dev_bytenr, | 1916 | dev_bytenr); |
1686 | mapped_data); | ||
1687 | } | 1917 | } |
1688 | if (block->logical_bytenr != bytenr) { | 1918 | if (block->logical_bytenr != bytenr) { |
1689 | printk(KERN_INFO | 1919 | printk(KERN_INFO |
@@ -1710,6 +1940,13 @@ static void btrfsic_process_written_block(struct btrfsic_dev_state *dev_state, | |||
1710 | block->mirror_num, | 1940 | block->mirror_num, |
1711 | btrfsic_get_block_type(state, block)); | 1941 | btrfsic_get_block_type(state, block)); |
1712 | } else { | 1942 | } else { |
1943 | if (num_pages * PAGE_CACHE_SIZE < | ||
1944 | state->datablock_size) { | ||
1945 | printk(KERN_INFO | ||
1946 | "btrfsic: cannot work with too short bios!\n"); | ||
1947 | return; | ||
1948 | } | ||
1949 | processed_len = state->datablock_size; | ||
1713 | bytenr = block->logical_bytenr; | 1950 | bytenr = block->logical_bytenr; |
1714 | if (state->print_mask & BTRFSIC_PRINT_MASK_VERBOSE) | 1951 | if (state->print_mask & BTRFSIC_PRINT_MASK_VERBOSE) |
1715 | printk(KERN_INFO | 1952 | printk(KERN_INFO |
@@ -1747,7 +1984,7 @@ static void btrfsic_process_written_block(struct btrfsic_dev_state *dev_state, | |||
1747 | le64_to_cpu(block->disk_key.offset), | 1984 | le64_to_cpu(block->disk_key.offset), |
1748 | (unsigned long long) | 1985 | (unsigned long long) |
1749 | le64_to_cpu(((struct btrfs_header *) | 1986 | le64_to_cpu(((struct btrfs_header *) |
1750 | mapped_data)->generation), | 1987 | mapped_datav[0])->generation), |
1751 | (unsigned long long) | 1988 | (unsigned long long) |
1752 | state->max_superblock_generation); | 1989 | state->max_superblock_generation); |
1753 | btrfsic_dump_tree(state); | 1990 | btrfsic_dump_tree(state); |
@@ -1765,10 +2002,10 @@ static void btrfsic_process_written_block(struct btrfsic_dev_state *dev_state, | |||
1765 | (unsigned long long)block->generation, | 2002 | (unsigned long long)block->generation, |
1766 | (unsigned long long) | 2003 | (unsigned long long) |
1767 | le64_to_cpu(((struct btrfs_header *) | 2004 | le64_to_cpu(((struct btrfs_header *) |
1768 | mapped_data)->generation)); | 2005 | mapped_datav[0])->generation)); |
1769 | /* it would not be safe to go on */ | 2006 | /* it would not be safe to go on */ |
1770 | btrfsic_dump_tree(state); | 2007 | btrfsic_dump_tree(state); |
1771 | return; | 2008 | goto continue_loop; |
1772 | } | 2009 | } |
1773 | 2010 | ||
1774 | /* | 2011 | /* |
@@ -1796,18 +2033,19 @@ static void btrfsic_process_written_block(struct btrfsic_dev_state *dev_state, | |||
1796 | } | 2033 | } |
1797 | 2034 | ||
1798 | if (block->is_superblock) | 2035 | if (block->is_superblock) |
1799 | ret = btrfsic_map_superblock(state, bytenr, len, | 2036 | ret = btrfsic_map_superblock(state, bytenr, |
2037 | processed_len, | ||
1800 | bdev, &block_ctx); | 2038 | bdev, &block_ctx); |
1801 | else | 2039 | else |
1802 | ret = btrfsic_map_block(state, bytenr, len, | 2040 | ret = btrfsic_map_block(state, bytenr, processed_len, |
1803 | &block_ctx, 0); | 2041 | &block_ctx, 0); |
1804 | if (ret) { | 2042 | if (ret) { |
1805 | printk(KERN_INFO | 2043 | printk(KERN_INFO |
1806 | "btrfsic: btrfsic_map_block(root @%llu)" | 2044 | "btrfsic: btrfsic_map_block(root @%llu)" |
1807 | " failed!\n", (unsigned long long)bytenr); | 2045 | " failed!\n", (unsigned long long)bytenr); |
1808 | return; | 2046 | goto continue_loop; |
1809 | } | 2047 | } |
1810 | block_ctx.data = mapped_data; | 2048 | block_ctx.datav = mapped_datav; |
1811 | /* the following is required in case of writes to mirrors, | 2049 | /* the following is required in case of writes to mirrors, |
1812 | * use the same that was used for the lookup */ | 2050 | * use the same that was used for the lookup */ |
1813 | block_ctx.dev = dev_state; | 2051 | block_ctx.dev = dev_state; |
@@ -1863,11 +2101,13 @@ static void btrfsic_process_written_block(struct btrfsic_dev_state *dev_state, | |||
1863 | block->logical_bytenr = bytenr; | 2101 | block->logical_bytenr = bytenr; |
1864 | block->is_metadata = 1; | 2102 | block->is_metadata = 1; |
1865 | if (block->is_superblock) { | 2103 | if (block->is_superblock) { |
2104 | BUG_ON(PAGE_CACHE_SIZE != | ||
2105 | BTRFS_SUPER_INFO_SIZE); | ||
1866 | ret = btrfsic_process_written_superblock( | 2106 | ret = btrfsic_process_written_superblock( |
1867 | state, | 2107 | state, |
1868 | block, | 2108 | block, |
1869 | (struct btrfs_super_block *) | 2109 | (struct btrfs_super_block *) |
1870 | mapped_data); | 2110 | mapped_datav[0]); |
1871 | if (state->print_mask & | 2111 | if (state->print_mask & |
1872 | BTRFSIC_PRINT_MASK_TREE_AFTER_SB_WRITE) { | 2112 | BTRFSIC_PRINT_MASK_TREE_AFTER_SB_WRITE) { |
1873 | printk(KERN_INFO | 2113 | printk(KERN_INFO |
@@ -1880,8 +2120,6 @@ static void btrfsic_process_written_block(struct btrfsic_dev_state *dev_state, | |||
1880 | state, | 2120 | state, |
1881 | block, | 2121 | block, |
1882 | &block_ctx, | 2122 | &block_ctx, |
1883 | (struct btrfs_header *) | ||
1884 | block_ctx.data, | ||
1885 | 0, 0); | 2123 | 0, 0); |
1886 | } | 2124 | } |
1887 | if (ret) | 2125 | if (ret) |
@@ -1912,26 +2150,30 @@ static void btrfsic_process_written_block(struct btrfsic_dev_state *dev_state, | |||
1912 | u64 bytenr; | 2150 | u64 bytenr; |
1913 | 2151 | ||
1914 | if (!is_metadata) { | 2152 | if (!is_metadata) { |
2153 | processed_len = state->datablock_size; | ||
1915 | if (state->print_mask & BTRFSIC_PRINT_MASK_VERBOSE) | 2154 | if (state->print_mask & BTRFSIC_PRINT_MASK_VERBOSE) |
1916 | printk(KERN_INFO "Written block (%s/%llu/?)" | 2155 | printk(KERN_INFO "Written block (%s/%llu/?)" |
1917 | " !found in hash table, D.\n", | 2156 | " !found in hash table, D.\n", |
1918 | dev_state->name, | 2157 | dev_state->name, |
1919 | (unsigned long long)dev_bytenr); | 2158 | (unsigned long long)dev_bytenr); |
1920 | if (!state->include_extent_data) | 2159 | if (!state->include_extent_data) { |
1921 | return; /* ignore that written D block */ | 2160 | /* ignore that written D block */ |
2161 | goto continue_loop; | ||
2162 | } | ||
1922 | 2163 | ||
1923 | /* this is getting ugly for the | 2164 | /* this is getting ugly for the |
1924 | * include_extent_data case... */ | 2165 | * include_extent_data case... */ |
1925 | bytenr = 0; /* unknown */ | 2166 | bytenr = 0; /* unknown */ |
1926 | block_ctx.start = bytenr; | 2167 | block_ctx.start = bytenr; |
1927 | block_ctx.len = len; | 2168 | block_ctx.len = processed_len; |
1928 | block_ctx.bh = NULL; | 2169 | block_ctx.mem_to_free = NULL; |
2170 | block_ctx.pagev = NULL; | ||
1929 | } else { | 2171 | } else { |
2172 | processed_len = state->metablock_size; | ||
1930 | bytenr = le64_to_cpu(((struct btrfs_header *) | 2173 | bytenr = le64_to_cpu(((struct btrfs_header *) |
1931 | mapped_data)->bytenr); | 2174 | mapped_datav[0])->bytenr); |
1932 | btrfsic_cmp_log_and_dev_bytenr(state, bytenr, dev_state, | 2175 | btrfsic_cmp_log_and_dev_bytenr(state, bytenr, dev_state, |
1933 | dev_bytenr, | 2176 | dev_bytenr); |
1934 | mapped_data); | ||
1935 | if (state->print_mask & BTRFSIC_PRINT_MASK_VERBOSE) | 2177 | if (state->print_mask & BTRFSIC_PRINT_MASK_VERBOSE) |
1936 | printk(KERN_INFO | 2178 | printk(KERN_INFO |
1937 | "Written block @%llu (%s/%llu/?)" | 2179 | "Written block @%llu (%s/%llu/?)" |
@@ -1940,17 +2182,17 @@ static void btrfsic_process_written_block(struct btrfsic_dev_state *dev_state, | |||
1940 | dev_state->name, | 2182 | dev_state->name, |
1941 | (unsigned long long)dev_bytenr); | 2183 | (unsigned long long)dev_bytenr); |
1942 | 2184 | ||
1943 | ret = btrfsic_map_block(state, bytenr, len, &block_ctx, | 2185 | ret = btrfsic_map_block(state, bytenr, processed_len, |
1944 | 0); | 2186 | &block_ctx, 0); |
1945 | if (ret) { | 2187 | if (ret) { |
1946 | printk(KERN_INFO | 2188 | printk(KERN_INFO |
1947 | "btrfsic: btrfsic_map_block(root @%llu)" | 2189 | "btrfsic: btrfsic_map_block(root @%llu)" |
1948 | " failed!\n", | 2190 | " failed!\n", |
1949 | (unsigned long long)dev_bytenr); | 2191 | (unsigned long long)dev_bytenr); |
1950 | return; | 2192 | goto continue_loop; |
1951 | } | 2193 | } |
1952 | } | 2194 | } |
1953 | block_ctx.data = mapped_data; | 2195 | block_ctx.datav = mapped_datav; |
1954 | /* the following is required in case of writes to mirrors, | 2196 | /* the following is required in case of writes to mirrors, |
1955 | * use the same that was used for the lookup */ | 2197 | * use the same that was used for the lookup */ |
1956 | block_ctx.dev = dev_state; | 2198 | block_ctx.dev = dev_state; |
@@ -1960,7 +2202,7 @@ static void btrfsic_process_written_block(struct btrfsic_dev_state *dev_state, | |||
1960 | if (NULL == block) { | 2202 | if (NULL == block) { |
1961 | printk(KERN_INFO "btrfsic: error, kmalloc failed!\n"); | 2203 | printk(KERN_INFO "btrfsic: error, kmalloc failed!\n"); |
1962 | btrfsic_release_block_ctx(&block_ctx); | 2204 | btrfsic_release_block_ctx(&block_ctx); |
1963 | return; | 2205 | goto continue_loop; |
1964 | } | 2206 | } |
1965 | block->dev_state = dev_state; | 2207 | block->dev_state = dev_state; |
1966 | block->dev_bytenr = dev_bytenr; | 2208 | block->dev_bytenr = dev_bytenr; |
@@ -2020,9 +2262,7 @@ static void btrfsic_process_written_block(struct btrfsic_dev_state *dev_state, | |||
2020 | 2262 | ||
2021 | if (is_metadata) { | 2263 | if (is_metadata) { |
2022 | ret = btrfsic_process_metablock(state, block, | 2264 | ret = btrfsic_process_metablock(state, block, |
2023 | &block_ctx, | 2265 | &block_ctx, 0, 0); |
2024 | (struct btrfs_header *) | ||
2025 | block_ctx.data, 0, 0); | ||
2026 | if (ret) | 2266 | if (ret) |
2027 | printk(KERN_INFO | 2267 | printk(KERN_INFO |
2028 | "btrfsic: process_metablock(root @%llu)" | 2268 | "btrfsic: process_metablock(root @%llu)" |
@@ -2031,6 +2271,13 @@ static void btrfsic_process_written_block(struct btrfsic_dev_state *dev_state, | |||
2031 | } | 2271 | } |
2032 | btrfsic_release_block_ctx(&block_ctx); | 2272 | btrfsic_release_block_ctx(&block_ctx); |
2033 | } | 2273 | } |
2274 | |||
2275 | continue_loop: | ||
2276 | BUG_ON(!processed_len); | ||
2277 | dev_bytenr += processed_len; | ||
2278 | mapped_datav += processed_len >> PAGE_CACHE_SHIFT; | ||
2279 | num_pages -= processed_len >> PAGE_CACHE_SHIFT; | ||
2280 | goto again; | ||
2034 | } | 2281 | } |
2035 | 2282 | ||
2036 | static void btrfsic_bio_end_io(struct bio *bp, int bio_error_status) | 2283 | static void btrfsic_bio_end_io(struct bio *bp, int bio_error_status) |
@@ -2213,7 +2460,7 @@ static int btrfsic_process_written_superblock( | |||
2213 | 2460 | ||
2214 | num_copies = | 2461 | num_copies = |
2215 | btrfs_num_copies(&state->root->fs_info->mapping_tree, | 2462 | btrfs_num_copies(&state->root->fs_info->mapping_tree, |
2216 | next_bytenr, PAGE_SIZE); | 2463 | next_bytenr, BTRFS_SUPER_INFO_SIZE); |
2217 | if (state->print_mask & BTRFSIC_PRINT_MASK_NUM_COPIES) | 2464 | if (state->print_mask & BTRFSIC_PRINT_MASK_NUM_COPIES) |
2218 | printk(KERN_INFO "num_copies(log_bytenr=%llu) = %d\n", | 2465 | printk(KERN_INFO "num_copies(log_bytenr=%llu) = %d\n", |
2219 | (unsigned long long)next_bytenr, num_copies); | 2466 | (unsigned long long)next_bytenr, num_copies); |
@@ -2224,7 +2471,8 @@ static int btrfsic_process_written_superblock( | |||
2224 | printk(KERN_INFO | 2471 | printk(KERN_INFO |
2225 | "btrfsic_process_written_superblock(" | 2472 | "btrfsic_process_written_superblock(" |
2226 | "mirror_num=%d)\n", mirror_num); | 2473 | "mirror_num=%d)\n", mirror_num); |
2227 | ret = btrfsic_map_block(state, next_bytenr, PAGE_SIZE, | 2474 | ret = btrfsic_map_block(state, next_bytenr, |
2475 | BTRFS_SUPER_INFO_SIZE, | ||
2228 | &tmp_next_block_ctx, | 2476 | &tmp_next_block_ctx, |
2229 | mirror_num); | 2477 | mirror_num); |
2230 | if (ret) { | 2478 | if (ret) { |
@@ -2689,7 +2937,7 @@ static struct btrfsic_block *btrfsic_block_lookup_or_add( | |||
2689 | static void btrfsic_cmp_log_and_dev_bytenr(struct btrfsic_state *state, | 2937 | static void btrfsic_cmp_log_and_dev_bytenr(struct btrfsic_state *state, |
2690 | u64 bytenr, | 2938 | u64 bytenr, |
2691 | struct btrfsic_dev_state *dev_state, | 2939 | struct btrfsic_dev_state *dev_state, |
2692 | u64 dev_bytenr, char *data) | 2940 | u64 dev_bytenr) |
2693 | { | 2941 | { |
2694 | int num_copies; | 2942 | int num_copies; |
2695 | int mirror_num; | 2943 | int mirror_num; |
@@ -2698,10 +2946,10 @@ static void btrfsic_cmp_log_and_dev_bytenr(struct btrfsic_state *state, | |||
2698 | int match = 0; | 2946 | int match = 0; |
2699 | 2947 | ||
2700 | num_copies = btrfs_num_copies(&state->root->fs_info->mapping_tree, | 2948 | num_copies = btrfs_num_copies(&state->root->fs_info->mapping_tree, |
2701 | bytenr, PAGE_SIZE); | 2949 | bytenr, state->metablock_size); |
2702 | 2950 | ||
2703 | for (mirror_num = 1; mirror_num <= num_copies; mirror_num++) { | 2951 | for (mirror_num = 1; mirror_num <= num_copies; mirror_num++) { |
2704 | ret = btrfsic_map_block(state, bytenr, PAGE_SIZE, | 2952 | ret = btrfsic_map_block(state, bytenr, state->metablock_size, |
2705 | &block_ctx, mirror_num); | 2953 | &block_ctx, mirror_num); |
2706 | if (ret) { | 2954 | if (ret) { |
2707 | printk(KERN_INFO "btrfsic:" | 2955 | printk(KERN_INFO "btrfsic:" |
@@ -2727,7 +2975,8 @@ static void btrfsic_cmp_log_and_dev_bytenr(struct btrfsic_state *state, | |||
2727 | (unsigned long long)bytenr, dev_state->name, | 2975 | (unsigned long long)bytenr, dev_state->name, |
2728 | (unsigned long long)dev_bytenr); | 2976 | (unsigned long long)dev_bytenr); |
2729 | for (mirror_num = 1; mirror_num <= num_copies; mirror_num++) { | 2977 | for (mirror_num = 1; mirror_num <= num_copies; mirror_num++) { |
2730 | ret = btrfsic_map_block(state, bytenr, PAGE_SIZE, | 2978 | ret = btrfsic_map_block(state, bytenr, |
2979 | state->metablock_size, | ||
2731 | &block_ctx, mirror_num); | 2980 | &block_ctx, mirror_num); |
2732 | if (ret) | 2981 | if (ret) |
2733 | continue; | 2982 | continue; |
@@ -2781,13 +3030,13 @@ int btrfsic_submit_bh(int rw, struct buffer_head *bh) | |||
2781 | (unsigned long)bh->b_size, bh->b_data, | 3030 | (unsigned long)bh->b_size, bh->b_data, |
2782 | bh->b_bdev); | 3031 | bh->b_bdev); |
2783 | btrfsic_process_written_block(dev_state, dev_bytenr, | 3032 | btrfsic_process_written_block(dev_state, dev_bytenr, |
2784 | bh->b_data, bh->b_size, NULL, | 3033 | &bh->b_data, 1, NULL, |
2785 | NULL, bh, rw); | 3034 | NULL, bh, rw); |
2786 | } else if (NULL != dev_state && (rw & REQ_FLUSH)) { | 3035 | } else if (NULL != dev_state && (rw & REQ_FLUSH)) { |
2787 | if (dev_state->state->print_mask & | 3036 | if (dev_state->state->print_mask & |
2788 | BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH) | 3037 | BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH) |
2789 | printk(KERN_INFO | 3038 | printk(KERN_INFO |
2790 | "submit_bh(rw=0x%x) FLUSH, bdev=%p)\n", | 3039 | "submit_bh(rw=0x%x FLUSH, bdev=%p)\n", |
2791 | rw, bh->b_bdev); | 3040 | rw, bh->b_bdev); |
2792 | if (!dev_state->dummy_block_for_bio_bh_flush.is_iodone) { | 3041 | if (!dev_state->dummy_block_for_bio_bh_flush.is_iodone) { |
2793 | if ((dev_state->state->print_mask & | 3042 | if ((dev_state->state->print_mask & |
@@ -2836,6 +3085,7 @@ void btrfsic_submit_bio(int rw, struct bio *bio) | |||
2836 | unsigned int i; | 3085 | unsigned int i; |
2837 | u64 dev_bytenr; | 3086 | u64 dev_bytenr; |
2838 | int bio_is_patched; | 3087 | int bio_is_patched; |
3088 | char **mapped_datav; | ||
2839 | 3089 | ||
2840 | dev_bytenr = 512 * bio->bi_sector; | 3090 | dev_bytenr = 512 * bio->bi_sector; |
2841 | bio_is_patched = 0; | 3091 | bio_is_patched = 0; |
@@ -2848,35 +3098,46 @@ void btrfsic_submit_bio(int rw, struct bio *bio) | |||
2848 | (unsigned long long)dev_bytenr, | 3098 | (unsigned long long)dev_bytenr, |
2849 | bio->bi_bdev); | 3099 | bio->bi_bdev); |
2850 | 3100 | ||
3101 | mapped_datav = kmalloc(sizeof(*mapped_datav) * bio->bi_vcnt, | ||
3102 | GFP_NOFS); | ||
3103 | if (!mapped_datav) | ||
3104 | goto leave; | ||
2851 | for (i = 0; i < bio->bi_vcnt; i++) { | 3105 | for (i = 0; i < bio->bi_vcnt; i++) { |
2852 | u8 *mapped_data; | 3106 | BUG_ON(bio->bi_io_vec[i].bv_len != PAGE_CACHE_SIZE); |
2853 | 3107 | mapped_datav[i] = kmap(bio->bi_io_vec[i].bv_page); | |
2854 | mapped_data = kmap(bio->bi_io_vec[i].bv_page); | 3108 | if (!mapped_datav[i]) { |
3109 | while (i > 0) { | ||
3110 | i--; | ||
3111 | kunmap(bio->bi_io_vec[i].bv_page); | ||
3112 | } | ||
3113 | kfree(mapped_datav); | ||
3114 | goto leave; | ||
3115 | } | ||
2855 | if ((BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH | | 3116 | if ((BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH | |
2856 | BTRFSIC_PRINT_MASK_VERBOSE) == | 3117 | BTRFSIC_PRINT_MASK_VERBOSE) == |
2857 | (dev_state->state->print_mask & | 3118 | (dev_state->state->print_mask & |
2858 | (BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH | | 3119 | (BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH | |
2859 | BTRFSIC_PRINT_MASK_VERBOSE))) | 3120 | BTRFSIC_PRINT_MASK_VERBOSE))) |
2860 | printk(KERN_INFO | 3121 | printk(KERN_INFO |
2861 | "#%u: page=%p, mapped=%p, len=%u," | 3122 | "#%u: page=%p, len=%u, offset=%u\n", |
2862 | " offset=%u\n", | ||
2863 | i, bio->bi_io_vec[i].bv_page, | 3123 | i, bio->bi_io_vec[i].bv_page, |
2864 | mapped_data, | ||
2865 | bio->bi_io_vec[i].bv_len, | 3124 | bio->bi_io_vec[i].bv_len, |
2866 | bio->bi_io_vec[i].bv_offset); | 3125 | bio->bi_io_vec[i].bv_offset); |
2867 | btrfsic_process_written_block(dev_state, dev_bytenr, | 3126 | } |
2868 | mapped_data, | 3127 | btrfsic_process_written_block(dev_state, dev_bytenr, |
2869 | bio->bi_io_vec[i].bv_len, | 3128 | mapped_datav, bio->bi_vcnt, |
2870 | bio, &bio_is_patched, | 3129 | bio, &bio_is_patched, |
2871 | NULL, rw); | 3130 | NULL, rw); |
3131 | while (i > 0) { | ||
3132 | i--; | ||
2872 | kunmap(bio->bi_io_vec[i].bv_page); | 3133 | kunmap(bio->bi_io_vec[i].bv_page); |
2873 | dev_bytenr += bio->bi_io_vec[i].bv_len; | ||
2874 | } | 3134 | } |
3135 | kfree(mapped_datav); | ||
2875 | } else if (NULL != dev_state && (rw & REQ_FLUSH)) { | 3136 | } else if (NULL != dev_state && (rw & REQ_FLUSH)) { |
2876 | if (dev_state->state->print_mask & | 3137 | if (dev_state->state->print_mask & |
2877 | BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH) | 3138 | BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH) |
2878 | printk(KERN_INFO | 3139 | printk(KERN_INFO |
2879 | "submit_bio(rw=0x%x) FLUSH, bdev=%p)\n", | 3140 | "submit_bio(rw=0x%x FLUSH, bdev=%p)\n", |
2880 | rw, bio->bi_bdev); | 3141 | rw, bio->bi_bdev); |
2881 | if (!dev_state->dummy_block_for_bio_bh_flush.is_iodone) { | 3142 | if (!dev_state->dummy_block_for_bio_bh_flush.is_iodone) { |
2882 | if ((dev_state->state->print_mask & | 3143 | if ((dev_state->state->print_mask & |
@@ -2903,6 +3164,7 @@ void btrfsic_submit_bio(int rw, struct bio *bio) | |||
2903 | bio->bi_end_io = btrfsic_bio_end_io; | 3164 | bio->bi_end_io = btrfsic_bio_end_io; |
2904 | } | 3165 | } |
2905 | } | 3166 | } |
3167 | leave: | ||
2906 | mutex_unlock(&btrfsic_mutex); | 3168 | mutex_unlock(&btrfsic_mutex); |
2907 | 3169 | ||
2908 | submit_bio(rw, bio); | 3170 | submit_bio(rw, bio); |
@@ -2917,6 +3179,30 @@ int btrfsic_mount(struct btrfs_root *root, | |||
2917 | struct list_head *dev_head = &fs_devices->devices; | 3179 | struct list_head *dev_head = &fs_devices->devices; |
2918 | struct btrfs_device *device; | 3180 | struct btrfs_device *device; |
2919 | 3181 | ||
3182 | if (root->nodesize != root->leafsize) { | ||
3183 | printk(KERN_INFO | ||
3184 | "btrfsic: cannot handle nodesize %d != leafsize %d!\n", | ||
3185 | root->nodesize, root->leafsize); | ||
3186 | return -1; | ||
3187 | } | ||
3188 | if (root->nodesize & ((u64)PAGE_CACHE_SIZE - 1)) { | ||
3189 | printk(KERN_INFO | ||
3190 | "btrfsic: cannot handle nodesize %d not being a multiple of PAGE_CACHE_SIZE %ld!\n", | ||
3191 | root->nodesize, (unsigned long)PAGE_CACHE_SIZE); | ||
3192 | return -1; | ||
3193 | } | ||
3194 | if (root->leafsize & ((u64)PAGE_CACHE_SIZE - 1)) { | ||
3195 | printk(KERN_INFO | ||
3196 | "btrfsic: cannot handle leafsize %d not being a multiple of PAGE_CACHE_SIZE %ld!\n", | ||
3197 | root->leafsize, (unsigned long)PAGE_CACHE_SIZE); | ||
3198 | return -1; | ||
3199 | } | ||
3200 | if (root->sectorsize & ((u64)PAGE_CACHE_SIZE - 1)) { | ||
3201 | printk(KERN_INFO | ||
3202 | "btrfsic: cannot handle sectorsize %d not being a multiple of PAGE_CACHE_SIZE %ld!\n", | ||
3203 | root->sectorsize, (unsigned long)PAGE_CACHE_SIZE); | ||
3204 | return -1; | ||
3205 | } | ||
2920 | state = kzalloc(sizeof(*state), GFP_NOFS); | 3206 | state = kzalloc(sizeof(*state), GFP_NOFS); |
2921 | if (NULL == state) { | 3207 | if (NULL == state) { |
2922 | printk(KERN_INFO "btrfs check-integrity: kmalloc() failed!\n"); | 3208 | printk(KERN_INFO "btrfs check-integrity: kmalloc() failed!\n"); |
@@ -2933,6 +3219,8 @@ int btrfsic_mount(struct btrfs_root *root, | |||
2933 | state->print_mask = print_mask; | 3219 | state->print_mask = print_mask; |
2934 | state->include_extent_data = including_extent_data; | 3220 | state->include_extent_data = including_extent_data; |
2935 | state->csum_size = 0; | 3221 | state->csum_size = 0; |
3222 | state->metablock_size = root->nodesize; | ||
3223 | state->datablock_size = root->sectorsize; | ||
2936 | INIT_LIST_HEAD(&state->all_blocks_list); | 3224 | INIT_LIST_HEAD(&state->all_blocks_list); |
2937 | btrfsic_block_hashtable_init(&state->block_hashtable); | 3225 | btrfsic_block_hashtable_init(&state->block_hashtable); |
2938 | btrfsic_block_link_hashtable_init(&state->block_link_hashtable); | 3226 | btrfsic_block_link_hashtable_init(&state->block_link_hashtable); |
@@ -3049,7 +3337,7 @@ void btrfsic_unmount(struct btrfs_root *root, | |||
3049 | btrfsic_block_link_free(l); | 3337 | btrfsic_block_link_free(l); |
3050 | } | 3338 | } |
3051 | 3339 | ||
3052 | if (b_all->is_iodone) | 3340 | if (b_all->is_iodone || b_all->never_written) |
3053 | btrfsic_block_free(b_all); | 3341 | btrfsic_block_free(b_all); |
3054 | else | 3342 | else |
3055 | printk(KERN_INFO "btrfs: attempt to free %c-block" | 3343 | printk(KERN_INFO "btrfs: attempt to free %c-block" |