46 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * QNX4 file system, Linux implementation.4 *5 * Version : 0.2.16 *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 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