Skip to content

Commit

Permalink
NVMe: Correct sg list setup in nvme_map_user_pages
Browse files Browse the repository at this point in the history
Our SG list was constructed to always fill the entire first page, even
if that was more than the length of the I/O.  This is probably harmless,
but some IOMMUs might do something bad.

Correcting the first call to sg_set_page() made it look a lot closer to
the sg_set_page() in the loop, so fold the first call to sg_set_page()
into the loop.

Reported-by: Nisheeth Bhat <nisheeth.bhat@intel.com>
Signed-off-by: Matthew Wilcox <willy@linux.intel.com>
  • Loading branch information
Matthew Wilcox committed Nov 4, 2011
1 parent 6413214 commit d0ba1e4
Showing 1 changed file with 5 additions and 5 deletions.
10 changes: 5 additions & 5 deletions drivers/block/nvme.c
Original file line number Diff line number Diff line change
Expand Up @@ -996,11 +996,11 @@ static int nvme_map_user_pages(struct nvme_dev *dev, int write,

sg = kcalloc(count, sizeof(*sg), GFP_KERNEL);
sg_init_table(sg, count);
sg_set_page(&sg[0], pages[0], PAGE_SIZE - offset, offset);
length -= (PAGE_SIZE - offset);
for (i = 1; i < count; i++) {
sg_set_page(&sg[i], pages[i], min_t(int, length, PAGE_SIZE), 0);
length -= PAGE_SIZE;
for (i = 0; i < count; i++) {
sg_set_page(&sg[i], pages[i],
min_t(int, length, PAGE_SIZE - offset), offset);
length -= (PAGE_SIZE - offset);
offset = 0;
}

err = -ENOMEM;
Expand Down

0 comments on commit d0ba1e4

Please sign in to comment.