summaryrefslogtreecommitdiff
path: root/fs/udf
diff options
context:
space:
mode:
authorMarcin Slusarz <marcin.slusarz@gmail.com>2008-02-02 22:37:07 +0100
committerJan Kara <jack@suse.cz>2008-04-17 14:22:29 +0200
commit01b954a36a03d90a66c9dd1fc13e4cb51269caf7 (patch)
tree5abbd5e79c9858ef20844be77edf3133eda0ed98 /fs/udf
parentd652eefb70142c64495f4188883f9dfc0430a96b (diff)
downloadlwn-01b954a36a03d90a66c9dd1fc13e4cb51269caf7.tar.gz
lwn-01b954a36a03d90a66c9dd1fc13e4cb51269caf7.zip
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')
-rw-r--r--fs/udf/super.c17
1 files changed, 5 insertions, 12 deletions
diff --git a/fs/udf/super.c b/fs/udf/super.c
index 2666e5bc69ff..be0aa424b8f1 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);