Btrfs: Checksum tree blocks in the background
authorChris Mason <chris.mason@oracle.com>
Tue, 23 Sep 2008 17:14:12 +0000 (13:14 -0400)
committerChris Mason <chris.mason@oracle.com>
Thu, 25 Sep 2008 15:04:07 +0000 (11:04 -0400)
Tree blocks were using async bio submission, but the sum was still
being done directly during writepage.  This moves the checksumming
into the worker thread.

Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/disk-io.c

index 535bd0fe1a7138a830e5e965ed566cffd25b4167..25be96946a2faa817bdc6ec7c7016e0ed7384c0e 100644 (file)
@@ -315,14 +315,6 @@ out:
        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)
 {
@@ -501,6 +493,22 @@ int btrfs_wq_submit_bio(struct btrfs_fs_info *fs_info, struct inode *inode,
        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)
 {
@@ -515,6 +523,7 @@ static int __btree_submit_bio_hook(struct inode *inode, int rw, struct bio *bio,
         * 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);
        }
@@ -2040,7 +2049,6 @@ out:
 
 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 */