]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | // SPDX-License-Identifier: GPL-2.0 |
1da177e4 LT |
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 | ||
1da177e4 LT |
17 | #include <linux/buffer_head.h> |
18 | #include <linux/bitops.h> | |
964f5369 | 19 | #include "qnx4.h" |
1da177e4 | 20 | |
1da177e4 LT |
21 | unsigned 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) { | |
9b58f6d4 AM |
31 | int bytes = min(size - total, QNX4_BLOCK_SIZE); |
32 | ||
1da177e4 | 33 | if ((bh = sb_bread(sb, start + offset)) == NULL) { |
891ddb95 | 34 | printk(KERN_ERR "qnx4: I/O error in counting free blocks\n"); |
1da177e4 LT |
35 | break; |
36 | } | |
9b58f6d4 AM |
37 | total_free += bytes * BITS_PER_BYTE - |
38 | memweight(bh->b_data, bytes); | |
1da177e4 | 39 | brelse(bh); |
9b58f6d4 | 40 | total += bytes; |
1da177e4 LT |
41 | offset++; |
42 | } | |
43 | ||
44 | return total_free; | |
45 | } |