162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Definitions for diskquota-operations. When diskquota is configured these 462306a36Sopenharmony_ci * macros expand to the right source-code. 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Author: Marco van Wieringen <mvw@planets.elm.net> 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci#ifndef _LINUX_QUOTAOPS_ 962306a36Sopenharmony_ci#define _LINUX_QUOTAOPS_ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/fs.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#define DQUOT_SPACE_WARN 0x1 1462306a36Sopenharmony_ci#define DQUOT_SPACE_RESERVE 0x2 1562306a36Sopenharmony_ci#define DQUOT_SPACE_NOFAIL 0x4 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_cistatic inline struct quota_info *sb_dqopt(struct super_block *sb) 1862306a36Sopenharmony_ci{ 1962306a36Sopenharmony_ci return &sb->s_dquot; 2062306a36Sopenharmony_ci} 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci/* i_mutex must being held */ 2362306a36Sopenharmony_cistatic inline bool is_quota_modification(struct mnt_idmap *idmap, 2462306a36Sopenharmony_ci struct inode *inode, struct iattr *ia) 2562306a36Sopenharmony_ci{ 2662306a36Sopenharmony_ci return ((ia->ia_valid & ATTR_SIZE) || 2762306a36Sopenharmony_ci i_uid_needs_update(idmap, ia, inode) || 2862306a36Sopenharmony_ci i_gid_needs_update(idmap, ia, inode)); 2962306a36Sopenharmony_ci} 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci#if defined(CONFIG_QUOTA) 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci#define quota_error(sb, fmt, args...) \ 3462306a36Sopenharmony_ci __quota_error((sb), __func__, fmt , ## args) 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ciextern __printf(3, 4) 3762306a36Sopenharmony_civoid __quota_error(struct super_block *sb, const char *func, 3862306a36Sopenharmony_ci const char *fmt, ...); 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci/* 4162306a36Sopenharmony_ci * declaration of quota_function calls in kernel. 4262306a36Sopenharmony_ci */ 4362306a36Sopenharmony_ciint dquot_initialize(struct inode *inode); 4462306a36Sopenharmony_cibool dquot_initialize_needed(struct inode *inode); 4562306a36Sopenharmony_civoid dquot_drop(struct inode *inode); 4662306a36Sopenharmony_cistruct dquot *dqget(struct super_block *sb, struct kqid qid); 4762306a36Sopenharmony_cistatic inline struct dquot *dqgrab(struct dquot *dquot) 4862306a36Sopenharmony_ci{ 4962306a36Sopenharmony_ci /* Make sure someone else has active reference to dquot */ 5062306a36Sopenharmony_ci WARN_ON_ONCE(!atomic_read(&dquot->dq_count)); 5162306a36Sopenharmony_ci WARN_ON_ONCE(!test_bit(DQ_ACTIVE_B, &dquot->dq_flags)); 5262306a36Sopenharmony_ci atomic_inc(&dquot->dq_count); 5362306a36Sopenharmony_ci return dquot; 5462306a36Sopenharmony_ci} 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_cistatic inline bool dquot_is_busy(struct dquot *dquot) 5762306a36Sopenharmony_ci{ 5862306a36Sopenharmony_ci if (test_bit(DQ_MOD_B, &dquot->dq_flags)) 5962306a36Sopenharmony_ci return true; 6062306a36Sopenharmony_ci if (atomic_read(&dquot->dq_count) > 0) 6162306a36Sopenharmony_ci return true; 6262306a36Sopenharmony_ci return false; 6362306a36Sopenharmony_ci} 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_civoid dqput(struct dquot *dquot); 6662306a36Sopenharmony_ciint dquot_scan_active(struct super_block *sb, 6762306a36Sopenharmony_ci int (*fn)(struct dquot *dquot, unsigned long priv), 6862306a36Sopenharmony_ci unsigned long priv); 6962306a36Sopenharmony_cistruct dquot *dquot_alloc(struct super_block *sb, int type); 7062306a36Sopenharmony_civoid dquot_destroy(struct dquot *dquot); 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ciint __dquot_alloc_space(struct inode *inode, qsize_t number, int flags); 7362306a36Sopenharmony_civoid __dquot_free_space(struct inode *inode, qsize_t number, int flags); 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ciint dquot_alloc_inode(struct inode *inode); 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ciint dquot_claim_space_nodirty(struct inode *inode, qsize_t number); 7862306a36Sopenharmony_civoid dquot_free_inode(struct inode *inode); 7962306a36Sopenharmony_civoid dquot_reclaim_space_nodirty(struct inode *inode, qsize_t number); 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ciint dquot_disable(struct super_block *sb, int type, unsigned int flags); 8262306a36Sopenharmony_ci/* Suspend quotas on remount RO */ 8362306a36Sopenharmony_cistatic inline int dquot_suspend(struct super_block *sb, int type) 8462306a36Sopenharmony_ci{ 8562306a36Sopenharmony_ci return dquot_disable(sb, type, DQUOT_SUSPENDED); 8662306a36Sopenharmony_ci} 8762306a36Sopenharmony_ciint dquot_resume(struct super_block *sb, int type); 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ciint dquot_commit(struct dquot *dquot); 9062306a36Sopenharmony_ciint dquot_acquire(struct dquot *dquot); 9162306a36Sopenharmony_ciint dquot_release(struct dquot *dquot); 9262306a36Sopenharmony_ciint dquot_commit_info(struct super_block *sb, int type); 9362306a36Sopenharmony_ciint dquot_get_next_id(struct super_block *sb, struct kqid *qid); 9462306a36Sopenharmony_ciint dquot_mark_dquot_dirty(struct dquot *dquot); 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ciint dquot_file_open(struct inode *inode, struct file *file); 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ciint dquot_load_quota_sb(struct super_block *sb, int type, int format_id, 9962306a36Sopenharmony_ci unsigned int flags); 10062306a36Sopenharmony_ciint dquot_load_quota_inode(struct inode *inode, int type, int format_id, 10162306a36Sopenharmony_ci unsigned int flags); 10262306a36Sopenharmony_ciint dquot_quota_on(struct super_block *sb, int type, int format_id, 10362306a36Sopenharmony_ci const struct path *path); 10462306a36Sopenharmony_ciint dquot_quota_on_mount(struct super_block *sb, char *qf_name, 10562306a36Sopenharmony_ci int format_id, int type); 10662306a36Sopenharmony_ciint dquot_quota_off(struct super_block *sb, int type); 10762306a36Sopenharmony_ciint dquot_writeback_dquots(struct super_block *sb, int type); 10862306a36Sopenharmony_ciint dquot_quota_sync(struct super_block *sb, int type); 10962306a36Sopenharmony_ciint dquot_get_state(struct super_block *sb, struct qc_state *state); 11062306a36Sopenharmony_ciint dquot_set_dqinfo(struct super_block *sb, int type, struct qc_info *ii); 11162306a36Sopenharmony_ciint dquot_get_dqblk(struct super_block *sb, struct kqid id, 11262306a36Sopenharmony_ci struct qc_dqblk *di); 11362306a36Sopenharmony_ciint dquot_get_next_dqblk(struct super_block *sb, struct kqid *id, 11462306a36Sopenharmony_ci struct qc_dqblk *di); 11562306a36Sopenharmony_ciint dquot_set_dqblk(struct super_block *sb, struct kqid id, 11662306a36Sopenharmony_ci struct qc_dqblk *di); 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ciint __dquot_transfer(struct inode *inode, struct dquot **transfer_to); 11962306a36Sopenharmony_ciint dquot_transfer(struct mnt_idmap *idmap, struct inode *inode, 12062306a36Sopenharmony_ci struct iattr *iattr); 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_cistatic inline struct mem_dqinfo *sb_dqinfo(struct super_block *sb, int type) 12362306a36Sopenharmony_ci{ 12462306a36Sopenharmony_ci return sb_dqopt(sb)->info + type; 12562306a36Sopenharmony_ci} 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci/* 12862306a36Sopenharmony_ci * Functions for checking status of quota 12962306a36Sopenharmony_ci */ 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_cistatic inline bool sb_has_quota_usage_enabled(struct super_block *sb, int type) 13262306a36Sopenharmony_ci{ 13362306a36Sopenharmony_ci return sb_dqopt(sb)->flags & 13462306a36Sopenharmony_ci dquot_state_flag(DQUOT_USAGE_ENABLED, type); 13562306a36Sopenharmony_ci} 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_cistatic inline bool sb_has_quota_limits_enabled(struct super_block *sb, int type) 13862306a36Sopenharmony_ci{ 13962306a36Sopenharmony_ci return sb_dqopt(sb)->flags & 14062306a36Sopenharmony_ci dquot_state_flag(DQUOT_LIMITS_ENABLED, type); 14162306a36Sopenharmony_ci} 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_cistatic inline bool sb_has_quota_suspended(struct super_block *sb, int type) 14462306a36Sopenharmony_ci{ 14562306a36Sopenharmony_ci return sb_dqopt(sb)->flags & 14662306a36Sopenharmony_ci dquot_state_flag(DQUOT_SUSPENDED, type); 14762306a36Sopenharmony_ci} 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_cistatic inline unsigned sb_any_quota_suspended(struct super_block *sb) 15062306a36Sopenharmony_ci{ 15162306a36Sopenharmony_ci return dquot_state_types(sb_dqopt(sb)->flags, DQUOT_SUSPENDED); 15262306a36Sopenharmony_ci} 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci/* Does kernel know about any quota information for given sb + type? */ 15562306a36Sopenharmony_cistatic inline bool sb_has_quota_loaded(struct super_block *sb, int type) 15662306a36Sopenharmony_ci{ 15762306a36Sopenharmony_ci /* Currently if anything is on, then quota usage is on as well */ 15862306a36Sopenharmony_ci return sb_has_quota_usage_enabled(sb, type); 15962306a36Sopenharmony_ci} 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_cistatic inline unsigned sb_any_quota_loaded(struct super_block *sb) 16262306a36Sopenharmony_ci{ 16362306a36Sopenharmony_ci return dquot_state_types(sb_dqopt(sb)->flags, DQUOT_USAGE_ENABLED); 16462306a36Sopenharmony_ci} 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_cistatic inline bool sb_has_quota_active(struct super_block *sb, int type) 16762306a36Sopenharmony_ci{ 16862306a36Sopenharmony_ci return sb_has_quota_loaded(sb, type) && 16962306a36Sopenharmony_ci !sb_has_quota_suspended(sb, type); 17062306a36Sopenharmony_ci} 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci/* 17362306a36Sopenharmony_ci * Operations supported for diskquotas. 17462306a36Sopenharmony_ci */ 17562306a36Sopenharmony_ciextern const struct dquot_operations dquot_operations; 17662306a36Sopenharmony_ciextern const struct quotactl_ops dquot_quotactl_sysfile_ops; 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ci#else 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_cistatic inline int sb_has_quota_usage_enabled(struct super_block *sb, int type) 18162306a36Sopenharmony_ci{ 18262306a36Sopenharmony_ci return 0; 18362306a36Sopenharmony_ci} 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_cistatic inline int sb_has_quota_limits_enabled(struct super_block *sb, int type) 18662306a36Sopenharmony_ci{ 18762306a36Sopenharmony_ci return 0; 18862306a36Sopenharmony_ci} 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_cistatic inline int sb_has_quota_suspended(struct super_block *sb, int type) 19162306a36Sopenharmony_ci{ 19262306a36Sopenharmony_ci return 0; 19362306a36Sopenharmony_ci} 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_cistatic inline int sb_any_quota_suspended(struct super_block *sb) 19662306a36Sopenharmony_ci{ 19762306a36Sopenharmony_ci return 0; 19862306a36Sopenharmony_ci} 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_ci/* Does kernel know about any quota information for given sb + type? */ 20162306a36Sopenharmony_cistatic inline int sb_has_quota_loaded(struct super_block *sb, int type) 20262306a36Sopenharmony_ci{ 20362306a36Sopenharmony_ci return 0; 20462306a36Sopenharmony_ci} 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_cistatic inline int sb_any_quota_loaded(struct super_block *sb) 20762306a36Sopenharmony_ci{ 20862306a36Sopenharmony_ci return 0; 20962306a36Sopenharmony_ci} 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_cistatic inline int sb_has_quota_active(struct super_block *sb, int type) 21262306a36Sopenharmony_ci{ 21362306a36Sopenharmony_ci return 0; 21462306a36Sopenharmony_ci} 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_cistatic inline int dquot_initialize(struct inode *inode) 21762306a36Sopenharmony_ci{ 21862306a36Sopenharmony_ci return 0; 21962306a36Sopenharmony_ci} 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_cistatic inline bool dquot_initialize_needed(struct inode *inode) 22262306a36Sopenharmony_ci{ 22362306a36Sopenharmony_ci return false; 22462306a36Sopenharmony_ci} 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_cistatic inline void dquot_drop(struct inode *inode) 22762306a36Sopenharmony_ci{ 22862306a36Sopenharmony_ci} 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_cistatic inline int dquot_alloc_inode(struct inode *inode) 23162306a36Sopenharmony_ci{ 23262306a36Sopenharmony_ci return 0; 23362306a36Sopenharmony_ci} 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_cistatic inline void dquot_free_inode(struct inode *inode) 23662306a36Sopenharmony_ci{ 23762306a36Sopenharmony_ci} 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_cistatic inline int dquot_transfer(struct mnt_idmap *idmap, 24062306a36Sopenharmony_ci struct inode *inode, struct iattr *iattr) 24162306a36Sopenharmony_ci{ 24262306a36Sopenharmony_ci return 0; 24362306a36Sopenharmony_ci} 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_cistatic inline int __dquot_alloc_space(struct inode *inode, qsize_t number, 24662306a36Sopenharmony_ci int flags) 24762306a36Sopenharmony_ci{ 24862306a36Sopenharmony_ci if (!(flags & DQUOT_SPACE_RESERVE)) 24962306a36Sopenharmony_ci inode_add_bytes(inode, number); 25062306a36Sopenharmony_ci return 0; 25162306a36Sopenharmony_ci} 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_cistatic inline void __dquot_free_space(struct inode *inode, qsize_t number, 25462306a36Sopenharmony_ci int flags) 25562306a36Sopenharmony_ci{ 25662306a36Sopenharmony_ci if (!(flags & DQUOT_SPACE_RESERVE)) 25762306a36Sopenharmony_ci inode_sub_bytes(inode, number); 25862306a36Sopenharmony_ci} 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_cistatic inline int dquot_claim_space_nodirty(struct inode *inode, qsize_t number) 26162306a36Sopenharmony_ci{ 26262306a36Sopenharmony_ci inode_add_bytes(inode, number); 26362306a36Sopenharmony_ci return 0; 26462306a36Sopenharmony_ci} 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_cistatic inline int dquot_reclaim_space_nodirty(struct inode *inode, 26762306a36Sopenharmony_ci qsize_t number) 26862306a36Sopenharmony_ci{ 26962306a36Sopenharmony_ci inode_sub_bytes(inode, number); 27062306a36Sopenharmony_ci return 0; 27162306a36Sopenharmony_ci} 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_cistatic inline int dquot_disable(struct super_block *sb, int type, 27462306a36Sopenharmony_ci unsigned int flags) 27562306a36Sopenharmony_ci{ 27662306a36Sopenharmony_ci return 0; 27762306a36Sopenharmony_ci} 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_cistatic inline int dquot_suspend(struct super_block *sb, int type) 28062306a36Sopenharmony_ci{ 28162306a36Sopenharmony_ci return 0; 28262306a36Sopenharmony_ci} 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_cistatic inline int dquot_resume(struct super_block *sb, int type) 28562306a36Sopenharmony_ci{ 28662306a36Sopenharmony_ci return 0; 28762306a36Sopenharmony_ci} 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_ci#define dquot_file_open generic_file_open 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_cistatic inline int dquot_writeback_dquots(struct super_block *sb, int type) 29262306a36Sopenharmony_ci{ 29362306a36Sopenharmony_ci return 0; 29462306a36Sopenharmony_ci} 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci#endif /* CONFIG_QUOTA */ 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_cistatic inline int dquot_alloc_space_nodirty(struct inode *inode, qsize_t nr) 29962306a36Sopenharmony_ci{ 30062306a36Sopenharmony_ci return __dquot_alloc_space(inode, nr, DQUOT_SPACE_WARN); 30162306a36Sopenharmony_ci} 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_cistatic inline void dquot_alloc_space_nofail(struct inode *inode, qsize_t nr) 30462306a36Sopenharmony_ci{ 30562306a36Sopenharmony_ci __dquot_alloc_space(inode, nr, DQUOT_SPACE_WARN|DQUOT_SPACE_NOFAIL); 30662306a36Sopenharmony_ci mark_inode_dirty_sync(inode); 30762306a36Sopenharmony_ci} 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_cistatic inline int dquot_alloc_space(struct inode *inode, qsize_t nr) 31062306a36Sopenharmony_ci{ 31162306a36Sopenharmony_ci int ret; 31262306a36Sopenharmony_ci 31362306a36Sopenharmony_ci ret = dquot_alloc_space_nodirty(inode, nr); 31462306a36Sopenharmony_ci if (!ret) { 31562306a36Sopenharmony_ci /* 31662306a36Sopenharmony_ci * Mark inode fully dirty. Since we are allocating blocks, inode 31762306a36Sopenharmony_ci * would become fully dirty soon anyway and it reportedly 31862306a36Sopenharmony_ci * reduces lock contention. 31962306a36Sopenharmony_ci */ 32062306a36Sopenharmony_ci mark_inode_dirty(inode); 32162306a36Sopenharmony_ci } 32262306a36Sopenharmony_ci return ret; 32362306a36Sopenharmony_ci} 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_cistatic inline int dquot_alloc_block_nodirty(struct inode *inode, qsize_t nr) 32662306a36Sopenharmony_ci{ 32762306a36Sopenharmony_ci return dquot_alloc_space_nodirty(inode, nr << inode->i_blkbits); 32862306a36Sopenharmony_ci} 32962306a36Sopenharmony_ci 33062306a36Sopenharmony_cistatic inline void dquot_alloc_block_nofail(struct inode *inode, qsize_t nr) 33162306a36Sopenharmony_ci{ 33262306a36Sopenharmony_ci dquot_alloc_space_nofail(inode, nr << inode->i_blkbits); 33362306a36Sopenharmony_ci} 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_cistatic inline int dquot_alloc_block(struct inode *inode, qsize_t nr) 33662306a36Sopenharmony_ci{ 33762306a36Sopenharmony_ci return dquot_alloc_space(inode, nr << inode->i_blkbits); 33862306a36Sopenharmony_ci} 33962306a36Sopenharmony_ci 34062306a36Sopenharmony_cistatic inline int dquot_prealloc_block_nodirty(struct inode *inode, qsize_t nr) 34162306a36Sopenharmony_ci{ 34262306a36Sopenharmony_ci return __dquot_alloc_space(inode, nr << inode->i_blkbits, 0); 34362306a36Sopenharmony_ci} 34462306a36Sopenharmony_ci 34562306a36Sopenharmony_cistatic inline int dquot_prealloc_block(struct inode *inode, qsize_t nr) 34662306a36Sopenharmony_ci{ 34762306a36Sopenharmony_ci int ret; 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_ci ret = dquot_prealloc_block_nodirty(inode, nr); 35062306a36Sopenharmony_ci if (!ret) 35162306a36Sopenharmony_ci mark_inode_dirty_sync(inode); 35262306a36Sopenharmony_ci return ret; 35362306a36Sopenharmony_ci} 35462306a36Sopenharmony_ci 35562306a36Sopenharmony_cistatic inline int dquot_reserve_block(struct inode *inode, qsize_t nr) 35662306a36Sopenharmony_ci{ 35762306a36Sopenharmony_ci return __dquot_alloc_space(inode, nr << inode->i_blkbits, 35862306a36Sopenharmony_ci DQUOT_SPACE_WARN|DQUOT_SPACE_RESERVE); 35962306a36Sopenharmony_ci} 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_cistatic inline int dquot_claim_block(struct inode *inode, qsize_t nr) 36262306a36Sopenharmony_ci{ 36362306a36Sopenharmony_ci int ret; 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_ci ret = dquot_claim_space_nodirty(inode, nr << inode->i_blkbits); 36662306a36Sopenharmony_ci if (!ret) 36762306a36Sopenharmony_ci mark_inode_dirty_sync(inode); 36862306a36Sopenharmony_ci return ret; 36962306a36Sopenharmony_ci} 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_cistatic inline void dquot_reclaim_block(struct inode *inode, qsize_t nr) 37262306a36Sopenharmony_ci{ 37362306a36Sopenharmony_ci dquot_reclaim_space_nodirty(inode, nr << inode->i_blkbits); 37462306a36Sopenharmony_ci mark_inode_dirty_sync(inode); 37562306a36Sopenharmony_ci} 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_cistatic inline void dquot_free_space_nodirty(struct inode *inode, qsize_t nr) 37862306a36Sopenharmony_ci{ 37962306a36Sopenharmony_ci __dquot_free_space(inode, nr, 0); 38062306a36Sopenharmony_ci} 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_cistatic inline void dquot_free_space(struct inode *inode, qsize_t nr) 38362306a36Sopenharmony_ci{ 38462306a36Sopenharmony_ci dquot_free_space_nodirty(inode, nr); 38562306a36Sopenharmony_ci mark_inode_dirty_sync(inode); 38662306a36Sopenharmony_ci} 38762306a36Sopenharmony_ci 38862306a36Sopenharmony_cistatic inline void dquot_free_block_nodirty(struct inode *inode, qsize_t nr) 38962306a36Sopenharmony_ci{ 39062306a36Sopenharmony_ci dquot_free_space_nodirty(inode, nr << inode->i_blkbits); 39162306a36Sopenharmony_ci} 39262306a36Sopenharmony_ci 39362306a36Sopenharmony_cistatic inline void dquot_free_block(struct inode *inode, qsize_t nr) 39462306a36Sopenharmony_ci{ 39562306a36Sopenharmony_ci dquot_free_space(inode, nr << inode->i_blkbits); 39662306a36Sopenharmony_ci} 39762306a36Sopenharmony_ci 39862306a36Sopenharmony_cistatic inline void dquot_release_reservation_block(struct inode *inode, 39962306a36Sopenharmony_ci qsize_t nr) 40062306a36Sopenharmony_ci{ 40162306a36Sopenharmony_ci __dquot_free_space(inode, nr << inode->i_blkbits, DQUOT_SPACE_RESERVE); 40262306a36Sopenharmony_ci} 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_ciunsigned int qtype_enforce_flag(int type); 40562306a36Sopenharmony_ci 40662306a36Sopenharmony_ci#endif /* _LINUX_QUOTAOPS_ */ 407