quotaops.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:6k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Definitions for diskquota-operations. When diskquota is configured these
  3.  * macros expand to the right source-code.
  4.  *
  5.  * Author:  Marco van Wieringen <mvw@planets.elm.net>
  6.  *
  7.  * Version: $Id: quotaops.h,v 1.2 1998/01/15 16:22:26 ecd Exp $
  8.  *
  9.  */
  10. #ifndef _LINUX_QUOTAOPS_
  11. #define _LINUX_QUOTAOPS_
  12. #include <linux/config.h>
  13. #include <linux/smp_lock.h>
  14. #if defined(CONFIG_QUOTA)
  15. #include <linux/fs.h>
  16. /*
  17.  * declaration of quota_function calls in kernel.
  18.  */
  19. extern void dquot_initialize(struct inode *inode, short type);
  20. extern void dquot_drop(struct inode *inode);
  21. extern int  quota_off(struct super_block *sb, short type);
  22. extern int  sync_dquots(kdev_t dev, short type);
  23. extern int  dquot_alloc_block(struct inode *inode, unsigned long number, char prealloc);
  24. extern int  dquot_alloc_inode(const struct inode *inode, unsigned long number);
  25. extern void dquot_free_block(struct inode *inode, unsigned long number);
  26. extern void dquot_free_inode(const struct inode *inode, unsigned long number);
  27. extern int  dquot_transfer(struct inode *inode, struct iattr *iattr);
  28. /*
  29.  * Operations supported for diskquotas.
  30.  */
  31. #define sb_any_quota_enabled(sb) ((sb)->s_dquot.flags & (DQUOT_USR_ENABLED | DQUOT_GRP_ENABLED))
  32. static __inline__ void DQUOT_INIT(struct inode *inode)
  33. {
  34. if (!inode->i_sb)
  35. BUG();
  36. lock_kernel();
  37. if (sb_any_quota_enabled(inode->i_sb) && !IS_NOQUOTA(inode))
  38. inode->i_sb->dq_op->initialize(inode, -1);
  39. unlock_kernel();
  40. }
  41. static __inline__ void DQUOT_DROP(struct inode *inode)
  42. {
  43. lock_kernel();
  44. if (IS_QUOTAINIT(inode)) {
  45. if (!inode->i_sb)
  46. BUG();
  47. inode->i_sb->dq_op->drop(inode); /* Ops must be set when there's any quota... */
  48. }
  49. unlock_kernel();
  50. }
  51. static __inline__ int DQUOT_PREALLOC_BLOCK_NODIRTY(struct inode *inode, int nr)
  52. {
  53. lock_kernel();
  54. if (sb_any_quota_enabled(inode->i_sb)) {
  55. /* Number of used blocks is updated in alloc_block() */
  56. if (inode->i_sb->dq_op->alloc_block(inode, fs_to_dq_blocks(nr, inode->i_sb->s_blocksize), 1) == NO_QUOTA) {
  57. unlock_kernel();
  58. return 1;
  59. }
  60. }
  61. else
  62. inode->i_blocks += nr << (inode->i_sb->s_blocksize_bits - 9);
  63. unlock_kernel();
  64. return 0;
  65. }
  66. static __inline__ int DQUOT_PREALLOC_BLOCK(struct inode *inode, int nr)
  67. {
  68. int ret;
  69.         if (!(ret =  DQUOT_PREALLOC_BLOCK_NODIRTY(inode, nr)))
  70. mark_inode_dirty(inode);
  71. return ret;
  72. }
  73. static __inline__ int DQUOT_ALLOC_BLOCK_NODIRTY(struct inode *inode, int nr)
  74. {
  75. lock_kernel();
  76. if (sb_any_quota_enabled(inode->i_sb)) {
  77. /* Number of used blocks is updated in alloc_block() */
  78. if (inode->i_sb->dq_op->alloc_block(inode, fs_to_dq_blocks(nr, inode->i_sb->s_blocksize), 0) == NO_QUOTA) {
  79. unlock_kernel();
  80. return 1;
  81. }
  82. }
  83. else
  84. inode->i_blocks += nr << (inode->i_sb->s_blocksize_bits - 9);
  85. unlock_kernel();
  86. return 0;
  87. }
  88. static __inline__ int DQUOT_ALLOC_BLOCK(struct inode *inode, int nr)
  89. {
  90. int ret;
  91. if (!(ret = DQUOT_ALLOC_BLOCK_NODIRTY(inode, nr)))
  92. mark_inode_dirty(inode);
  93. return ret;
  94. }
  95. static __inline__ int DQUOT_ALLOC_INODE(struct inode *inode)
  96. {
  97. lock_kernel();
  98. if (sb_any_quota_enabled(inode->i_sb)) {
  99. DQUOT_INIT(inode);
  100. if (inode->i_sb->dq_op->alloc_inode(inode, 1) == NO_QUOTA) {
  101. unlock_kernel();
  102. return 1;
  103. }
  104. }
  105. unlock_kernel();
  106. return 0;
  107. }
  108. static __inline__ void DQUOT_FREE_BLOCK_NODIRTY(struct inode *inode, int nr)
  109. {
  110. lock_kernel();
  111. if (sb_any_quota_enabled(inode->i_sb))
  112. inode->i_sb->dq_op->free_block(inode, fs_to_dq_blocks(nr, inode->i_sb->s_blocksize));
  113. else
  114. inode->i_blocks -= nr << (inode->i_sb->s_blocksize_bits - 9);
  115. unlock_kernel();
  116. }
  117. static __inline__ void DQUOT_FREE_BLOCK(struct inode *inode, int nr)
  118. {
  119. DQUOT_FREE_BLOCK_NODIRTY(inode, nr);
  120. mark_inode_dirty(inode);
  121. }
  122. static __inline__ void DQUOT_FREE_INODE(struct inode *inode)
  123. {
  124. lock_kernel();
  125. if (sb_any_quota_enabled(inode->i_sb))
  126. inode->i_sb->dq_op->free_inode(inode, 1);
  127. unlock_kernel();
  128. }
  129. static __inline__ int DQUOT_TRANSFER(struct inode *inode, struct iattr *iattr)
  130. {
  131. lock_kernel();
  132. if (sb_any_quota_enabled(inode->i_sb) && !IS_NOQUOTA(inode)) {
  133. DQUOT_INIT(inode);
  134. if (inode->i_sb->dq_op->transfer(inode, iattr) == NO_QUOTA) {
  135. unlock_kernel();
  136. return 1;
  137. }
  138. }
  139. unlock_kernel();
  140. return 0;
  141. }
  142. #define DQUOT_SYNC(dev) sync_dquots(dev, -1)
  143. #define DQUOT_OFF(sb) quota_off(sb, -1)
  144. #else
  145. /*
  146.  * NO-OP when quota not configured.
  147.  */
  148. #define DQUOT_INIT(inode) do { } while(0)
  149. #define DQUOT_DROP(inode) do { } while(0)
  150. #define DQUOT_ALLOC_INODE(inode) (0)
  151. #define DQUOT_FREE_INODE(inode) do { } while(0)
  152. #define DQUOT_SYNC(dev) do { } while(0)
  153. #define DQUOT_OFF(sb) do { } while(0)
  154. #define DQUOT_TRANSFER(inode, iattr) (0)
  155. extern __inline__ int DQUOT_PREALLOC_BLOCK_NODIRTY(struct inode *inode, int nr)
  156. {
  157. lock_kernel();
  158. inode->i_blocks += nr << (inode->i_sb->s_blocksize_bits - 9);
  159. unlock_kernel();
  160. return 0;
  161. }
  162. extern __inline__ int DQUOT_PREALLOC_BLOCK(struct inode *inode, int nr)
  163. {
  164. DQUOT_PREALLOC_BLOCK_NODIRTY(inode, nr);
  165. mark_inode_dirty(inode);
  166. return 0;
  167. }
  168. extern __inline__ int DQUOT_ALLOC_BLOCK_NODIRTY(struct inode *inode, int nr)
  169. {
  170. lock_kernel();
  171. inode->i_blocks += nr << (inode->i_sb->s_blocksize_bits - 9);
  172. unlock_kernel();
  173. return 0;
  174. }
  175. extern __inline__ int DQUOT_ALLOC_BLOCK(struct inode *inode, int nr)
  176. {
  177. DQUOT_ALLOC_BLOCK_NODIRTY(inode, nr);
  178. mark_inode_dirty(inode);
  179. return 0;
  180. }
  181. extern __inline__ void DQUOT_FREE_BLOCK_NODIRTY(struct inode *inode, int nr)
  182. {
  183. lock_kernel();
  184. inode->i_blocks -= nr << (inode->i_sb->s_blocksize_bits - 9);
  185. unlock_kernel();
  186. }
  187. extern __inline__ void DQUOT_FREE_BLOCK(struct inode *inode, int nr)
  188. {
  189. DQUOT_FREE_BLOCK_NODIRTY(inode, nr);
  190. mark_inode_dirty(inode);
  191. }
  192. #endif /* CONFIG_QUOTA */
  193. #endif /* _LINUX_QUOTAOPS_ */