Blame view

fs/qnx4/bitmap.c 1.26 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  /*
   * QNX4 file system, Linux implementation.
   *
   * Version : 0.2.1
   *
   * Using parts of the xiafs filesystem.
   *
   * History :
   *
   * 28-05-1998 by Richard Frowijn : first release.
   * 20-06-1998 by Frank Denis : basic optimisations.
   * 25-06-1998 by Frank Denis : qnx4_is_free, qnx4_set_bitmap, qnx4_bmap .
   * 28-06-1998 by Frank Denis : qnx4_free_inode (to be fixed) .
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
15
16
  #include <linux/buffer_head.h>
  #include <linux/bitops.h>
964f53696   Al Viro   fs/qnx4: sanitize...
17
  #include "qnx4.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
18

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
19
20
21
22
23
24
25
26
27
28
29
  static void count_bits(register const char *bmPart, register int size,
  		       int *const tf)
  {
  	char b;
  	int tot = *tf;
  
  	if (size > QNX4_BLOCK_SIZE) {
  		size = QNX4_BLOCK_SIZE;
  	}
  	do {
  		b = *bmPart++;
868d64812   Akinobu Mita   qnx4: use hweight8
30
  		tot += 8 - hweight8(b);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
  		size--;
  	} while (size != 0);
  	*tf = tot;
  }
  
  unsigned long qnx4_count_free_blocks(struct super_block *sb)
  {
  	int start = le32_to_cpu(qnx4_sb(sb)->BitMap->di_first_xtnt.xtnt_blk) - 1;
  	int total = 0;
  	int total_free = 0;
  	int offset = 0;
  	int size = le32_to_cpu(qnx4_sb(sb)->BitMap->di_size);
  	struct buffer_head *bh;
  
  	while (total < size) {
  		if ((bh = sb_bread(sb, start + offset)) == NULL) {
891ddb95d   Anders Larsen   qnx4fs: add missi...
47
48
  			printk(KERN_ERR "qnx4: I/O error in counting free blocks
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
49
50
51
52
53
54
55
56
57
58
  			break;
  		}
  		count_bits(bh->b_data, size - total, &total_free);
  		brelse(bh);
  		total += QNX4_BLOCK_SIZE;
  		offset++;
  	}
  
  	return total_free;
  }