1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * QNX4 file system, Linux implementation. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Version : 0.2.1 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Using parts of the xiafs filesystem. 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * History : 10*4882a593Smuzhiyun * 11*4882a593Smuzhiyun * 28-05-1998 by Richard Frowijn : first release. 12*4882a593Smuzhiyun * 20-06-1998 by Frank Denis : basic optimisations. 13*4882a593Smuzhiyun * 25-06-1998 by Frank Denis : qnx4_is_free, qnx4_set_bitmap, qnx4_bmap . 14*4882a593Smuzhiyun * 28-06-1998 by Frank Denis : qnx4_free_inode (to be fixed) . 15*4882a593Smuzhiyun */ 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #include <linux/buffer_head.h> 18*4882a593Smuzhiyun #include <linux/bitops.h> 19*4882a593Smuzhiyun #include "qnx4.h" 20*4882a593Smuzhiyun qnx4_count_free_blocks(struct super_block * sb)21*4882a593Smuzhiyununsigned long qnx4_count_free_blocks(struct super_block *sb) 22*4882a593Smuzhiyun { 23*4882a593Smuzhiyun int start = le32_to_cpu(qnx4_sb(sb)->BitMap->di_first_xtnt.xtnt_blk) - 1; 24*4882a593Smuzhiyun int total = 0; 25*4882a593Smuzhiyun int total_free = 0; 26*4882a593Smuzhiyun int offset = 0; 27*4882a593Smuzhiyun int size = le32_to_cpu(qnx4_sb(sb)->BitMap->di_size); 28*4882a593Smuzhiyun struct buffer_head *bh; 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun while (total < size) { 31*4882a593Smuzhiyun int bytes = min(size - total, QNX4_BLOCK_SIZE); 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun if ((bh = sb_bread(sb, start + offset)) == NULL) { 34*4882a593Smuzhiyun printk(KERN_ERR "qnx4: I/O error in counting free blocks\n"); 35*4882a593Smuzhiyun break; 36*4882a593Smuzhiyun } 37*4882a593Smuzhiyun total_free += bytes * BITS_PER_BYTE - 38*4882a593Smuzhiyun memweight(bh->b_data, bytes); 39*4882a593Smuzhiyun brelse(bh); 40*4882a593Smuzhiyun total += bytes; 41*4882a593Smuzhiyun offset++; 42*4882a593Smuzhiyun } 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun return total_free; 45*4882a593Smuzhiyun } 46