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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/fs/ufs/util.c
  3.  *
  4.  * Copyright (C) 1998
  5.  * Daniel Pirkl <daniel.pirkl@email.cz>
  6.  * Charles University, Faculty of Mathematics and Physics
  7.  */
  8.  
  9. #include <linux/string.h>
  10. #include <linux/slab.h>
  11. #include <linux/locks.h>
  12. #include "swab.h"
  13. #include "util.h"
  14. #undef UFS_UTILS_DEBUG
  15. #ifdef UFS_UTILS_DEBUG
  16. #define UFSD(x) printk("(%s, %d), %s: ", __FILE__, __LINE__, __FUNCTION__); printk x;
  17. #else
  18. #define UFSD(x)
  19. #endif
  20. struct ufs_buffer_head * _ubh_bread_ (struct ufs_sb_private_info * uspi,
  21. struct super_block *sb, unsigned fragment, unsigned size)
  22. {
  23. struct ufs_buffer_head * ubh;
  24. unsigned i, j, count;
  25. if (size & ~uspi->s_fmask)
  26. return NULL;
  27. count = size >> uspi->s_fshift;
  28. if (count > UFS_MAXFRAG)
  29. return NULL;
  30. ubh = (struct ufs_buffer_head *)
  31. kmalloc (sizeof (struct ufs_buffer_head), GFP_KERNEL);
  32. if (!ubh)
  33. return NULL;
  34. ubh->fragment = fragment;
  35. ubh->count = count;
  36. for (i = 0; i < count; i++)
  37. if (!(ubh->bh[i] = sb_bread(sb, fragment + i)))
  38. goto failed;
  39. for (; i < UFS_MAXFRAG; i++)
  40. ubh->bh[i] = NULL;
  41. return ubh;
  42. failed:
  43. for (j = 0; j < i; j++)
  44. brelse (ubh->bh[j]);
  45. return NULL;
  46. }
  47. struct ufs_buffer_head * ubh_bread_uspi (struct ufs_sb_private_info * uspi,
  48. struct super_block *sb, unsigned fragment, unsigned size)
  49. {
  50. unsigned i, j, count;
  51. if (size & ~uspi->s_fmask)
  52. return NULL;
  53. count = size >> uspi->s_fshift;
  54. if (count <= 0 || count > UFS_MAXFRAG)
  55. return NULL;
  56. USPI_UBH->fragment = fragment;
  57. USPI_UBH->count = count;
  58. for (i = 0; i < count; i++)
  59. if (!(USPI_UBH->bh[i] = sb_bread(sb, fragment + i)))
  60. goto failed;
  61. for (; i < UFS_MAXFRAG; i++)
  62. USPI_UBH->bh[i] = NULL;
  63. return USPI_UBH;
  64. failed:
  65. for (j = 0; j < i; j++)
  66. brelse (USPI_UBH->bh[j]);
  67. return NULL;
  68. }
  69. void ubh_brelse (struct ufs_buffer_head * ubh)
  70. {
  71. unsigned i;
  72. if (!ubh)
  73. return;
  74. for (i = 0; i < ubh->count; i++)
  75. brelse (ubh->bh[i]);
  76. kfree (ubh);
  77. }
  78. void ubh_brelse_uspi (struct ufs_sb_private_info * uspi)
  79. {
  80. unsigned i;
  81. if (!USPI_UBH)
  82. return;
  83. for ( i = 0; i < USPI_UBH->count; i++ ) {
  84. brelse (USPI_UBH->bh[i]);
  85. USPI_UBH->bh[i] = NULL;
  86. }
  87. }
  88. void ubh_mark_buffer_dirty (struct ufs_buffer_head * ubh)
  89. {
  90. unsigned i;
  91. if (!ubh)
  92. return;
  93. for ( i = 0; i < ubh->count; i++ )
  94. mark_buffer_dirty (ubh->bh[i]);
  95. }
  96. void ubh_mark_buffer_uptodate (struct ufs_buffer_head * ubh, int flag)
  97. {
  98. unsigned i;
  99. if (!ubh)
  100. return;
  101. for ( i = 0; i < ubh->count; i++ )
  102. mark_buffer_uptodate (ubh->bh[i], flag);
  103. }
  104. void ubh_ll_rw_block (int rw, unsigned nr, struct ufs_buffer_head * ubh[])
  105. {
  106. unsigned i;
  107. if (!ubh)
  108. return;
  109. for ( i = 0; i < nr; i++ )
  110. ll_rw_block (rw, ubh[i]->count, ubh[i]->bh);
  111. }
  112. void ubh_wait_on_buffer (struct ufs_buffer_head * ubh)
  113. {
  114. unsigned i;
  115. if (!ubh)
  116. return;
  117. for ( i = 0; i < ubh->count; i++ )
  118. wait_on_buffer (ubh->bh[i]);
  119. }
  120. unsigned ubh_max_bcount (struct ufs_buffer_head * ubh)
  121. {
  122. unsigned i;
  123. unsigned max = 0;
  124. if (!ubh)
  125. return 0;
  126. for ( i = 0; i < ubh->count; i++ ) 
  127. if ( atomic_read(&ubh->bh[i]->b_count) > max )
  128. max = atomic_read(&ubh->bh[i]->b_count);
  129. return max;
  130. }
  131. void ubh_bforget (struct ufs_buffer_head * ubh)
  132. {
  133. unsigned i;
  134. if (!ubh) 
  135. return;
  136. for ( i = 0; i < ubh->count; i++ ) if ( ubh->bh[i] ) 
  137. bforget (ubh->bh[i]);
  138. }
  139.  
  140. int ubh_buffer_dirty (struct ufs_buffer_head * ubh)
  141. {
  142. unsigned i;
  143. unsigned result = 0;
  144. if (!ubh)
  145. return 0;
  146. for ( i = 0; i < ubh->count; i++ )
  147. result |= buffer_dirty(ubh->bh[i]);
  148. return result;
  149. }
  150. void _ubh_ubhcpymem_(struct ufs_sb_private_info * uspi, 
  151. unsigned char * mem, struct ufs_buffer_head * ubh, unsigned size)
  152. {
  153. unsigned len, bhno;
  154. if (size > (ubh->count << uspi->s_fshift))
  155. size = ubh->count << uspi->s_fshift;
  156. bhno = 0;
  157. while (size) {
  158. len = min_t(unsigned int, size, uspi->s_fsize);
  159. memcpy (mem, ubh->bh[bhno]->b_data, len);
  160. mem += uspi->s_fsize;
  161. size -= len;
  162. bhno++;
  163. }
  164. }
  165. void _ubh_memcpyubh_(struct ufs_sb_private_info * uspi, 
  166. struct ufs_buffer_head * ubh, unsigned char * mem, unsigned size)
  167. {
  168. unsigned len, bhno;
  169. if (size > (ubh->count << uspi->s_fshift))
  170. size = ubh->count << uspi->s_fshift;
  171. bhno = 0;
  172. while (size) {
  173. len = min_t(unsigned int, size, uspi->s_fsize);
  174. memcpy (ubh->bh[bhno]->b_data, mem, len);
  175. mem += uspi->s_fsize;
  176. size -= len;
  177. bhno++;
  178. }
  179. }