| From 2371a19899dcbe4adb5ceec0f575ff13d0fd2b64 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 8 Aug 2019 02:22:36 +0000 |
| Subject: nvmet: fix data units read and written counters in SMART log |
| |
| From: Tom Wu <tomwu@mellanox.com> |
| |
| [ 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 <tomwu@mellanox.com> |
| Reviewed-by: Israel Rukshin <israelr@mellanox.com> |
| Reviewed-by: Max Gurtovoy <maxg@mellanox.com> |
| Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com> |
| Reviewed-by: Christoph Hellwig <hch@lst.de> |
| Signed-off-by: Sagi Grimberg <sagi@grimberg.me> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| 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 cdb7752dcbb79..446f61ba018d7 100644 |
| --- a/drivers/nvme/target/admin-cmd.c |
| +++ b/drivers/nvme/target/admin-cmd.c |
| @@ -47,9 +47,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]); |
| @@ -75,11 +77,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 |
| |