From: Tom Wu <[email protected]>

[ Upstream commit 3bec2e3754becebd4c452999adb49bc62c575ea4 ]

In nvme spec 1.3 there is a definition for data write/read counters
from SMART log, (See section 5.14.1.2):
        This value is reported in thousands (i.e., a value of 1
        corresponds to 1000 units of 512 bytes read) and is rounded up.

However, in nvme target where value is reported with actual units,
but not thousands of units as the spec requires.

Signed-off-by: Tom Wu <[email protected]>
Reviewed-by: Israel Rukshin <[email protected]>
Reviewed-by: Max Gurtovoy <[email protected]>
Reviewed-by: Chaitanya Kulkarni <[email protected]>
Reviewed-by: Christoph Hellwig <[email protected]>
Signed-off-by: Sagi Grimberg <[email protected]>
Signed-off-by: Sasha Levin <[email protected]>
---
 drivers/nvme/target/admin-cmd.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/drivers/nvme/target/admin-cmd.c b/drivers/nvme/target/admin-cmd.c
index c4a0bf36e7521..0e94fd737eb4e 100644
--- a/drivers/nvme/target/admin-cmd.c
+++ b/drivers/nvme/target/admin-cmd.c
@@ -49,9 +49,11 @@ static u16 nvmet_get_smart_log_nsid(struct nvmet_req *req,
        }
 
        host_reads = part_stat_read(ns->bdev->bd_part, ios[READ]);
-       data_units_read = part_stat_read(ns->bdev->bd_part, sectors[READ]);
+       data_units_read = DIV_ROUND_UP(part_stat_read(ns->bdev->bd_part,
+               sectors[READ]), 1000);
        host_writes = part_stat_read(ns->bdev->bd_part, ios[WRITE]);
-       data_units_written = part_stat_read(ns->bdev->bd_part, sectors[WRITE]);
+       data_units_written = DIV_ROUND_UP(part_stat_read(ns->bdev->bd_part,
+               sectors[WRITE]), 1000);
 
        put_unaligned_le64(host_reads, &slog->host_reads[0]);
        put_unaligned_le64(data_units_read, &slog->data_units_read[0]);
@@ -77,11 +79,11 @@ static u16 nvmet_get_smart_log_all(struct nvmet_req *req,
        rcu_read_lock();
        list_for_each_entry_rcu(ns, &ctrl->subsys->namespaces, dev_link) {
                host_reads += part_stat_read(ns->bdev->bd_part, ios[READ]);
-               data_units_read +=
-                       part_stat_read(ns->bdev->bd_part, sectors[READ]);
+               data_units_read += DIV_ROUND_UP(
+                       part_stat_read(ns->bdev->bd_part, sectors[READ]), 1000);
                host_writes += part_stat_read(ns->bdev->bd_part, ios[WRITE]);
-               data_units_written +=
-                       part_stat_read(ns->bdev->bd_part, sectors[WRITE]);
+               data_units_written += DIV_ROUND_UP(
+                       part_stat_read(ns->bdev->bd_part, sectors[WRITE]), 
1000);
 
        }
        rcu_read_unlock();
-- 
2.20.1



Reply via email to