IB/ipath: Fix bad argument to clear_bit()
authorBryan O'Sullivan <bos@pathscale.com>
Thu, 15 Mar 2007 21:44:56 +0000 (14:44 -0700)
committerRoland Dreier <rolandd@cisco.com>
Thu, 19 Apr 2007 03:20:56 +0000 (20:20 -0700)
Code was converted from a &= ~mask to clear_bit, but the bit was left
shifted instead of being used directly, so we were either trashing
memory several pages away, or sometimes taking a kernel page fault on
an invalid page.

Signed-off-by: Dave Olson <dave.olson@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_intr.c

index 037b8e276429dadb507e7216f09e303e1349abe0..24853310df1c68eff8295712abf923ae0636bd3e 100644 (file)
@@ -842,11 +842,10 @@ static void handle_urcv(struct ipath_devdata *dd, u32 istat)
                struct ipath_portdata *pd = dd->ipath_pd[i];
                if (portr & (1 << i) && pd && pd->port_cnt &&
                        test_bit(IPATH_PORT_WAITING_RCV, &pd->port_flag)) {
-                       int rcbit;
                        clear_bit(IPATH_PORT_WAITING_RCV,
                                  &pd->port_flag);
-                       rcbit = i + INFINIPATH_R_INTRAVAIL_SHIFT;
-                       clear_bit(1UL << rcbit, &dd->ipath_rcvctrl);
+                       clear_bit(i + INFINIPATH_R_INTRAVAIL_SHIFT,
+                                 &dd->ipath_rcvctrl);
                        wake_up_interruptible(&pd->port_wait);
                        rcvdint = 1;
                }