1 /* 2 * QNX4 file system, Linux implementation. 3 * 4 * Version : 0.2.1 5 * 6 * Using parts of the xiafs filesystem. 7 * 8 * History : 9 * 10 * 28-05-1998 by Richard Frowijn : first release. 11 * 20-06-1998 by Frank Denis : basic optimisations. 12 * 25-06-1998 by Frank Denis : qnx4_is_free, qnx4_set_bitmap, qnx4_bmap . 13 * 28-06-1998 by Frank Denis : qnx4_free_inode (to be fixed) . 14 */ 15 16 #include <linux/buffer_head.h> 17 #include <linux/bitops.h> 18 #include "qnx4.h" 19 20 #if 0 21 int qnx4_new_block(struct super_block *sb) 22 { 23 return 0; 24 } 25 #endif /* 0 */ 26 27 static void count_bits(register const char *bmPart, register int size, 28 int *const tf) 29 { 30 char b; 31 int tot = *tf; 32 33 if (size > QNX4_BLOCK_SIZE) { 34 size = QNX4_BLOCK_SIZE; 35 } 36 do { 37 b = *bmPart++; 38 if ((b & 1) == 0) 39 tot++; 40 if ((b & 2) == 0) 41 tot++; 42 if ((b & 4) == 0) 43 tot++; 44 if ((b & 8) == 0) 45 tot++; 46 if ((b & 16) == 0) 47 tot++; 48 if ((b & 32) == 0) 49 tot++; 50 if ((b & 64) == 0) 51 tot++; 52 if ((b & 128) == 0) 53 tot++; 54 size--; 55 } while (size != 0); 56 *tf = tot; 57 } 58 59 unsigned long qnx4_count_free_blocks(struct super_block *sb) 60 { 61 int start = le32_to_cpu(qnx4_sb(sb)->BitMap->di_first_xtnt.xtnt_blk) - 1; 62 int total = 0; 63 int total_free = 0; 64 int offset = 0; 65 int size = le32_to_cpu(qnx4_sb(sb)->BitMap->di_size); 66 struct buffer_head *bh; 67 68 while (total < size) { 69 if ((bh = sb_bread(sb, start + offset)) == NULL) { 70 printk("qnx4: I/O error in counting free blocks\n"); 71 break; 72 } 73 count_bits(bh->b_data, size - total, &total_free); 74 brelse(bh); 75 total += QNX4_BLOCK_SIZE; 76 offset++; 77 } 78 79 return total_free; 80 } 81