dm: refactor dm_split_and_process_bio a bit
authorMike Snitzer <snitzer@redhat.com>
Fri, 18 Feb 2022 04:40:11 +0000 (23:40 -0500)
committerMike Snitzer <snitzer@redhat.com>
Mon, 21 Feb 2022 20:36:24 +0000 (15:36 -0500)
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>
drivers/md/dm.c

index bed236d..c01bfa3 100644 (file)
@@ -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));
 }