diff options
Diffstat (limited to 'fs/btrfs/bio.c')
| -rw-r--r-- | fs/btrfs/bio.c | 23 | 
1 files changed, 18 insertions, 5 deletions
| diff --git a/fs/btrfs/bio.c b/fs/btrfs/bio.c index 3d2376caedfa..5fd0b39d8c70 100644 --- a/fs/btrfs/bio.c +++ b/fs/btrfs/bio.c @@ -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; @@ -355,7 +358,7 @@ static void btrfs_simple_end_io(struct bio *bio)  		INIT_WORK(&bbio->end_io_work, btrfs_end_bio_work);  		queue_work(btrfs_end_io_wq(fs_info, bio), &bbio->end_io_work);  	} else { -		if (bio_op(bio) == REQ_OP_ZONE_APPEND && !bio->bi_status) +		if (bio_is_zone_append(bio) && !bio->bi_status)  			btrfs_record_physical_zoned(bbio);  		btrfs_bio_end_io(bbio, bbio->bio.bi_status);  	} @@ -398,7 +401,7 @@ static void btrfs_orig_write_end_io(struct bio *bio)  	else  		bio->bi_status = BLK_STS_OK; -	if (bio_op(bio) == REQ_OP_ZONE_APPEND && !bio->bi_status) +	if (bio_is_zone_append(bio) && !bio->bi_status)  		stripe->physical = bio->bi_iter.bi_sector << SECTOR_SHIFT;  	btrfs_bio_end_io(bbio, bbio->bio.bi_status); @@ -412,7 +415,7 @@ static void btrfs_clone_write_end_io(struct bio *bio)  	if (bio->bi_status) {  		atomic_inc(&stripe->bioc->error);  		btrfs_log_dev_io_error(bio, stripe->dev); -	} else if (bio_op(bio) == REQ_OP_ZONE_APPEND) { +	} else if (bio_is_zone_append(bio)) {  		stripe->physical = bio->bi_iter.bi_sector << SECTOR_SHIFT;  	} @@ -684,7 +687,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); @@ -692,7 +696,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;  	} @@ -766,6 +778,7 @@ fail:  		btrfs_bio_end_io(remaining, ret);  	} +end_bbio:  	btrfs_bio_end_io(bbio, ret);  	/* Do not submit another chunk */  	return true; | 
