Browse Source

IB/ipath: Fix offset returned to ibv_resize_cq()

The wrong offset was being returned to libipathverbs so that when
ibv_resize_cq() calls mmap(), it always fails.

Signed-off-by: Ralph Campbell <ralph.campbell@qlogic.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
Ralph Campbell 17 years ago
parent
commit
fb74dacb0f
1 changed files with 14 additions and 5 deletions
  1. 14 5
      drivers/infiniband/hw/ipath/ipath_cq.c

+ 14 - 5
drivers/infiniband/hw/ipath/ipath_cq.c

@@ -395,12 +395,9 @@ int ipath_resize_cq(struct ib_cq *ibcq, int cqe, struct ib_udata *udata)
 		goto bail;
 		goto bail;
 	}
 	}
 
 
-	/*
-	 * Return the address of the WC as the offset to mmap.
-	 * See ipath_mmap() for details.
-	 */
+	/* Check that we can write the offset to mmap. */
 	if (udata && udata->outlen >= sizeof(__u64)) {
 	if (udata && udata->outlen >= sizeof(__u64)) {
-		__u64 offset = (__u64) wc;
+		__u64 offset = 0;
 
 
 		ret = ib_copy_to_udata(udata, &offset, sizeof(offset));
 		ret = ib_copy_to_udata(udata, &offset, sizeof(offset));
 		if (ret)
 		if (ret)
@@ -450,6 +447,18 @@ int ipath_resize_cq(struct ib_cq *ibcq, int cqe, struct ib_udata *udata)
 		struct ipath_mmap_info *ip = cq->ip;
 		struct ipath_mmap_info *ip = cq->ip;
 
 
 		ipath_update_mmap_info(dev, ip, sz, wc);
 		ipath_update_mmap_info(dev, ip, sz, wc);
+
+		/*
+		 * Return the offset to mmap.
+		 * See ipath_mmap() for details.
+		 */
+		if (udata && udata->outlen >= sizeof(__u64)) {
+			ret = ib_copy_to_udata(udata, &ip->offset,
+					       sizeof(ip->offset));
+			if (ret)
+				goto bail;
+		}
+
 		spin_lock_irq(&dev->pending_lock);
 		spin_lock_irq(&dev->pending_lock);
 		if (list_empty(&ip->pending_mmaps))
 		if (list_empty(&ip->pending_mmaps))
 			list_add(&ip->pending_mmaps, &dev->pending_mmaps);
 			list_add(&ip->pending_mmaps, &dev->pending_mmaps);