brintos

brintos / linux-shallow public Read only

0
0
Text · 1.1 KiB · 163afc4 Raw
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