[PATCH] IB: Fix pack/unpack when size_bits == 64
authorRoland Dreier <rolandd@cisco.com>
Mon, 27 Jun 2005 21:36:47 +0000 (14:36 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Mon, 27 Jun 2005 22:11:47 +0000 (15:11 -0700)
Fix handling of fields with size_bits == 64.  Pointed out by Hal Rosenstock.

Signed-off-by: Roland Dreier <rolandd@cisco.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
drivers/infiniband/core/packer.c

index 5f15feffeae2d8ba20d938e135fdd5b7ad129300..eb5ff54c10d75e758088f2e594167a18a4f3fabc 100644 (file)
@@ -96,7 +96,7 @@ void ib_pack(const struct ib_field        *desc,
                        else
                                val = 0;
 
-                       mask = cpu_to_be64(((1ull << desc[i].size_bits) - 1) << shift);
+                       mask = cpu_to_be64((~0ull >> (64 - desc[i].size_bits)) << shift);
                        addr = (__be64 *) ((__be32 *) buf + desc[i].offset_words);
                        *addr = (*addr & ~mask) | (cpu_to_be64(val) & mask);
                } else {
@@ -176,7 +176,7 @@ void ib_unpack(const struct ib_field        *desc,
                        __be64 *addr;
 
                        shift = 64 - desc[i].offset_bits - desc[i].size_bits;
-                       mask = ((1ull << desc[i].size_bits) - 1) << shift;
+                       mask = (~0ull >> (64 - desc[i].size_bits)) << shift;
                        addr = (__be64 *) buf + desc[i].offset_words;
                        val = (be64_to_cpup(addr) & mask) >> shift;
                        value_write(desc[i].struct_offset_bytes,