]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
NVMe: Fix off-by-one when filling in PRP lists
authorMatthew Wilcox <matthew.r.wilcox@intel.com>
Wed, 16 Mar 2011 20:43:40 +0000 (16:43 -0400)
committerMatthew Wilcox <matthew.r.wilcox@intel.com>
Fri, 4 Nov 2011 19:53:00 +0000 (15:53 -0400)
If the last element in the PRP list fits on the end of the page, there's
no need to allocate an extra page to put that single element in.  It can
fit on the end of the page.

Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
drivers/block/nvme.c

index 0d5c918b7d59b623d9ae50185557eafe022bf44c..cf89db8c41eecdedee5a498eb1d72b5a22578f5b 100644 (file)
@@ -376,12 +376,13 @@ static struct nvme_prps *nvme_setup_prps(struct nvme_dev *dev,
        cmd->prp2 = cpu_to_le64(prp_dma);
        i = 0;
        for (;;) {
-               if (i == PAGE_SIZE / 8 - 1) {
+               if (i == PAGE_SIZE / 8) {
                        __le64 *old_prp_list = prp_list;
                        prp_list = dma_pool_alloc(pool, GFP_ATOMIC, &prp_dma);
                        prps->list[prp_page++] = prp_list;
-                       old_prp_list[i] = cpu_to_le64(prp_dma);
-                       i = 0;
+                       prp_list[0] = old_prp_list[i - 1];
+                       old_prp_list[i - 1] = cpu_to_le64(prp_dma);
+                       i = 1;
                }
                prp_list[i++] = cpu_to_le64(dma_addr);
                dma_len -= PAGE_SIZE;