]> git.baikalelectronics.ru Git - kernel.git/commitdiff
nvme-scsi: Consider LBA format in IO splitting calculation
authorJon Derrick <jonathan.derrick@intel.com>
Tue, 25 Apr 2017 00:02:43 +0000 (18:02 -0600)
committerChristoph Hellwig <hch@lst.de>
Tue, 25 Apr 2017 18:01:00 +0000 (20:01 +0200)
The current command submission code uses a sector-based value when
considering the maximum number of blocks per command. With a
4k-formatted namespace and a command exceeding max hardware limits, this
calculation doesn't split IOs which should be split and fails in the
nvme layer. This patch fixes that calculation and enables IO splitting
in these circumstances.

Signed-off-by: Jon Derrick <jonathan.derrick@intel.com>
Reviewed-by: Jens Axboe <axboe@fb.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/nvme/host/scsi.c

index f49ae2758bb70d367edf057309b2a5f784fb1c20..988da610d6aaf98ba2bc7c75096860aa36e5ffdb 100644 (file)
@@ -1609,7 +1609,7 @@ static int nvme_trans_do_nvme_io(struct nvme_ns *ns, struct sg_io_hdr *hdr,
        struct nvme_command c;
        u8 opcode = (is_write ? nvme_cmd_write : nvme_cmd_read);
        u16 control;
-       u32 max_blocks = queue_max_hw_sectors(ns->queue);
+       u32 max_blocks = queue_max_hw_sectors(ns->queue) >> (ns->lba_shift - 9);
 
        num_cmds = nvme_trans_io_get_num_cmds(hdr, cdb_info, max_blocks);