--- linux/fs/minix/bitmap.c 2018/04/24 18:07:17 1.1.1.2 +++ linux/fs/minix/bitmap.c 2018/04/24 18:10:48 1.1.1.4 @@ -1,12 +1,12 @@ /* - * linux/fs/bitmap.c + * linux/fs/minix/bitmap.c * * (C) 1991 Linus Torvalds */ /* bitmap.c contains the code that handles the inode and block bitmaps */ -#include +#include #include #include #include @@ -44,6 +44,35 @@ __asm__("cld\n" \ :"=c" (__res):"0" (0),"S" (addr):"ax","dx","si"); \ __res;}) +static int nibblemap[] = { 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4 }; + +static unsigned long count_used(struct buffer_head *map[], unsigned numblocks, + unsigned numbits) +{ + unsigned i, j, end, sum = 0; + struct buffer_head *bh; + + for (i=0; (i= (8*BLOCK_SIZE)) { + end = BLOCK_SIZE; + numbits -= 8*BLOCK_SIZE; + } else { + int tmp; + end = numbits >> 3; + numbits &= 0x7; + tmp = bh->b_data[end] & ((1<>4)&0xf]; + numbits = 0; + } + for (j=0; jb_data[j] & 0xf] + + nibblemap[(bh->b_data[j]>>4)&0xf]; + } + return(sum); +} + int minix_free_block(int dev, int block) { struct super_block * sb; @@ -107,6 +136,12 @@ int minix_new_block(int dev) return j; } +unsigned long minix_count_free_blocks(struct super_block *sb) +{ + return (sb->s_nzones - count_used(sb->s_zmap,sb->s_zmap_blocks,sb->s_nzones)) + << sb->s_log_zone_size; +} + void minix_free_inode(struct inode * inode) { struct buffer_head * bh; @@ -182,3 +217,8 @@ struct inode * minix_new_inode(int dev) inode->i_op = NULL; return inode; } + +unsigned long minix_count_free_inodes(struct super_block *sb) +{ + return sb->s_ninodes - count_used(sb->s_imap,sb->s_imap_blocks,sb->s_ninodes); +}