Whamcloud - gitweb
Branch HEAD
[fs/lustre-release.git] / lustre / kernel_patches / patches / bitops_ext2_find_next_le_bit-2.6.patch
1 Index: linux-2.6.9/include/asm-i386/bitops.h
2 ===================================================================
3 --- linux-2.6.9.orig/include/asm-i386/bitops.h  2004-10-19 05:54:37.000000000 +0800
4 +++ linux-2.6.9/include/asm-i386/bitops.h       2006-09-01 14:04:19.000000000 +0800
5 @@ -448,6 +448,8 @@
6         find_first_zero_bit((unsigned long*)addr, size)
7  #define ext2_find_next_zero_bit(addr, size, off) \
8         find_next_zero_bit((unsigned long*)addr, size, off)
9 +#define ext2_find_next_le_bit(addr, size, off) \
10 +       find_next_bit((unsigned long*)(addr), (size), (off))
11  
12  /* Bitmap functions for the minix filesystem.  */
13  #define minix_test_and_set_bit(nr,addr) __test_and_set_bit(nr,(void*)addr)
14 Index: linux-2.6.9/include/asm-x86_64/bitops.h
15 ===================================================================
16 --- linux-2.6.9.orig/include/asm-x86_64/bitops.h        2004-10-19 05:53:51.000000000 +0800
17 +++ linux-2.6.9/include/asm-x86_64/bitops.h     2006-09-01 14:04:19.000000000 +0800
18 @@ -399,6 +399,8 @@
19         find_first_zero_bit((unsigned long*)addr, size)
20  #define ext2_find_next_zero_bit(addr, size, off) \
21         find_next_zero_bit((unsigned long*)addr, size, off)
22 +#define ext2_find_next_le_bit(addr, size, off) \
23 +       find_next_bit((unsigned long*)(addr), (size), (off))
24  
25  /* Bitmap functions for the minix filesystem.  */
26  #define minix_test_and_set_bit(nr,addr) __test_and_set_bit(nr,(void*)addr)
27 Index: linux-2.6.9/include/asm-ia64/bitops.h
28 ===================================================================
29 --- linux-2.6.9.orig/include/asm-ia64/bitops.h  2004-10-19 05:55:07.000000000 +0800
30 +++ linux-2.6.9/include/asm-ia64/bitops.h       2006-09-01 14:04:19.000000000 +0800
31 @@ -387,6 +387,8 @@
32  #define ext2_test_bit                  test_bit
33  #define ext2_find_first_zero_bit       find_first_zero_bit
34  #define ext2_find_next_zero_bit                find_next_zero_bit
35 +#define ext2_find_next_le_bit(addr, size, off) \
36 +       __find_next_bit((addr), (size), (off))
37  
38  /* Bitmap functions for the minix filesystem.  */
39  #define minix_test_and_set_bit(nr,addr)                test_and_set_bit(nr,addr)
40 Index: linux-2.6.9/include/asm-ppc/bitops.h
41 ===================================================================
42 --- linux-2.6.9.orig/include/asm-ppc/bitops.h   2004-10-19 05:54:08.000000000 +0800
43 +++ linux-2.6.9/include/asm-ppc/bitops.h        2006-09-01 14:04:35.000000000 +0800
44 @@ -449,6 +449,47 @@
45         return result + ffz(tmp);
46  }
47  
48 +#define ext2_find_next_le_bit(addr, size, off) \
49 +        generic_find_next_le_bit((addr), (size), (off))
50 +
51 +static __inline__ unsigned long generic_find_next_le_bit(const void *addr,
52 +               unsigned long size, unsigned long offset)
53 +{
54 +       unsigned int *p = ((unsigned int*) addr) + (offset >> 5);
55 +       unsigned int result = offset & ~31UL;
56 +       unsigned int tmp;
57 +
58 +       if (offset >= size)
59 +               return size;
60 +       size -= result;
61 +       offset &= 31UL;
62 +       if (offset) {
63 +               tmp = cpu_to_le32p(p++);
64 +               tmp &= ~0UL << offset;
65 +               if (size < 32)
66 +                       goto found_first;
67 +               if (tmp)
68 +                       goto found_middle;
69 +               size -= 32;
70 +               result += 32;
71 +       }
72 +       while (size >= 32) {
73 +               if ((tmp = cpu_to_le32p(p++)))
74 +                       goto found_middle;
75 +               result += 32;
76 +               size -= 32;
77 +       }
78 +       if (!size)
79 +               return result;
80 +       tmp = cpu_to_le32p(p);
81 +found_first:
82 +       tmp &= ~0U >> (32 - size);
83 +       if (tmp == 0UL)         /* Are any bits set? */
84 +               return result + size;   /* Nope. */
85 +found_middle:
86 +       return result + __ffs(tmp);
87 +}
88 +
89  /* Bitmap functions for the minix filesystem.  */
90  #define minix_test_and_set_bit(nr,addr) ext2_set_bit(nr,addr)
91  #define minix_set_bit(nr,addr) ((void)ext2_set_bit(nr,addr))
92 Index: linux-2.6.9/include/asm-ppc64/bitops.h
93 ===================================================================
94 --- linux-2.6.9.orig/include/asm-ppc64/bitops.h 2004-10-19 05:55:43.000000000 +0800
95 +++ linux-2.6.9/include/asm-ppc64/bitops.h      2006-09-01 14:05:00.000000000 +0800
96 @@ -349,6 +349,9 @@
97         find_first_zero_le_bit((unsigned long*)addr, size)
98  #define ext2_find_next_zero_bit(addr, size, off) \
99         find_next_zero_le_bit((unsigned long*)addr, size, off)
100 +#define ext2_find_next_le_bit(addr, size, off) \
101 +        generic_find_next_le_bit((unsigned long*)(addr), (size), (off))
102 +extern unsigned long generic_find_next_le_bit(const unsigned long *addr, unsigned long size, unsigned long offset);
103  
104  #define minix_test_and_set_bit(nr,addr)                test_and_set_bit(nr,addr)
105  #define minix_set_bit(nr,addr)                 set_bit(nr,addr)
106 Index: linux-2.6.9/arch/ppc64/kernel/bitops.c
107 ===================================================================
108 --- linux-2.6.9.orig/arch/ppc64/kernel/bitops.c 2004-10-19 05:54:37.000000000 +0800
109 +++ linux-2.6.9/arch/ppc64/kernel/bitops.c      2006-09-01 14:05:25.000000000 +0800
110 @@ -145,3 +145,43 @@
111  }
112  
113  EXPORT_SYMBOL(find_next_zero_le_bit);
114 +
115 +unsigned long generic_find_next_le_bit(const unsigned long *addr, unsigned long size,
116 +               unsigned long offset)
117 +{
118 +       const unsigned long *p = addr + offset / BITS_PER_LONG;
119 +       unsigned long result = offset & ~(BITS_PER_LONG - 1);
120 +       unsigned long tmp;
121 +
122 +       if (offset >= size)
123 +               return size;
124 +       size -= result;
125 +       offset %= BITS_PER_LONG;
126 +       if (offset) {
127 +               tmp = __swab64p(p++);
128 +               tmp &= (~0UL << offset);
129 +               if (size < BITS_PER_LONG)
130 +                       goto found_first;
131 +               if (tmp)
132 +                       goto found_middle;
133 +               size -= BITS_PER_LONG;
134 +               result += BITS_PER_LONG;
135 +       }
136 +       while (size & ~(BITS_PER_LONG - 1)) {
137 +               if ((tmp = __swab64p(p++)))
138 +                       goto found_middle;
139 +               result += BITS_PER_LONG;
140 +               size -= BITS_PER_LONG;
141 +       }
142 +       if (!size)
143 +               return result;
144 +       tmp = __swab64p(p);
145 +found_first:
146 +       tmp &= ~0UL >> (BITS_PER_LONG - size);
147 +       if (tmp == 0UL)
148 +               return result + size;
149 +found_middle:
150 +       return result + __ffs(tmp);
151 +}
152 +
153 +EXPORT_SYMBOL(generic_find_next_le_bit);