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 <[email protected]> 6 */ 7 #ifndef _LINUX_QUOTAOPS_ 8 #define _LINUX_QUOTAOPS_ 9 10 #include <linux/smp_lock.h> 11 #include <linux/fs.h> 12 13 static inline struct quota_info *sb_dqopt(struct super_block *sb) 14 { 15 return &sb->s_dquot; 16 } 17 18 #if defined(CONFIG_QUOTA) 19 20 /* 21 * declaration of quota_function calls in kernel. 22 */ 23 void sync_dquots(struct super_block *sb, int type); 24 25 int dquot_initialize(struct inode *inode, int type); 26 int dquot_drop(struct inode *inode); 27 struct dquot *dqget(struct super_block *sb, unsigned int id, int type); 28 void dqput(struct dquot *dquot); 29 int dquot_scan_active(struct super_block *sb, 30 int (*fn)(struct dquot *dquot, unsigned long priv), 31 unsigned long priv); 32 struct dquot *dquot_alloc(struct super_block *sb, int type); 33 void dquot_destroy(struct dquot *dquot); 34 35 int dquot_alloc_space(struct inode *inode, qsize_t number, int prealloc); 36 int dquot_alloc_inode(const struct inode *inode, qsize_t number); 37 38 int dquot_free_space(struct inode *inode, qsize_t number); 39 int dquot_free_inode(const struct inode *inode, qsize_t number); 40 41 int dquot_transfer(struct inode *inode, struct iattr *iattr); 42 int dquot_commit(struct dquot *dquot); 43 int dquot_acquire(struct dquot *dquot); 44 int dquot_release(struct dquot *dquot); 45 int dquot_commit_info(struct super_block *sb, int type); 46 int dquot_mark_dquot_dirty(struct dquot *dquot); 47 48 int vfs_quota_on(struct super_block *sb, int type, int format_id, 49 char *path, int remount); 50 int vfs_quota_enable(struct inode *inode, int type, int format_id, 51 unsigned int flags); 52 int vfs_quota_on_path(struct super_block *sb, int type, int format_id, 53 struct path *path); 54 int vfs_quota_on_mount(struct super_block *sb, char *qf_name, 55 int format_id, int type); 56 int vfs_quota_off(struct super_block *sb, int type, int remount); 57 int vfs_quota_disable(struct super_block *sb, int type, unsigned int flags); 58 int vfs_quota_sync(struct super_block *sb, int type); 59 int vfs_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); 60 int vfs_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); 61 int vfs_get_dqblk(struct super_block *sb, int type, qid_t id, struct if_dqblk *di); 62 int vfs_set_dqblk(struct super_block *sb, int type, qid_t id, struct if_dqblk *di); 63 64 void vfs_dq_drop(struct inode *inode); 65 int vfs_dq_transfer(struct inode *inode, struct iattr *iattr); 66 int vfs_dq_quota_on_remount(struct super_block *sb); 67 68 static inline struct mem_dqinfo *sb_dqinfo(struct super_block *sb, int type) 69 { 70 return sb_dqopt(sb)->info + type; 71 } 72 73 /* 74 * Functions for checking status of quota 75 */ 76 77 static inline int sb_has_quota_usage_enabled(struct super_block *sb, int type) 78 { 79 return sb_dqopt(sb)->flags & 80 dquot_state_flag(DQUOT_USAGE_ENABLED, type); 81 } 82 83 static inline int sb_has_quota_limits_enabled(struct super_block *sb, int type) 84 { 85 return sb_dqopt(sb)->flags & 86 dquot_state_flag(DQUOT_LIMITS_ENABLED, type); 87 } 88 89 static inline int sb_has_quota_suspended(struct super_block *sb, int type) 90 { 91 return sb_dqopt(sb)->flags & 92 dquot_state_flag(DQUOT_SUSPENDED, type); 93 } 94 95 static inline int sb_any_quota_suspended(struct super_block *sb) 96 { 97 return sb_has_quota_suspended(sb, USRQUOTA) || 98 sb_has_quota_suspended(sb, GRPQUOTA); 99 } 100 101 /* Does kernel know about any quota information for given sb + type? */ 102 static inline int sb_has_quota_loaded(struct super_block *sb, int type) 103 { 104 /* Currently if anything is on, then quota usage is on as well */ 105 return sb_has_quota_usage_enabled(sb, type); 106 } 107 108 static inline int sb_any_quota_loaded(struct super_block *sb) 109 { 110 return sb_has_quota_loaded(sb, USRQUOTA) || 111 sb_has_quota_loaded(sb, GRPQUOTA); 112 } 113 114 static inline int sb_has_quota_active(struct super_block *sb, int type) 115 { 116 return sb_has_quota_loaded(sb, type) && 117 !sb_has_quota_suspended(sb, type); 118 } 119 120 static inline int sb_any_quota_active(struct super_block *sb) 121 { 122 return sb_has_quota_active(sb, USRQUOTA) || 123 sb_has_quota_active(sb, GRPQUOTA); 124 } 125 126 /* 127 * Operations supported for diskquotas. 128 */ 129 extern struct dquot_operations dquot_operations; 130 extern struct quotactl_ops vfs_quotactl_ops; 131 132 #define sb_dquot_ops (&dquot_operations) 133 #define sb_quotactl_ops (&vfs_quotactl_ops) 134 135 /* It is better to call this function outside of any transaction as it might 136 * need a lot of space in journal for dquot structure allocation. */ 137 static inline void vfs_dq_init(struct inode *inode) 138 { 139 BUG_ON(!inode->i_sb); 140 if (sb_any_quota_active(inode->i_sb) && !IS_NOQUOTA(inode)) 141 inode->i_sb->dq_op->initialize(inode, -1); 142 } 143 144 /* The following allocation/freeing/transfer functions *must* be called inside 145 * a transaction (deadlocks possible otherwise) */ 146 static inline int vfs_dq_prealloc_space_nodirty(struct inode *inode, qsize_t nr) 147 { 148 if (sb_any_quota_active(inode->i_sb)) { 149 /* Used space is updated in alloc_space() */ 150 if (inode->i_sb->dq_op->alloc_space(inode, nr, 1) == NO_QUOTA) 151 return 1; 152 } 153 else 154 inode_add_bytes(inode, nr); 155 return 0; 156 } 157 158 static inline int vfs_dq_prealloc_space(struct inode *inode, qsize_t nr) 159 { 160 int ret; 161 if (!(ret = vfs_dq_prealloc_space_nodirty(inode, nr))) 162 mark_inode_dirty(inode); 163 return ret; 164 } 165 166 static inline int vfs_dq_alloc_space_nodirty(struct inode *inode, qsize_t nr) 167 { 168 if (sb_any_quota_active(inode->i_sb)) { 169 /* Used space is updated in alloc_space() */ 170 if (inode->i_sb->dq_op->alloc_space(inode, nr, 0) == NO_QUOTA) 171 return 1; 172 } 173 else 174 inode_add_bytes(inode, nr); 175 return 0; 176 } 177 178 static inline int vfs_dq_alloc_space(struct inode *inode, qsize_t nr) 179 { 180 int ret; 181 if (!(ret = vfs_dq_alloc_space_nodirty(inode, nr))) 182 mark_inode_dirty(inode); 183 return ret; 184 } 185 186 static inline int vfs_dq_alloc_inode(struct inode *inode) 187 { 188 if (sb_any_quota_active(inode->i_sb)) { 189 vfs_dq_init(inode); 190 if (inode->i_sb->dq_op->alloc_inode(inode, 1) == NO_QUOTA) 191 return 1; 192 } 193 return 0; 194 } 195 196 static inline void vfs_dq_free_space_nodirty(struct inode *inode, qsize_t nr) 197 { 198 if (sb_any_quota_active(inode->i_sb)) 199 inode->i_sb->dq_op->free_space(inode, nr); 200 else 201 inode_sub_bytes(inode, nr); 202 } 203 204 static inline void vfs_dq_free_space(struct inode *inode, qsize_t nr) 205 { 206 vfs_dq_free_space_nodirty(inode, nr); 207 mark_inode_dirty(inode); 208 } 209 210 static inline void vfs_dq_free_inode(struct inode *inode) 211 { 212 if (sb_any_quota_active(inode->i_sb)) 213 inode->i_sb->dq_op->free_inode(inode, 1); 214 } 215 216 /* The following two functions cannot be called inside a transaction */ 217 static inline void vfs_dq_sync(struct super_block *sb) 218 { 219 sync_dquots(sb, -1); 220 } 221 222 static inline int vfs_dq_off(struct super_block *sb, int remount) 223 { 224 int ret = -ENOSYS; 225 226 if (sb->s_qcop && sb->s_qcop->quota_off) 227 ret = sb->s_qcop->quota_off(sb, -1, remount); 228 return ret; 229 } 230 231 #else 232 233 static inline int sb_has_quota_usage_enabled(struct super_block *sb, int type) 234 { 235 return 0; 236 } 237 238 static inline int sb_has_quota_limits_enabled(struct super_block *sb, int type) 239 { 240 return 0; 241 } 242 243 static inline int sb_has_quota_suspended(struct super_block *sb, int type) 244 { 245 return 0; 246 } 247 248 static inline int sb_any_quota_suspended(struct super_block *sb) 249 { 250 return 0; 251 } 252 253 /* Does kernel know about any quota information for given sb + type? */ 254 static inline int sb_has_quota_loaded(struct super_block *sb, int type) 255 { 256 return 0; 257 } 258 259 static inline int sb_any_quota_loaded(struct super_block *sb) 260 { 261 return 0; 262 } 263 264 static inline int sb_has_quota_active(struct super_block *sb, int type) 265 { 266 return 0; 267 } 268 269 static inline int sb_any_quota_active(struct super_block *sb) 270 { 271 return 0; 272 } 273 274 /* 275 * NO-OP when quota not configured. 276 */ 277 #define sb_dquot_ops (NULL) 278 #define sb_quotactl_ops (NULL) 279 280 static inline void vfs_dq_init(struct inode *inode) 281 { 282 } 283 284 static inline void vfs_dq_drop(struct inode *inode) 285 { 286 } 287 288 static inline int vfs_dq_alloc_inode(struct inode *inode) 289 { 290 return 0; 291 } 292 293 static inline void vfs_dq_free_inode(struct inode *inode) 294 { 295 } 296 297 static inline void vfs_dq_sync(struct super_block *sb) 298 { 299 } 300 301 static inline int vfs_dq_off(struct super_block *sb, int remount) 302 { 303 return 0; 304 } 305 306 static inline int vfs_dq_quota_on_remount(struct super_block *sb) 307 { 308 return 0; 309 } 310 311 static inline int vfs_dq_transfer(struct inode *inode, struct iattr *iattr) 312 { 313 return 0; 314 } 315 316 static inline int vfs_dq_prealloc_space_nodirty(struct inode *inode, qsize_t nr) 317 { 318 inode_add_bytes(inode, nr); 319 return 0; 320 } 321 322 static inline int vfs_dq_prealloc_space(struct inode *inode, qsize_t nr) 323 { 324 vfs_dq_prealloc_space_nodirty(inode, nr); 325 mark_inode_dirty(inode); 326 return 0; 327 } 328 329 static inline int vfs_dq_alloc_space_nodirty(struct inode *inode, qsize_t nr) 330 { 331 inode_add_bytes(inode, nr); 332 return 0; 333 } 334 335 static inline int vfs_dq_alloc_space(struct inode *inode, qsize_t nr) 336 { 337 vfs_dq_alloc_space_nodirty(inode, nr); 338 mark_inode_dirty(inode); 339 return 0; 340 } 341 342 static inline void vfs_dq_free_space_nodirty(struct inode *inode, qsize_t nr) 343 { 344 inode_sub_bytes(inode, nr); 345 } 346 347 static inline void vfs_dq_free_space(struct inode *inode, qsize_t nr) 348 { 349 vfs_dq_free_space_nodirty(inode, nr); 350 mark_inode_dirty(inode); 351 } 352 353 #endif /* CONFIG_QUOTA */ 354 355 static inline int vfs_dq_prealloc_block_nodirty(struct inode *inode, qsize_t nr) 356 { 357 return vfs_dq_prealloc_space_nodirty(inode, 358 nr << inode->i_sb->s_blocksize_bits); 359 } 360 361 static inline int vfs_dq_prealloc_block(struct inode *inode, qsize_t nr) 362 { 363 return vfs_dq_prealloc_space(inode, 364 nr << inode->i_sb->s_blocksize_bits); 365 } 366 367 static inline int vfs_dq_alloc_block_nodirty(struct inode *inode, qsize_t nr) 368 { 369 return vfs_dq_alloc_space_nodirty(inode, 370 nr << inode->i_sb->s_blocksize_bits); 371 } 372 373 static inline int vfs_dq_alloc_block(struct inode *inode, qsize_t nr) 374 { 375 return vfs_dq_alloc_space(inode, 376 nr << inode->i_sb->s_blocksize_bits); 377 } 378 379 static inline void vfs_dq_free_block_nodirty(struct inode *inode, qsize_t nr) 380 { 381 vfs_dq_free_space_nodirty(inode, nr << inode->i_sb->s_blocksize_bits); 382 } 383 384 static inline void vfs_dq_free_block(struct inode *inode, qsize_t nr) 385 { 386 vfs_dq_free_space(inode, nr << inode->i_sb->s_blocksize_bits); 387 } 388 389 /* 390 * Define uppercase equivalents for compatibility with old function names 391 * Can go away when we think all users have been converted (15/04/2008) 392 */ 393 #define DQUOT_INIT(inode) vfs_dq_init(inode) 394 #define DQUOT_DROP(inode) vfs_dq_drop(inode) 395 #define DQUOT_PREALLOC_SPACE_NODIRTY(inode, nr) \ 396 vfs_dq_prealloc_space_nodirty(inode, nr) 397 #define DQUOT_PREALLOC_SPACE(inode, nr) vfs_dq_prealloc_space(inode, nr) 398 #define DQUOT_ALLOC_SPACE_NODIRTY(inode, nr) \ 399 vfs_dq_alloc_space_nodirty(inode, nr) 400 #define DQUOT_ALLOC_SPACE(inode, nr) vfs_dq_alloc_space(inode, nr) 401 #define DQUOT_PREALLOC_BLOCK_NODIRTY(inode, nr) \ 402 vfs_dq_prealloc_block_nodirty(inode, nr) 403 #define DQUOT_PREALLOC_BLOCK(inode, nr) vfs_dq_prealloc_block(inode, nr) 404 #define DQUOT_ALLOC_BLOCK_NODIRTY(inode, nr) \ 405 vfs_dq_alloc_block_nodirty(inode, nr) 406 #define DQUOT_ALLOC_BLOCK(inode, nr) vfs_dq_alloc_block(inode, nr) 407 #define DQUOT_ALLOC_INODE(inode) vfs_dq_alloc_inode(inode) 408 #define DQUOT_FREE_SPACE_NODIRTY(inode, nr) \ 409 vfs_dq_free_space_nodirty(inode, nr) 410 #define DQUOT_FREE_SPACE(inode, nr) vfs_dq_free_space(inode, nr) 411 #define DQUOT_FREE_BLOCK_NODIRTY(inode, nr) \ 412 vfs_dq_free_block_nodirty(inode, nr) 413 #define DQUOT_FREE_BLOCK(inode, nr) vfs_dq_free_block(inode, nr) 414 #define DQUOT_FREE_INODE(inode) vfs_dq_free_inode(inode) 415 #define DQUOT_TRANSFER(inode, iattr) vfs_dq_transfer(inode, iattr) 416 #define DQUOT_SYNC(sb) vfs_dq_sync(sb) 417 #define DQUOT_OFF(sb, remount) vfs_dq_off(sb, remount) 418 #define DQUOT_ON_REMOUNT(sb) vfs_dq_quota_on_remount(sb) 419 420 #endif /* _LINUX_QUOTAOPS_ */ 421