]> err.no Git - linux-2.6/commitdiff
IB/ipath: Fix user memory region creation when IOMMU present
authorBryan O'Sullivan <bos@pathscale.com>
Thu, 15 Mar 2007 21:44:46 +0000 (14:44 -0700)
committerRoland Dreier <rolandd@cisco.com>
Thu, 19 Apr 2007 03:20:54 +0000 (20:20 -0700)
The loop which initializes the user memory region from an array of
pages was using the wrong limit for the array.  This worked OK when
dma_map_sg() returned the same number as the number of pages.  This
patch fixes the problem.

Signed-off-by: Ralph Campbell <ralph.campbell@qlogic.com>
Signed-off-by: Bryan O'Sullivan <bryan.osullivan@qlogic.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
drivers/infiniband/hw/ipath/ipath_mr.c

index 8cc8598d6c6968cbd2a957ec4ccd2c3d41b4ea92..31e70732e36950bc4d765a74779c6a86ded4cf3a 100644 (file)
@@ -210,9 +210,15 @@ struct ib_mr *ipath_reg_user_mr(struct ib_pd *pd, struct ib_umem *region,
        m = 0;
        n = 0;
        list_for_each_entry(chunk, &region->chunk_list, list) {
-               for (i = 0; i < chunk->nmap; i++) {
-                       mr->mr.map[m]->segs[n].vaddr =
-                               page_address(chunk->page_list[i].page);
+               for (i = 0; i < chunk->nents; i++) {
+                       void *vaddr;
+
+                       vaddr = page_address(chunk->page_list[i].page);
+                       if (!vaddr) {
+                               ret = ERR_PTR(-EINVAL);
+                               goto bail;
+                       }
+                       mr->mr.map[m]->segs[n].vaddr = vaddr;
                        mr->mr.map[m]->segs[n].length = region->page_size;
                        n++;
                        if (n == IPATH_SEGSZ) {