123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387 |
- /*
- * Definitions for diskquota-operations. When diskquota is configured these
- * macros expand to the right source-code.
- *
- * Author: Marco van Wieringen <mvw@planets.elm.net>
- */
- #ifndef _LINUX_QUOTAOPS_
- #define _LINUX_QUOTAOPS_
- #include <linux/fs.h>
- #define DQUOT_SPACE_WARN 0x1
- #define DQUOT_SPACE_RESERVE 0x2
- #define DQUOT_SPACE_NOFAIL 0x4
- static inline struct quota_info *sb_dqopt(struct super_block *sb)
- {
- return &sb->s_dquot;
- }
- /* i_mutex must being held */
- static inline bool is_quota_modification(struct inode *inode, struct iattr *ia)
- {
- return (ia->ia_valid & ATTR_SIZE && ia->ia_size != inode->i_size) ||
- (ia->ia_valid & ATTR_UID && !uid_eq(ia->ia_uid, inode->i_uid)) ||
- (ia->ia_valid & ATTR_GID && !gid_eq(ia->ia_gid, inode->i_gid));
- }
- #if defined(CONFIG_QUOTA)
- #define quota_error(sb, fmt, args...) \
- __quota_error((sb), __func__, fmt , ## args)
- extern __printf(3, 4)
- void __quota_error(struct super_block *sb, const char *func,
- const char *fmt, ...);
- /*
- * declaration of quota_function calls in kernel.
- */
- void inode_add_rsv_space(struct inode *inode, qsize_t number);
- void inode_claim_rsv_space(struct inode *inode, qsize_t number);
- void inode_sub_rsv_space(struct inode *inode, qsize_t number);
- void inode_reclaim_rsv_space(struct inode *inode, qsize_t number);
- int dquot_initialize(struct inode *inode);
- void dquot_drop(struct inode *inode);
- struct dquot *dqget(struct super_block *sb, struct kqid qid);
- static inline struct dquot *dqgrab(struct dquot *dquot)
- {
- /* Make sure someone else has active reference to dquot */
- WARN_ON_ONCE(!atomic_read(&dquot->dq_count));
- WARN_ON_ONCE(!test_bit(DQ_ACTIVE_B, &dquot->dq_flags));
- atomic_inc(&dquot->dq_count);
- return dquot;
- }
- void dqput(struct dquot *dquot);
- int dquot_scan_active(struct super_block *sb,
- int (*fn)(struct dquot *dquot, unsigned long priv),
- unsigned long priv);
- struct dquot *dquot_alloc(struct super_block *sb, int type);
- void dquot_destroy(struct dquot *dquot);
- int __dquot_alloc_space(struct inode *inode, qsize_t number, int flags);
- void __dquot_free_space(struct inode *inode, qsize_t number, int flags);
- int dquot_alloc_inode(struct inode *inode);
- int dquot_claim_space_nodirty(struct inode *inode, qsize_t number);
- void dquot_free_inode(struct inode *inode);
- void dquot_reclaim_space_nodirty(struct inode *inode, qsize_t number);
- int dquot_disable(struct super_block *sb, int type, unsigned int flags);
- /* Suspend quotas on remount RO */
- static inline int dquot_suspend(struct super_block *sb, int type)
- {
- return dquot_disable(sb, type, DQUOT_SUSPENDED);
- }
- int dquot_resume(struct super_block *sb, int type);
- int dquot_commit(struct dquot *dquot);
- int dquot_acquire(struct dquot *dquot);
- int dquot_release(struct dquot *dquot);
- int dquot_commit_info(struct super_block *sb, int type);
- int dquot_mark_dquot_dirty(struct dquot *dquot);
- int dquot_file_open(struct inode *inode, struct file *file);
- int dquot_enable(struct inode *inode, int type, int format_id,
- unsigned int flags);
- int dquot_quota_on(struct super_block *sb, int type, int format_id,
- struct path *path);
- int dquot_quota_on_mount(struct super_block *sb, char *qf_name,
- int format_id, int type);
- int dquot_quota_off(struct super_block *sb, int type);
- int dquot_writeback_dquots(struct super_block *sb, int type);
- int dquot_quota_sync(struct super_block *sb, int type);
- int dquot_get_state(struct super_block *sb, struct qc_state *state);
- int dquot_set_dqinfo(struct super_block *sb, int type, struct qc_info *ii);
- int dquot_get_dqblk(struct super_block *sb, struct kqid id,
- struct qc_dqblk *di);
- int dquot_set_dqblk(struct super_block *sb, struct kqid id,
- struct qc_dqblk *di);
- int __dquot_transfer(struct inode *inode, struct dquot **transfer_to);
- int dquot_transfer(struct inode *inode, struct iattr *iattr);
- static inline struct mem_dqinfo *sb_dqinfo(struct super_block *sb, int type)
- {
- return sb_dqopt(sb)->info + type;
- }
- /*
- * Functions for checking status of quota
- */
- static inline bool sb_has_quota_usage_enabled(struct super_block *sb, int type)
- {
- return sb_dqopt(sb)->flags &
- dquot_state_flag(DQUOT_USAGE_ENABLED, type);
- }
- static inline bool sb_has_quota_limits_enabled(struct super_block *sb, int type)
- {
- return sb_dqopt(sb)->flags &
- dquot_state_flag(DQUOT_LIMITS_ENABLED, type);
- }
- static inline bool sb_has_quota_suspended(struct super_block *sb, int type)
- {
- return sb_dqopt(sb)->flags &
- dquot_state_flag(DQUOT_SUSPENDED, type);
- }
- static inline unsigned sb_any_quota_suspended(struct super_block *sb)
- {
- return dquot_state_types(sb_dqopt(sb)->flags, DQUOT_SUSPENDED);
- }
- /* Does kernel know about any quota information for given sb + type? */
- static inline bool sb_has_quota_loaded(struct super_block *sb, int type)
- {
- /* Currently if anything is on, then quota usage is on as well */
- return sb_has_quota_usage_enabled(sb, type);
- }
- static inline unsigned sb_any_quota_loaded(struct super_block *sb)
- {
- return dquot_state_types(sb_dqopt(sb)->flags, DQUOT_USAGE_ENABLED);
- }
- static inline bool sb_has_quota_active(struct super_block *sb, int type)
- {
- return sb_has_quota_loaded(sb, type) &&
- !sb_has_quota_suspended(sb, type);
- }
- /*
- * Operations supported for diskquotas.
- */
- extern const struct dquot_operations dquot_operations;
- extern const struct quotactl_ops dquot_quotactl_ops;
- extern const struct quotactl_ops dquot_quotactl_sysfile_ops;
- #else
- static inline int sb_has_quota_usage_enabled(struct super_block *sb, int type)
- {
- return 0;
- }
- static inline int sb_has_quota_limits_enabled(struct super_block *sb, int type)
- {
- return 0;
- }
- static inline int sb_has_quota_suspended(struct super_block *sb, int type)
- {
- return 0;
- }
- static inline int sb_any_quota_suspended(struct super_block *sb)
- {
- return 0;
- }
- /* Does kernel know about any quota information for given sb + type? */
- static inline int sb_has_quota_loaded(struct super_block *sb, int type)
- {
- return 0;
- }
- static inline int sb_any_quota_loaded(struct super_block *sb)
- {
- return 0;
- }
- static inline int sb_has_quota_active(struct super_block *sb, int type)
- {
- return 0;
- }
- static inline int dquot_initialize(struct inode *inode)
- {
- return 0;
- }
- static inline void dquot_drop(struct inode *inode)
- {
- }
- static inline int dquot_alloc_inode(struct inode *inode)
- {
- return 0;
- }
- static inline void dquot_free_inode(struct inode *inode)
- {
- }
- static inline int dquot_transfer(struct inode *inode, struct iattr *iattr)
- {
- return 0;
- }
- static inline int __dquot_alloc_space(struct inode *inode, qsize_t number,
- int flags)
- {
- if (!(flags & DQUOT_SPACE_RESERVE))
- inode_add_bytes(inode, number);
- return 0;
- }
- static inline void __dquot_free_space(struct inode *inode, qsize_t number,
- int flags)
- {
- if (!(flags & DQUOT_SPACE_RESERVE))
- inode_sub_bytes(inode, number);
- }
- static inline int dquot_claim_space_nodirty(struct inode *inode, qsize_t number)
- {
- inode_add_bytes(inode, number);
- return 0;
- }
- static inline int dquot_reclaim_space_nodirty(struct inode *inode,
- qsize_t number)
- {
- inode_sub_bytes(inode, number);
- return 0;
- }
- static inline int dquot_disable(struct super_block *sb, int type,
- unsigned int flags)
- {
- return 0;
- }
- static inline int dquot_suspend(struct super_block *sb, int type)
- {
- return 0;
- }
- static inline int dquot_resume(struct super_block *sb, int type)
- {
- return 0;
- }
- #define dquot_file_open generic_file_open
- static inline int dquot_writeback_dquots(struct super_block *sb, int type)
- {
- return 0;
- }
- #endif /* CONFIG_QUOTA */
- static inline int dquot_alloc_space_nodirty(struct inode *inode, qsize_t nr)
- {
- return __dquot_alloc_space(inode, nr, DQUOT_SPACE_WARN);
- }
- static inline void dquot_alloc_space_nofail(struct inode *inode, qsize_t nr)
- {
- __dquot_alloc_space(inode, nr, DQUOT_SPACE_WARN|DQUOT_SPACE_NOFAIL);
- mark_inode_dirty_sync(inode);
- }
- static inline int dquot_alloc_space(struct inode *inode, qsize_t nr)
- {
- int ret;
- ret = dquot_alloc_space_nodirty(inode, nr);
- if (!ret) {
- /*
- * Mark inode fully dirty. Since we are allocating blocks, inode
- * would become fully dirty soon anyway and it reportedly
- * reduces lock contention.
- */
- mark_inode_dirty(inode);
- }
- return ret;
- }
- static inline int dquot_alloc_block_nodirty(struct inode *inode, qsize_t nr)
- {
- return dquot_alloc_space_nodirty(inode, nr << inode->i_blkbits);
- }
- static inline void dquot_alloc_block_nofail(struct inode *inode, qsize_t nr)
- {
- dquot_alloc_space_nofail(inode, nr << inode->i_blkbits);
- }
- static inline int dquot_alloc_block(struct inode *inode, qsize_t nr)
- {
- return dquot_alloc_space(inode, nr << inode->i_blkbits);
- }
- static inline int dquot_prealloc_block_nodirty(struct inode *inode, qsize_t nr)
- {
- return __dquot_alloc_space(inode, nr << inode->i_blkbits, 0);
- }
- static inline int dquot_prealloc_block(struct inode *inode, qsize_t nr)
- {
- int ret;
- ret = dquot_prealloc_block_nodirty(inode, nr);
- if (!ret)
- mark_inode_dirty_sync(inode);
- return ret;
- }
- static inline int dquot_reserve_block(struct inode *inode, qsize_t nr)
- {
- return __dquot_alloc_space(inode, nr << inode->i_blkbits,
- DQUOT_SPACE_WARN|DQUOT_SPACE_RESERVE);
- }
- static inline int dquot_claim_block(struct inode *inode, qsize_t nr)
- {
- int ret;
- ret = dquot_claim_space_nodirty(inode, nr << inode->i_blkbits);
- if (!ret)
- mark_inode_dirty_sync(inode);
- return ret;
- }
- static inline void dquot_reclaim_block(struct inode *inode, qsize_t nr)
- {
- dquot_reclaim_space_nodirty(inode, nr << inode->i_blkbits);
- mark_inode_dirty_sync(inode);
- }
- static inline void dquot_free_space_nodirty(struct inode *inode, qsize_t nr)
- {
- __dquot_free_space(inode, nr, 0);
- }
- static inline void dquot_free_space(struct inode *inode, qsize_t nr)
- {
- dquot_free_space_nodirty(inode, nr);
- mark_inode_dirty_sync(inode);
- }
- static inline void dquot_free_block_nodirty(struct inode *inode, qsize_t nr)
- {
- dquot_free_space_nodirty(inode, nr << inode->i_blkbits);
- }
- static inline void dquot_free_block(struct inode *inode, qsize_t nr)
- {
- dquot_free_space(inode, nr << inode->i_blkbits);
- }
- static inline void dquot_release_reservation_block(struct inode *inode,
- qsize_t nr)
- {
- __dquot_free_space(inode, nr << inode->i_blkbits, DQUOT_SPACE_RESERVE);
- }
- unsigned int qtype_enforce_flag(int type);
- #endif /* _LINUX_QUOTAOPS_ */
|