diff options
Diffstat (limited to 'fs/btrfs/bit-radix.c')
-rw-r--r-- | fs/btrfs/bit-radix.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/fs/btrfs/bit-radix.c b/fs/btrfs/bit-radix.c index 1a0271445dfb..8f9cd4277231 100644 --- a/fs/btrfs/bit-radix.c +++ b/fs/btrfs/bit-radix.c | |||
@@ -77,7 +77,7 @@ int clear_radix_bit(struct radix_tree_root *radix, unsigned long bit) | |||
77 | } | 77 | } |
78 | 78 | ||
79 | int find_first_radix_bit(struct radix_tree_root *radix, unsigned long *retbits, | 79 | int find_first_radix_bit(struct radix_tree_root *radix, unsigned long *retbits, |
80 | int nr) | 80 | unsigned long start, int nr) |
81 | { | 81 | { |
82 | unsigned long *bits; | 82 | unsigned long *bits; |
83 | unsigned long *gang[4]; | 83 | unsigned long *gang[4]; |
@@ -85,10 +85,13 @@ int find_first_radix_bit(struct radix_tree_root *radix, unsigned long *retbits, | |||
85 | int ret; | 85 | int ret; |
86 | int i; | 86 | int i; |
87 | int total_found = 0; | 87 | int total_found = 0; |
88 | unsigned long slot; | ||
88 | 89 | ||
89 | ret = radix_tree_gang_lookup(radix, (void **)gang, 0, ARRAY_SIZE(gang)); | 90 | slot = start / BIT_RADIX_BITS_PER_ARRAY; |
91 | ret = radix_tree_gang_lookup(radix, (void **)gang, slot, | ||
92 | ARRAY_SIZE(gang)); | ||
93 | found = start % BIT_RADIX_BITS_PER_ARRAY; | ||
90 | for (i = 0; i < ret && nr > 0; i++) { | 94 | for (i = 0; i < ret && nr > 0; i++) { |
91 | found = 0; | ||
92 | bits = gang[i]; | 95 | bits = gang[i]; |
93 | while(nr > 0) { | 96 | while(nr > 0) { |
94 | found = find_next_bit(bits + 1, | 97 | found = find_next_bit(bits + 1, |
@@ -104,6 +107,7 @@ int find_first_radix_bit(struct radix_tree_root *radix, unsigned long *retbits, | |||
104 | } else | 107 | } else |
105 | break; | 108 | break; |
106 | } | 109 | } |
110 | found = 0; | ||
107 | } | 111 | } |
108 | return total_found; | 112 | return total_found; |
109 | } | 113 | } |