aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/bit-radix.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/bit-radix.c')
-rw-r--r--fs/btrfs/bit-radix.c10
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
79int find_first_radix_bit(struct radix_tree_root *radix, unsigned long *retbits, 79int 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}