aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs
diff options
context:
space:
mode:
authorJosef Bacik <josef@redhat.com>2011-04-06 14:25:44 -0400
committerJosef Bacik <josef@redhat.com>2011-04-08 13:00:37 -0400
commit02f57c7aedef1a537f4b16db7061cdd8efa3bb4e (patch)
treee1b9cc54d0b4c661107b7a097bc0f64087aae8b6 /fs/btrfs
parent1ef30be142d2cc60e2687ef267de864cf31be995 (diff)
Btrfs: don't split dio bios if we don't have to
We have been unconditionally allocating a new bio and re-adding all pages from our original bio to the new bio. This is needed if our original bio is larger than our stripe size, but if it is smaller than the stripe size then there is no need to do this. So check the map length and if we are under that then go ahead and submit the original bio. Thanks, Signed-off-by: Josef Bacik <josef@redhat.com>
Diffstat (limited to 'fs/btrfs')
-rw-r--r--fs/btrfs/inode.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 4a238d676e5b..149c77fd1eb5 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -6006,13 +6006,6 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip,
6006 int ret = 0; 6006 int ret = 0;
6007 int write = rw & REQ_WRITE; 6007 int write = rw & REQ_WRITE;
6008 6008
6009 bio = btrfs_dio_bio_alloc(orig_bio->bi_bdev, start_sector, GFP_NOFS);
6010 if (!bio)
6011 return -ENOMEM;
6012 bio->bi_private = dip;
6013 bio->bi_end_io = btrfs_end_dio_bio;
6014 atomic_inc(&dip->pending_bios);
6015
6016 map_length = orig_bio->bi_size; 6009 map_length = orig_bio->bi_size;
6017 ret = btrfs_map_block(map_tree, READ, start_sector << 9, 6010 ret = btrfs_map_block(map_tree, READ, start_sector << 9,
6018 &map_length, NULL, 0); 6011 &map_length, NULL, 0);
@@ -6021,6 +6014,18 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip,
6021 return -EIO; 6014 return -EIO;
6022 } 6015 }
6023 6016
6017 if (map_length >= orig_bio->bi_size) {
6018 bio = orig_bio;
6019 goto submit;
6020 }
6021
6022 bio = btrfs_dio_bio_alloc(orig_bio->bi_bdev, start_sector, GFP_NOFS);
6023 if (!bio)
6024 return -ENOMEM;
6025 bio->bi_private = dip;
6026 bio->bi_end_io = btrfs_end_dio_bio;
6027 atomic_inc(&dip->pending_bios);
6028
6024 while (bvec <= (orig_bio->bi_io_vec + orig_bio->bi_vcnt - 1)) { 6029 while (bvec <= (orig_bio->bi_io_vec + orig_bio->bi_vcnt - 1)) {
6025 if (unlikely(map_length < submit_len + bvec->bv_len || 6030 if (unlikely(map_length < submit_len + bvec->bv_len ||
6026 bio_add_page(bio, bvec->bv_page, bvec->bv_len, 6031 bio_add_page(bio, bvec->bv_page, bvec->bv_len,
@@ -6071,6 +6076,7 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip,
6071 } 6076 }
6072 } 6077 }
6073 6078
6079submit:
6074 ret = __btrfs_submit_dio_bio(bio, inode, rw, file_offset, skip_sum, 6080 ret = __btrfs_submit_dio_bio(bio, inode, rw, file_offset, skip_sum,
6075 csums); 6081 csums);
6076 if (!ret) 6082 if (!ret)