]> Git Repo - J-linux.git/commitdiff
btrfs: handle bio_split() errors
authorJohannes Thumshirn <[email protected]>
Tue, 3 Dec 2024 07:40:22 +0000 (23:40 -0800)
committerDavid Sterba <[email protected]>
Fri, 6 Dec 2024 14:04:13 +0000 (15:04 +0100)
Commit e546fe1da9bd ("block: Rework bio_split() return value") changed
bio_split() so that it can return errors.

Add error handling for it in btrfs_split_bio() and ultimately
btrfs_submit_chunk(). As the bio is not submitted, the bio counter must
be decremented to pair btrfs_bio_counter_inc_blocked().

Reviewed-by: John Garry <[email protected]>
Signed-off-by: Johannes Thumshirn <[email protected]>
Reviewed-by: David Sterba <[email protected]>
Signed-off-by: David Sterba <[email protected]>
fs/btrfs/bio.c

index 1f216d07eff65c98d67c700811f264e1aa5be08c..af3db0a7ae4da5b1901ed6bada5d87b1550282d9 100644 (file)
@@ -81,6 +81,9 @@ static struct btrfs_bio *btrfs_split_bio(struct btrfs_fs_info *fs_info,
 
        bio = bio_split(&orig_bbio->bio, map_length >> SECTOR_SHIFT, GFP_NOFS,
                        &btrfs_clone_bioset);
+       if (IS_ERR(bio))
+               return ERR_CAST(bio);
+
        bbio = btrfs_bio(bio);
        btrfs_bio_init(bbio, fs_info, NULL, orig_bbio);
        bbio->inode = orig_bbio->inode;
@@ -678,7 +681,8 @@ static bool btrfs_submit_chunk(struct btrfs_bio *bbio, int mirror_num)
                                &bioc, &smap, &mirror_num);
        if (error) {
                ret = errno_to_blk_status(error);
-               goto fail;
+               btrfs_bio_counter_dec(fs_info);
+               goto end_bbio;
        }
 
        map_length = min(map_length, length);
@@ -686,7 +690,15 @@ static bool btrfs_submit_chunk(struct btrfs_bio *bbio, int mirror_num)
                map_length = btrfs_append_map_length(bbio, map_length);
 
        if (map_length < length) {
-               bbio = btrfs_split_bio(fs_info, bbio, map_length);
+               struct btrfs_bio *split;
+
+               split = btrfs_split_bio(fs_info, bbio, map_length);
+               if (IS_ERR(split)) {
+                       ret = errno_to_blk_status(PTR_ERR(split));
+                       btrfs_bio_counter_dec(fs_info);
+                       goto end_bbio;
+               }
+               bbio = split;
                bio = &bbio->bio;
        }
 
@@ -760,6 +772,7 @@ fail:
 
                btrfs_bio_end_io(remaining, ret);
        }
+end_bbio:
        btrfs_bio_end_io(bbio, ret);
        /* Do not submit another chunk */
        return true;
This page took 0.052415 seconds and 4 git commands to generate.