Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

nvme: Fix PRP list calculation for non-4k system page size

PRP list calculation is supposed to be based on device's page size.
Systems with page size larger than device's page size cause corruption
to the name space as well as system memory with out this fix.
Systems like x86 might not experience this issue because it uses
PAGE_SIZE of 4K where as powerpc uses PAGE_SIZE of 64k while NVMe device's
page size varies depending upon the vendor.

Signed-off-by: Murali Iyer <mniyer@us.ibm.com>
Signed-off-by: Brian King <brking@linux.vnet.ibm.com>
Acked-by: Keith Busch <keith.busch@intel.com>
Signed-off-by: Jens Axboe <axboe@fb.com>

authored by

Murali Iyer and committed by
Jens Axboe
f137e0f1 1efccc9d

+2 -2
+2 -2
drivers/block/nvme-core.c
··· 640 640 struct scatterlist *sg = iod->sg; 641 641 int dma_len = sg_dma_len(sg); 642 642 u64 dma_addr = sg_dma_address(sg); 643 - int offset = offset_in_page(dma_addr); 643 + u32 page_size = dev->page_size; 644 + int offset = dma_addr & (page_size - 1); 644 645 __le64 *prp_list; 645 646 __le64 **list = iod_list(iod); 646 647 dma_addr_t prp_dma; 647 648 int nprps, i; 648 - u32 page_size = dev->page_size; 649 649 650 650 length -= (page_size - offset); 651 651 if (length <= 0)