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