return 0;
}
-static int btree_writepage_io_hook(struct page *page, u64 start, u64 end)
-{
- struct btrfs_root *root = BTRFS_I(page->mapping->host)->root;
-
- csum_dirty_buffer(root, page);
- return 0;
-}
-
int btree_readpage_end_io_hook(struct page *page, u64 start, u64 end,
struct extent_state *state)
{
return 0;
}
+static int btree_csum_one_bio(struct bio *bio)
+{
+ struct bio_vec *bvec = bio->bi_io_vec;
+ int bio_index = 0;
+ struct btrfs_root *root;
+
+ WARN_ON(bio->bi_vcnt <= 0);
+ while(bio_index < bio->bi_vcnt) {
+ root = BTRFS_I(bvec->bv_page->mapping->host)->root;
+ csum_dirty_buffer(root, bvec->bv_page);
+ bio_index++;
+ bvec++;
+ }
+ return 0;
+}
+
static int __btree_submit_bio_hook(struct inode *inode, int rw, struct bio *bio,
int mirror_num)
{
* submission context. Just jump into btrfs_map_bio
*/
if (rw & (1 << BIO_RW)) {
+ btree_csum_one_bio(bio);
return btrfs_map_bio(BTRFS_I(inode)->root, rw, bio,
mirror_num, 1);
}
static struct extent_io_ops btree_extent_io_ops = {
.write_cache_pages_lock_hook = btree_lock_page_hook,
- .writepage_io_hook = btree_writepage_io_hook,
.readpage_end_io_hook = btree_readpage_end_io_hook,
.submit_bio_hook = btree_submit_bio_hook,
/* note we're sharing with inode.c for the merge bio hook */