+int btrfs_csum_one_bio(struct btrfs_root *root,
+ struct bio *bio, char **sums_ret)
+{
+ u32 *sums;
+ char *data;
+ struct bio_vec *bvec = bio->bi_io_vec;
+ int bio_index = 0;
+
+ sums = kmalloc(bio->bi_vcnt * BTRFS_CRC32_SIZE, GFP_NOFS);
+ if (!sums)
+ return -ENOMEM;
+ *sums_ret = (char *)sums;
+
+ while(bio_index < bio->bi_vcnt) {
+ data = kmap_atomic(bvec->bv_page, KM_USER0);
+ *sums = ~(u32)0;
+ *sums = btrfs_csum_data(root, data + bvec->bv_offset,
+ *sums, bvec->bv_len);
+ kunmap_atomic(data, KM_USER0);
+ btrfs_csum_final(*sums, (char *)sums);
+ sums++;
+ bio_index++;
+ bvec++;
+ }
+ return 0;
+}
+