Blame view

kernel/linux-rt-4.4.41/fs/qnx4/bitmap.c 1.05 KB
5113f6f70   김현기   kernel add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
  /*
   * 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) .
   */
  
  #include <linux/buffer_head.h>
  #include <linux/bitops.h>
  #include "qnx4.h"
  
  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) {
  		int bytes = min(size - total, QNX4_BLOCK_SIZE);
  
  		if ((bh = sb_bread(sb, start + offset)) == NULL) {
  			printk(KERN_ERR "qnx4: I/O error in counting free blocks
  ");
  			break;
  		}
  		total_free += bytes * BITS_PER_BYTE -
  				memweight(bh->b_data, bytes);
  		brelse(bh);
  		total += bytes;
  		offset++;
  	}
  
  	return total_free;
  }