- csum_result = btrfs_csum_data(root, data, csum_result, len);
- btrfs_csum_final(csum_result, (char *)&csum_result);
- write_extent_buffer(leaf, &csum_result, (unsigned long)item,
- BTRFS_CRC32_SIZE);
+ item_end = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_csum_item);
+ item_end = (struct btrfs_csum_item *)((unsigned char *)item_end +
+ btrfs_item_size_nr(leaf, path->slots[0]));
+ eb_token = NULL;
+next_bvec:
+
+ if (!eb_token ||
+ (unsigned long)item + BTRFS_CRC32_SIZE >= map_start + map_len) {
+ int err;
+
+ if (eb_token)
+ unmap_extent_buffer(leaf, eb_token, KM_USER1);
+ eb_token = NULL;
+ err = map_private_extent_buffer(leaf, (unsigned long)item,
+ BTRFS_CRC32_SIZE,
+ &eb_token, &eb_map,
+ &map_start, &map_len, KM_USER1);
+ if (err)
+ eb_token = NULL;
+ }
+ if (eb_token) {
+ memcpy(eb_token + ((unsigned long)item & (PAGE_CACHE_SIZE - 1)),
+ sums32, BTRFS_CRC32_SIZE);
+ } else {
+ write_extent_buffer(leaf, sums32, (unsigned long)item,
+ BTRFS_CRC32_SIZE);
+ }
+ bio_index++;
+ bvec++;
+ sums32++;
+ if (bio_index < bio->bi_vcnt) {
+ item = (struct btrfs_csum_item *)((char *)item +
+ BTRFS_CRC32_SIZE);
+ if (item < item_end && offset + PAGE_CACHE_SIZE ==
+ page_offset(bvec->bv_page)) {
+ offset = page_offset(bvec->bv_page);
+ goto next_bvec;
+ }
+ }
+ if (eb_token) {
+ unmap_extent_buffer(leaf, eb_token, KM_USER1);
+ eb_token = NULL;
+ }