nvmet: avoid integer overflow in the discard code
authorBart Van Assche <bvanassche@acm.org>
Mon, 8 Oct 2018 21:28:52 +0000 (14:28 -0700)
committerChristoph Hellwig <hch@lst.de>
Wed, 17 Oct 2018 06:58:27 +0000 (08:58 +0200)
Although I'm not sure whether it is a good idea to support large discard
commands, I think integer overflow for discard ranges larger than 4 GB
should be avoided. This patch avoids that smatch reports the following:

drivers/nvme/target/io-cmd-file.c:249:1 nvmet_file_execute_discard() warn: should '((range.nlb)) << req->ns->blksize_shift' be a 64 bit type?

Fixes: d5eff33ee6f8 ("nvmet: add simple file backed ns support")
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/nvme/target/io-cmd-file.c

index 81a9dc5290a8744b3f022aec8338098986b23967..39d972e2595f0dc764f2a5ac37d589422068c139 100644 (file)
@@ -246,7 +246,8 @@ static void nvmet_file_execute_discard(struct nvmet_req *req)
                        break;
 
                offset = le64_to_cpu(range.slba) << req->ns->blksize_shift;
-               len = le32_to_cpu(range.nlb) << req->ns->blksize_shift;
+               len = le32_to_cpu(range.nlb);
+               len <<= req->ns->blksize_shift;
                if (offset + len > req->ns->size) {
                        ret = NVME_SC_LBA_RANGE | NVME_SC_DNR;
                        break;