Skip to content

Commit

Permalink
qnx4fs: use memweight()
Browse files Browse the repository at this point in the history
Use memweight() to count the total number of bits clear in memory area.

Note that this memweight() call can't be replaced with a single
bitmap_weight() call, although the pointer to the memory area is aligned
to long-word boundary.  Because the size of the memory area may not be a
multiple of BITS_PER_LONG, then it returns wrong value on big-endian
architecture.

Signed-off-by: Akinobu Mita <[email protected]>
Acked-by: Anders Larsen <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
mita authored and torvalds committed Jul 31, 2012
1 parent 639b9e3 commit 9b58f6d
Showing 1 changed file with 5 additions and 19 deletions.
24 changes: 5 additions & 19 deletions fs/qnx4/bitmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,23 +17,6 @@
#include <linux/bitops.h>
#include "qnx4.h"

static void count_bits(register const char *bmPart, register int size,
int *const tf)
{
char b;
int tot = *tf;

if (size > QNX4_BLOCK_SIZE) {
size = QNX4_BLOCK_SIZE;
}
do {
b = *bmPart++;
tot += 8 - hweight8(b);
size--;
} while (size != 0);
*tf = tot;
}

unsigned long qnx4_count_free_blocks(struct super_block *sb)
{
int start = le32_to_cpu(qnx4_sb(sb)->BitMap->di_first_xtnt.xtnt_blk) - 1;
Expand All @@ -44,13 +27,16 @@ unsigned long qnx4_count_free_blocks(struct super_block *sb)
struct buffer_head *bh;

while (total < size) {
int bytes = min(size - total, QNX4_BLOCK_SIZE);

if ((bh = sb_bread(sb, start + offset)) == NULL) {
printk(KERN_ERR "qnx4: I/O error in counting free blocks\n");
break;
}
count_bits(bh->b_data, size - total, &total_free);
total_free += bytes * BITS_PER_BYTE -
memweight(bh->b_data, bytes);
brelse(bh);
total += QNX4_BLOCK_SIZE;
total += bytes;
offset++;
}

Expand Down

0 comments on commit 9b58f6d

Please sign in to comment.