aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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)