diff options
author | Marcin Slusarz <marcin.slusarz@gmail.com> | 2008-02-02 22:37:07 +0100 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2008-04-17 14:22:29 +0200 |
commit | 01b954a36a03d90a66c9dd1fc13e4cb51269caf7 (patch) | |
tree | 5abbd5e79c9858ef20844be77edf3133eda0ed98 /fs/udf/super.c | |
parent | d652eefb70142c64495f4188883f9dfc0430a96b (diff) | |
download | op-kernel-dev-01b954a36a03d90a66c9dd1fc13e4cb51269caf7.zip op-kernel-dev-01b954a36a03d90a66c9dd1fc13e4cb51269caf7.tar.gz |
udf: convert udf_count_free_bitmap to use bitmap_weight
replace handwritten bits counting with bitmap_weight
Signed-off-by: Marcin Slusarz <marcin.slusarz@gmail.com>
Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs/udf/super.c')
-rw-r--r-- | fs/udf/super.c | 17 |
1 files changed, 5 insertions, 12 deletions
diff --git a/fs/udf/super.c b/fs/udf/super.c index 2666e5b..be0aa42 100644 --- a/fs/udf/super.c +++ b/fs/udf/super.c @@ -55,6 +55,7 @@ #include <linux/errno.h> #include <linux/mount.h> #include <linux/seq_file.h> +#include <linux/bitmap.h> #include <asm/byteorder.h> #include "udf_sb.h" @@ -1958,10 +1959,6 @@ static int udf_statfs(struct dentry *dentry, struct kstatfs *buf) return 0; } -static unsigned char udf_bitmap_lookup[16] = { - 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 -}; - static unsigned int udf_count_free_bitmap(struct super_block *sb, struct udf_bitmap *bitmap) { @@ -1971,7 +1968,6 @@ static unsigned int udf_count_free_bitmap(struct super_block *sb, int block = 0, newblock; kernel_lb_addr loc; uint32_t bytes; - uint8_t value; uint8_t *ptr; uint16_t ident; struct spaceBitmapDesc *bm; @@ -1997,13 +1993,10 @@ static unsigned int udf_count_free_bitmap(struct super_block *sb, ptr = (uint8_t *)bh->b_data; while (bytes > 0) { - while ((bytes > 0) && (index < sb->s_blocksize)) { - value = ptr[index]; - accum += udf_bitmap_lookup[value & 0x0f]; - accum += udf_bitmap_lookup[value >> 4]; - index++; - bytes--; - } + u32 cur_bytes = min_t(u32, bytes, sb->s_blocksize - index); + accum += bitmap_weight((const unsigned long *)(ptr + index), + cur_bytes * 8); + bytes -= cur_bytes; if (bytes) { brelse(bh); newblock = udf_get_lb_pblock(sb, loc, ++block); |