bitmap.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:4k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * QNX4 file system, Linux implementation.
  3.  *
  4.  * Version : 0.2.1
  5.  *
  6.  * Using parts of the xiafs filesystem.
  7.  *
  8.  * History :
  9.  *
  10.  * 28-05-1998 by Richard Frowijn : first release.
  11.  * 20-06-1998 by Frank Denis : basic optimisations.
  12.  * 25-06-1998 by Frank Denis : qnx4_is_free, qnx4_set_bitmap, qnx4_bmap .
  13.  * 28-06-1998 by Frank Denis : qnx4_free_inode (to be fixed) .
  14.  */
  15. #include <linux/config.h>
  16. #include <linux/sched.h>
  17. #include <linux/qnx4_fs.h>
  18. #include <linux/stat.h>
  19. #include <linux/kernel.h>
  20. #include <linux/string.h>
  21. #include <asm/bitops.h>
  22. int qnx4_new_block(struct super_block *sb)
  23. {
  24. return 0;
  25. }
  26. void count_bits(const register char *bmPart, register int size,
  27. int *const tf)
  28. {
  29. char b;
  30. int tot = *tf;
  31. if (size > QNX4_BLOCK_SIZE) {
  32. size = QNX4_BLOCK_SIZE;
  33. }
  34. do {
  35. b = *bmPart++;
  36. if ((b & 1) == 0)
  37. tot++;
  38. if ((b & 2) == 0)
  39. tot++;
  40. if ((b & 4) == 0)
  41. tot++;
  42. if ((b & 8) == 0)
  43. tot++;
  44. if ((b & 16) == 0)
  45. tot++;
  46. if ((b & 32) == 0)
  47. tot++;
  48. if ((b & 64) == 0)
  49. tot++;
  50. if ((b & 128) == 0)
  51. tot++;
  52. size--;
  53. } while (size != 0);
  54. *tf = tot;
  55. }
  56. unsigned long qnx4_count_free_blocks(struct super_block *sb)
  57. {
  58. int start = le32_to_cpu(sb->u.qnx4_sb.BitMap->di_first_xtnt.xtnt_blk) - 1;
  59. int total = 0;
  60. int total_free = 0;
  61. int offset = 0;
  62. int size = le32_to_cpu(sb->u.qnx4_sb.BitMap->di_size);
  63. struct buffer_head *bh;
  64. while (total < size) {
  65. if ((bh = sb_bread(sb, start + offset)) == NULL) {
  66. printk("qnx4: I/O error in counting free blocksn");
  67. break;
  68. }
  69. count_bits(bh->b_data, size - total, &total_free);
  70. brelse(bh);
  71. total += QNX4_BLOCK_SIZE;
  72. offset++;
  73. }
  74. return total_free;
  75. }
  76. #ifdef CONFIG_QNX4FS_RW
  77. int qnx4_is_free(struct super_block *sb, long block)
  78. {
  79. int start = le32_to_cpu(sb->u.qnx4_sb.BitMap->di_first_xtnt.xtnt_blk) - 1;
  80. int size = le32_to_cpu(sb->u.qnx4_sb.BitMap->di_size);
  81. struct buffer_head *bh;
  82. const char *g;
  83. int ret = -EIO;
  84. start += block / (QNX4_BLOCK_SIZE * 8);
  85. QNX4DEBUG(("qnx4: is_free requesting block [%lu], bitmap in block [%lu]n",
  86.    (unsigned long) block, (unsigned long) start));
  87. (void) size; /* CHECKME */
  88. bh = sb_bread(sb, start);
  89. if (bh == NULL) {
  90. return -EIO;
  91. }
  92. g = bh->b_data + (block % QNX4_BLOCK_SIZE);
  93. if (((*g) & (1 << (block % 8))) == 0) {
  94. QNX4DEBUG(("qnx4: is_free -> block is freen"));
  95. ret = 1;
  96. } else {
  97. QNX4DEBUG(("qnx4: is_free -> block is busyn"));
  98. ret = 0;
  99. }
  100. brelse(bh);
  101. return ret;
  102. }
  103. int qnx4_set_bitmap(struct super_block *sb, long block, int busy)
  104. {
  105. int start = le32_to_cpu(sb->u.qnx4_sb.BitMap->di_first_xtnt.xtnt_blk) - 1;
  106. int size = le32_to_cpu(sb->u.qnx4_sb.BitMap->di_size);
  107. struct buffer_head *bh;
  108. char *g;
  109. start += block / (QNX4_BLOCK_SIZE * 8);
  110. QNX4DEBUG(("qnx4: set_bitmap requesting block [%lu], bitmap in block [%lu]n",
  111.    (unsigned long) block, (unsigned long) start));
  112. (void) size; /* CHECKME */
  113. bh = sb_bread(sb, start);
  114. if (bh == NULL) {
  115. return -EIO;
  116. }
  117. g = bh->b_data + (block % QNX4_BLOCK_SIZE);
  118. if (busy == 0) {
  119. (*g) &= ~(1 << (block % 8));
  120. } else {
  121. (*g) |= (1 << (block % 8));
  122. }
  123. mark_buffer_dirty(bh);
  124. brelse(bh);
  125. return 0;
  126. }
  127. static void qnx4_clear_inode(struct inode *inode)
  128. {
  129. struct qnx4_inode_info *qnx4_ino = &inode->u.qnx4_i;
  130. memset(qnx4_ino->i_reserved, 0, sizeof qnx4_ino->i_reserved);
  131. qnx4_ino->i_size = 0;
  132. qnx4_ino->i_num_xtnts = 0;
  133. qnx4_ino->i_mode = 0;
  134. qnx4_ino->i_status = 0;
  135. }
  136. void qnx4_free_inode(struct inode *inode)
  137. {
  138. if (inode->i_ino < 1) {
  139. printk("free_inode: inode 0 or nonexistent inoden");
  140. return;
  141. }
  142. qnx4_clear_inode(inode);
  143. clear_inode(inode);
  144. }
  145. #endif