Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Btrfs: add rw argument to merge_bio_hook()

We'll want to merge writes so they can fill a full RAID[56] stripe, but
not necessarily reads.

Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Signed-off-by: Chris Mason <chris.mason@fusionio.com>

authored by

David Woodhouse and committed by
Chris Mason
64a16701 3c911608

+11 -11
+2 -2
fs/btrfs/compression.c
··· 372 372 page = compressed_pages[pg_index]; 373 373 page->mapping = inode->i_mapping; 374 374 if (bio->bi_size) 375 - ret = io_tree->ops->merge_bio_hook(page, 0, 375 + ret = io_tree->ops->merge_bio_hook(WRITE, page, 0, 376 376 PAGE_CACHE_SIZE, 377 377 bio, 0); 378 378 else ··· 655 655 page->index = em_start >> PAGE_CACHE_SHIFT; 656 656 657 657 if (comp_bio->bi_size) 658 - ret = tree->ops->merge_bio_hook(page, 0, 658 + ret = tree->ops->merge_bio_hook(READ, page, 0, 659 659 PAGE_CACHE_SIZE, 660 660 comp_bio, 0); 661 661 else
+3 -3
fs/btrfs/ctree.h
··· 3459 3459 struct writeback_control *wbc); 3460 3460 int btrfs_create_subvol_root(struct btrfs_trans_handle *trans, 3461 3461 struct btrfs_root *new_root, u64 new_dirid); 3462 - int btrfs_merge_bio_hook(struct page *page, unsigned long offset, 3463 - size_t size, struct bio *bio, unsigned long bio_flags); 3464 - 3462 + int btrfs_merge_bio_hook(int rw, struct page *page, unsigned long offset, 3463 + size_t size, struct bio *bio, 3464 + unsigned long bio_flags); 3465 3465 int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf); 3466 3466 int btrfs_readpage(struct file *file, struct page *page); 3467 3467 void btrfs_evict_inode(struct inode *inode);
+3 -3
fs/btrfs/extent_io.c
··· 2489 2489 return ret; 2490 2490 } 2491 2491 2492 - static int merge_bio(struct extent_io_tree *tree, struct page *page, 2492 + static int merge_bio(int rw, struct extent_io_tree *tree, struct page *page, 2493 2493 unsigned long offset, size_t size, struct bio *bio, 2494 2494 unsigned long bio_flags) 2495 2495 { 2496 2496 int ret = 0; 2497 2497 if (tree->ops && tree->ops->merge_bio_hook) 2498 - ret = tree->ops->merge_bio_hook(page, offset, size, bio, 2498 + ret = tree->ops->merge_bio_hook(rw, page, offset, size, bio, 2499 2499 bio_flags); 2500 2500 BUG_ON(ret < 0); 2501 2501 return ret; ··· 2530 2530 sector; 2531 2531 2532 2532 if (prev_bio_flags != bio_flags || !contig || 2533 - merge_bio(tree, page, offset, page_size, bio, bio_flags) || 2533 + merge_bio(rw, tree, page, offset, page_size, bio, bio_flags) || 2534 2534 bio_add_page(bio, page, page_size, offset) < page_size) { 2535 2535 ret = submit_one_bio(rw, bio, mirror_num, 2536 2536 prev_bio_flags);
+1 -1
fs/btrfs/extent_io.h
··· 72 72 int (*writepage_start_hook)(struct page *page, u64 start, u64 end); 73 73 int (*writepage_io_hook)(struct page *page, u64 start, u64 end); 74 74 extent_submit_bio_hook_t *submit_bio_hook; 75 - int (*merge_bio_hook)(struct page *page, unsigned long offset, 75 + int (*merge_bio_hook)(int rw, struct page *page, unsigned long offset, 76 76 size_t size, struct bio *bio, 77 77 unsigned long bio_flags); 78 78 int (*readpage_io_hook)(struct page *page, u64 start, u64 end);
+2 -2
fs/btrfs/inode.c
··· 1566 1566 * extent_io.c merge_bio_hook, this must check the chunk tree to make sure 1567 1567 * we don't create bios that span stripes or chunks 1568 1568 */ 1569 - int btrfs_merge_bio_hook(struct page *page, unsigned long offset, 1569 + int btrfs_merge_bio_hook(int rw, struct page *page, unsigned long offset, 1570 1570 size_t size, struct bio *bio, 1571 1571 unsigned long bio_flags) 1572 1572 { ··· 1581 1581 1582 1582 length = bio->bi_size; 1583 1583 map_length = length; 1584 - ret = btrfs_map_block(root->fs_info, READ, logical, 1584 + ret = btrfs_map_block(root->fs_info, rw, logical, 1585 1585 &map_length, NULL, 0); 1586 1586 /* Will always return 0 with map_multi == NULL */ 1587 1587 BUG_ON(ret < 0);