summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Wilcox <matthew.r.wilcox@intel.com>2011-03-16 16:43:40 -0400
committerMatthew Wilcox <matthew.r.wilcox@intel.com>2011-11-04 15:53:00 -0400
commit7523d834dd1573610078eb1ac0933f6490232f90 (patch)
tree898be553899785ac400e98f23f99881e51a2c8f8
parentac88c36a385b848cb9efcb877fdfc4153a60bcab (diff)
NVMe: Fix off-by-one when filling in PRP lists
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>
-rw-r--r--drivers/block/nvme.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/block/nvme.c b/drivers/block/nvme.c
index 0d5c918b7d5..cf89db8c41e 100644
--- a/drivers/block/nvme.c
+++ b/drivers/block/nvme.c
@@ -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;