summaryrefslogtreecommitdiffstats
path: root/drivers/nvme
diff options
context:
space:
mode:
authorBart Van Assche <bvanassche@acm.org>2021-04-02 18:58:20 +0200
committerChristoph Hellwig <hch@lst.de>2021-04-06 08:34:39 +0200
commit8609c63fce58e94d82f6b6bf29c7806062e2e867 (patch)
treed911962d73d17a88110f4fbf7eb28b53563c2e35 /drivers/nvme
parent5befc7c26e5a98cd49789fb1beb52c62bd472dba (diff)
downloadlinux-8609c63fce58e94d82f6b6bf29c7806062e2e867.tar.bz2
nvme: fix handling of large MDTS values
Instead of triggering an integer overflow and undefined behavior if MDTS is large, set max_hw_sectors to UINT_MAX. Signed-off-by: Bart Van Assche <bvanassche@acm.org> Reviewed-by: Keith Busch <kbusch@kernel.org> [hch: rebased to account for the new nvme_mps_to_sectors helper] Signed-off-by: Christoph Hellwig <hch@lst.de>
Diffstat (limited to 'drivers/nvme')
-rw-r--r--drivers/nvme/host/core.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index e37e2ecd574c..314705da2c10 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -3049,9 +3049,11 @@ out:
static inline u32 nvme_mps_to_sectors(struct nvme_ctrl *ctrl, u32 units)
{
- u32 page_shift = NVME_CAP_MPSMIN(ctrl->cap) + 12;
+ u32 page_shift = NVME_CAP_MPSMIN(ctrl->cap) + 12, val;
- return 1 << (units + page_shift - 9);
+ if (check_shl_overflow(1U, units + page_shift - 9, &val))
+ return UINT_MAX;
+ return val;
}
static int nvme_init_non_mdts_limits(struct nvme_ctrl *ctrl)