|
@@ -7306,10 +7306,8 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip,
|
|
map_length = orig_bio->bi_iter.bi_size;
|
|
map_length = orig_bio->bi_iter.bi_size;
|
|
ret = btrfs_map_block(root->fs_info, rw, start_sector << 9,
|
|
ret = btrfs_map_block(root->fs_info, rw, start_sector << 9,
|
|
&map_length, NULL, 0);
|
|
&map_length, NULL, 0);
|
|
- if (ret) {
|
|
|
|
- bio_put(orig_bio);
|
|
|
|
|
|
+ if (ret)
|
|
return -EIO;
|
|
return -EIO;
|
|
- }
|
|
|
|
|
|
|
|
if (map_length >= orig_bio->bi_iter.bi_size) {
|
|
if (map_length >= orig_bio->bi_iter.bi_size) {
|
|
bio = orig_bio;
|
|
bio = orig_bio;
|
|
@@ -7326,6 +7324,7 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip,
|
|
bio = btrfs_dio_bio_alloc(orig_bio->bi_bdev, start_sector, GFP_NOFS);
|
|
bio = btrfs_dio_bio_alloc(orig_bio->bi_bdev, start_sector, GFP_NOFS);
|
|
if (!bio)
|
|
if (!bio)
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
|
|
+
|
|
bio->bi_private = dip;
|
|
bio->bi_private = dip;
|
|
bio->bi_end_io = btrfs_end_dio_bio;
|
|
bio->bi_end_io = btrfs_end_dio_bio;
|
|
atomic_inc(&dip->pending_bios);
|
|
atomic_inc(&dip->pending_bios);
|