summaryrefslogtreecommitdiffstats
path: root/drivers/md/dm.c
diff options
context:
space:
mode:
authorMike Snitzer <snitzer@redhat.com>2022-02-20 12:57:11 -0500
committerMike Snitzer <snitzer@redhat.com>2022-02-21 15:36:18 -0500
commit0ab30b4079e103b517bdfc4331507bf8d8dd8f7b (patch)
tree21e80e1a46d75b9673c136e855e59f4f164af36c /drivers/md/dm.c
parent0cdb90f0f306384ecbc60dfd6dc48cdbc1f2d0d8 (diff)
downloadlinux-stable-0ab30b4079e103b517bdfc4331507bf8d8dd8f7b.tar.gz
linux-stable-0ab30b4079e103b517bdfc4331507bf8d8dd8f7b.tar.bz2
linux-stable-0ab30b4079e103b517bdfc4331507bf8d8dd8f7b.zip
dm: eliminate copying of dm_io fields in dm_io_dec_pending
There is no need for dm_io_dec_pending() to copy dm_io fields anymore now that DM provides its own pending_io counters again. The race documented in commit d208b89401e0 ("dm: fix mempool NULL pointer race when completing IO") no longer exists now that block core's in_flight counters aren't used to signal all dm_io is complete. Also, rename {start,end}_io_acct to dm_{start,end}_io_acct. Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Diffstat (limited to 'drivers/md/dm.c')
-rw-r--r--drivers/md/dm.c19
1 files changed, 7 insertions, 12 deletions
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index 3ae76900023b..33376e679ef5 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -518,15 +518,14 @@ static void dm_io_acct(bool end, struct mapped_device *md, struct bio *bio,
bio->bi_iter.bi_size = bi_size;
}
-static void start_io_acct(struct dm_io *io)
+static void dm_start_io_acct(struct dm_io *io)
{
dm_io_acct(false, io->md, io->orig_bio, io->start_time, &io->stats_aux);
}
-static void end_io_acct(struct mapped_device *md, struct bio *bio,
- unsigned long start_time, struct dm_stats_aux *stats_aux)
+static void dm_end_io_acct(struct dm_io *io)
{
- dm_io_acct(true, md, bio, start_time, stats_aux);
+ dm_io_acct(true, io->md, io->orig_bio, io->start_time, &io->stats_aux);
}
static struct dm_io *alloc_io(struct mapped_device *md, struct bio *bio)
@@ -808,8 +807,6 @@ void dm_io_dec_pending(struct dm_io *io, blk_status_t error)
blk_status_t io_error;
struct bio *bio;
struct mapped_device *md = io->md;
- unsigned long start_time = 0;
- struct dm_stats_aux stats_aux;
/* Push-back supersedes any I/O errors */
if (unlikely(error)) {
@@ -841,10 +838,8 @@ void dm_io_dec_pending(struct dm_io *io, blk_status_t error)
}
io_error = io->status;
- start_time = io->start_time;
- stats_aux = io->stats_aux;
+ dm_end_io_acct(io);
free_io(md, io);
- end_io_acct(md, bio, start_time, &stats_aux);
smp_wmb();
this_cpu_dec(*md->pending_io);
@@ -1444,8 +1439,8 @@ static void __split_and_process_bio(struct mapped_device *md,
* 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 end_io_acct() and
- * for dec_pending to use for completion handling.
+ * 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);
@@ -1456,7 +1451,7 @@ static void __split_and_process_bio(struct mapped_device *md,
submit_bio_noacct(bio);
}
}
- start_io_acct(ci.io);
+ dm_start_io_acct(ci.io);
/* drop the extra reference count */
dm_io_dec_pending(ci.io, errno_to_blk_status(error));