Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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