mirror of
https://github.com/torvalds/linux.git
synced 2024-12-24 11:51:27 +00:00
dm: refactor dm_split_and_process_bio a bit
Remove needless branching and indentation. Leaves code to catch malformed op_is_zone_mgmt bios (they shouldn't have a payload). Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Mikulas Patocka <mpatocka@redhat.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com>
This commit is contained in:
parent
66bdaa4302
commit
d41e077ab6
@ -1394,7 +1394,13 @@ static void init_clone_info(struct clone_info *ci, struct mapped_device *md,
|
||||
{
|
||||
ci->map = map;
|
||||
ci->io = alloc_io(md, bio);
|
||||
ci->bio = bio;
|
||||
ci->sector = bio->bi_iter.bi_sector;
|
||||
ci->sector_count = bio_sectors(bio);
|
||||
|
||||
/* Shouldn't happen but sector_count was being set to 0 so... */
|
||||
if (WARN_ON_ONCE(op_is_zone_mgmt(bio_op(bio)) && ci->sector_count))
|
||||
ci->sector_count = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1404,6 +1410,7 @@ static void dm_split_and_process_bio(struct mapped_device *md,
|
||||
struct dm_table *map, struct bio *bio)
|
||||
{
|
||||
struct clone_info ci;
|
||||
struct bio *b;
|
||||
int error = 0;
|
||||
|
||||
init_clone_info(&ci, md, map, bio);
|
||||
@ -1411,34 +1418,29 @@ static void dm_split_and_process_bio(struct mapped_device *md,
|
||||
if (bio->bi_opf & REQ_PREFLUSH) {
|
||||
error = __send_empty_flush(&ci);
|
||||
/* dm_io_dec_pending submits any data associated with flush */
|
||||
} else if (op_is_zone_mgmt(bio_op(bio))) {
|
||||
ci.bio = bio;
|
||||
ci.sector_count = 0;
|
||||
error = __split_and_process_bio(&ci);
|
||||
} else {
|
||||
ci.bio = bio;
|
||||
ci.sector_count = bio_sectors(bio);
|
||||
error = __split_and_process_bio(&ci);
|
||||
if (ci.sector_count && !error) {
|
||||
/*
|
||||
* Remainder must be passed to submit_bio_noacct()
|
||||
* so that it gets handled *after* bios already submitted
|
||||
* have been completely processed.
|
||||
* We take a clone of the original to store in
|
||||
* ci.io->orig_bio to be used by dm_end_io_acct() and for
|
||||
* dm_io_dec_pending() to use for completion handling.
|
||||
*/
|
||||
struct bio *b = bio_split(bio, bio_sectors(bio) - ci.sector_count,
|
||||
GFP_NOIO, &md->queue->bio_split);
|
||||
ci.io->orig_bio = b;
|
||||
|
||||
bio_chain(b, bio);
|
||||
trace_block_split(b, bio->bi_iter.bi_sector);
|
||||
submit_bio_noacct(bio);
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
dm_start_io_acct(ci.io);
|
||||
|
||||
error = __split_and_process_bio(&ci);
|
||||
if (error || !ci.sector_count)
|
||||
goto out;
|
||||
|
||||
/*
|
||||
* Remainder must be passed to submit_bio_noacct() so it gets handled
|
||||
* *after* bios already submitted have been completely processed.
|
||||
* We take a clone of the original to store in ci.io->orig_bio to be
|
||||
* used by dm_end_io_acct() and for dm_io_dec_pending() to use for
|
||||
* completion handling.
|
||||
*/
|
||||
b = bio_split(bio, bio_sectors(bio) - ci.sector_count,
|
||||
GFP_NOIO, &md->queue->bio_split);
|
||||
ci.io->orig_bio = b;
|
||||
|
||||
bio_chain(b, bio);
|
||||
trace_block_split(b, bio->bi_iter.bi_sector);
|
||||
submit_bio_noacct(bio);
|
||||
out:
|
||||
dm_start_io_acct(ci.io);
|
||||
/* drop the extra reference count */
|
||||
dm_io_dec_pending(ci.io, errno_to_blk_status(error));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user