Re: [PATCH] Introduce ext4_find_next_bit

Balbir Singh
2007-09-21T06:45:28Z

Aneesh Kumar K.V wrote:
> Also add generic_find_next_le_bit
>
> This gets used by the ext4 multi block allocator patches.
>

Looks like it's a straight forward on Little Endian Architectures.
I see something for powerpc, what about other architectures?

>
> +unsigned long generic_find_next_le_bit(const unsigned long *addr, unsigned
> + long size, unsigned long offset)
> +{

Docbook style comments on the function and arguments would be nice.

> + const unsigned long *p = addr + BITOP_WORD(offset);
> + unsigned long result = offset & ~(BITS_PER_LONG - 1);
> + unsigned long tmp;
> +
> + if (offset >= size)
> + return size;
> + size -= result;
> + offset &= (BITS_PER_LONG - 1UL);
> + if (offset) {
> + tmp = ext2_swabp(p++);
> + tmp &= (~0UL << offset);
> + if (size < BITS_PER_LONG)
> + goto found_first;
> + if (tmp)
> + goto found_middle;
> + size -= BITS_PER_LONG;
> + result += BITS_PER_LONG;
> + }
> +
> + while (size & ~(BITS_PER_LONG - 1)) {
> + tmp = *(p++);
> + if (tmp)
> + goto found_middle_swap;
> + result += BITS_PER_LONG;
> + size -= BITS_PER_LONG;
> + }
> + if (!size)
> + return result;
> + tmp = ext2_swabp(p);
> +found_first:
> + tmp &= (~0UL >> (BITS_PER_LONG - size));
> + if (tmp == 0UL) /* Are any bits set? */
> + return result + size; /* Nope. */
> +found_middle:
> + return result + __ffs(tmp);
> +
> +found_middle_swap:
> + return result + __ffs(ext2_swab(tmp));
> +}
> +EXPORT_SYMBOL(generic_find_next_le_bit);
> +
> #endif /* __BIG_ENDIAN */

--
Warm Regards,
Balbir Singh
Linux Technology Center
IBM, ISTL