nilfs2: refactor nilfs_palloc_find_available_slot()
The current implementation of nilfs_palloc_find_available_slot() function is overkill. The underlying bit search routine is well optimized, so this uses it more simply in nilfs_palloc_find_available_slot(). Signed-off-by: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
4e9e63a671
commit
18c41b37f0
|
@ -335,39 +335,33 @@ void *nilfs_palloc_block_get_entry(const struct inode *inode, __u64 nr,
|
||||||
*/
|
*/
|
||||||
static int nilfs_palloc_find_available_slot(unsigned char *bitmap,
|
static int nilfs_palloc_find_available_slot(unsigned char *bitmap,
|
||||||
unsigned long target,
|
unsigned long target,
|
||||||
int bsize,
|
unsigned bsize,
|
||||||
spinlock_t *lock)
|
spinlock_t *lock)
|
||||||
{
|
{
|
||||||
int curr, pos, end, i;
|
int pos, end = bsize;
|
||||||
|
|
||||||
if (target > 0) {
|
if (likely(target < bsize)) {
|
||||||
end = (target + BITS_PER_LONG - 1) & ~(BITS_PER_LONG - 1);
|
pos = target;
|
||||||
if (end > bsize)
|
do {
|
||||||
end = bsize;
|
pos = nilfs_find_next_zero_bit(bitmap, end, pos);
|
||||||
pos = nilfs_find_next_zero_bit(bitmap, end, target);
|
if (pos >= end)
|
||||||
if (pos < end && !nilfs_set_bit_atomic(lock, pos, bitmap))
|
break;
|
||||||
return pos;
|
if (!nilfs_set_bit_atomic(lock, pos, bitmap))
|
||||||
} else {
|
|
||||||
end = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0, curr = end;
|
|
||||||
i < bsize;
|
|
||||||
i += BITS_PER_LONG, curr += BITS_PER_LONG) {
|
|
||||||
/* wrap around */
|
|
||||||
if (curr >= bsize)
|
|
||||||
curr = 0;
|
|
||||||
while (*((unsigned long *)bitmap + curr / BITS_PER_LONG)
|
|
||||||
!= ~0UL) {
|
|
||||||
end = curr + BITS_PER_LONG;
|
|
||||||
if (end > bsize)
|
|
||||||
end = bsize;
|
|
||||||
pos = nilfs_find_next_zero_bit(bitmap, end, curr);
|
|
||||||
if (pos < end &&
|
|
||||||
!nilfs_set_bit_atomic(lock, pos, bitmap))
|
|
||||||
return pos;
|
return pos;
|
||||||
}
|
} while (++pos < end);
|
||||||
|
|
||||||
|
end = target;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* wrap around */
|
||||||
|
for (pos = 0; pos < end; pos++) {
|
||||||
|
pos = nilfs_find_next_zero_bit(bitmap, end, pos);
|
||||||
|
if (pos >= end)
|
||||||
|
break;
|
||||||
|
if (!nilfs_set_bit_atomic(lock, pos, bitmap))
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
|
||||||
return -ENOSPC;
|
return -ENOSPC;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue