From d6c23a06c582d4817ecd629e8f15ff77cf7f7f48 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Almeida?= <andrealmeid@collabora.com>
Date: Mon, 20 Jul 2020 12:00:59 -0300
Subject: [PATCH] dm mpath: use precise ns for BIO based
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Instead of casting jiffies to nseconds, which may lead to loose
precision, use nseconds without conversion.

Signed-off-by: André Almeida <andrealmeid@collabora.com>
---
 drivers/md/dm-mpath.c         | 4 +++-
 drivers/md/dm.c               | 9 ---------
 include/linux/device-mapper.h | 2 --
 3 files changed, 3 insertions(+), 12 deletions(-)

diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c
index 88dc7b41b1c6..ced3d3cbad56 100644
--- a/drivers/md/dm-mpath.c
+++ b/drivers/md/dm-mpath.c
@@ -105,6 +105,7 @@ struct multipath {
 struct dm_mpath_io {
 	struct pgpath *pgpath;
 	size_t nr_bytes;
+	u64 start_time_ns;
 };
 
 typedef int (*action_fn) (struct pgpath *pgpath);
@@ -649,6 +650,7 @@ static int __multipath_map_bio(struct multipath *m, struct bio *bio,
 	}
 
 	mpio->pgpath = pgpath;
+	mpio->start_time_ns = ktime_get_ns();
 
 	bio->bi_status = 0;
 	bio_set_dev(bio, pgpath->path.dev->bdev);
@@ -1712,7 +1714,7 @@ static int multipath_end_io_bio(struct dm_target *ti, struct bio *clone,
 
 		if (ps->type->end_io)
 			ps->type->end_io(ps, &pgpath->path, mpio->nr_bytes,
-					 dm_start_time_ns_from_clone(clone));
+					 mpio->start_time_ns);
 	}
 
 	return r;
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index 52449afd58eb..ed347d763789 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -655,15 +655,6 @@ static void free_tio(struct dm_target_io *tio)
 	bio_put(&tio->clone);
 }
 
-u64 dm_start_time_ns_from_clone(struct bio *bio)
-{
-	struct dm_target_io *tio = container_of(bio, struct dm_target_io, clone);
-	struct dm_io *io = tio->io;
-
-	return jiffies_to_nsecs(io->start_time);
-}
-EXPORT_SYMBOL_GPL(dm_start_time_ns_from_clone);
-
 static void start_io_acct(struct dm_io *io)
 {
 	struct mapped_device *md = io->md;
diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h
index 8750f2dc5613..6df78be3637e 100644
--- a/include/linux/device-mapper.h
+++ b/include/linux/device-mapper.h
@@ -332,8 +332,6 @@ void *dm_per_bio_data(struct bio *bio, size_t data_size);
 struct bio *dm_bio_from_per_bio_data(void *data, size_t data_size);
 unsigned dm_bio_get_target_bio_nr(const struct bio *bio);
 
-u64 dm_start_time_ns_from_clone(struct bio *bio);
-
 int dm_register_target(struct target_type *t);
 void dm_unregister_target(struct target_type *t);
 
-- 
GitLab