cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

quotaops.h (10523B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * Definitions for diskquota-operations. When diskquota is configured these
      4 * macros expand to the right source-code.
      5 *
      6 * Author:  Marco van Wieringen <mvw@planets.elm.net>
      7 */
      8#ifndef _LINUX_QUOTAOPS_
      9#define _LINUX_QUOTAOPS_
     10
     11#include <linux/fs.h>
     12
     13#define DQUOT_SPACE_WARN	0x1
     14#define DQUOT_SPACE_RESERVE	0x2
     15#define DQUOT_SPACE_NOFAIL	0x4
     16
     17static inline struct quota_info *sb_dqopt(struct super_block *sb)
     18{
     19	return &sb->s_dquot;
     20}
     21
     22/* i_mutex must being held */
     23static inline bool is_quota_modification(struct inode *inode, struct iattr *ia)
     24{
     25	return (ia->ia_valid & ATTR_SIZE) ||
     26		(ia->ia_valid & ATTR_UID && !uid_eq(ia->ia_uid, inode->i_uid)) ||
     27		(ia->ia_valid & ATTR_GID && !gid_eq(ia->ia_gid, inode->i_gid));
     28}
     29
     30#if defined(CONFIG_QUOTA)
     31
     32#define quota_error(sb, fmt, args...) \
     33	__quota_error((sb), __func__, fmt , ## args)
     34
     35extern __printf(3, 4)
     36void __quota_error(struct super_block *sb, const char *func,
     37		   const char *fmt, ...);
     38
     39/*
     40 * declaration of quota_function calls in kernel.
     41 */
     42int dquot_initialize(struct inode *inode);
     43bool dquot_initialize_needed(struct inode *inode);
     44void dquot_drop(struct inode *inode);
     45struct dquot *dqget(struct super_block *sb, struct kqid qid);
     46static inline struct dquot *dqgrab(struct dquot *dquot)
     47{
     48	/* Make sure someone else has active reference to dquot */
     49	WARN_ON_ONCE(!atomic_read(&dquot->dq_count));
     50	WARN_ON_ONCE(!test_bit(DQ_ACTIVE_B, &dquot->dq_flags));
     51	atomic_inc(&dquot->dq_count);
     52	return dquot;
     53}
     54
     55static inline bool dquot_is_busy(struct dquot *dquot)
     56{
     57	if (test_bit(DQ_MOD_B, &dquot->dq_flags))
     58		return true;
     59	if (atomic_read(&dquot->dq_count) > 1)
     60		return true;
     61	return false;
     62}
     63
     64void dqput(struct dquot *dquot);
     65int dquot_scan_active(struct super_block *sb,
     66		      int (*fn)(struct dquot *dquot, unsigned long priv),
     67		      unsigned long priv);
     68struct dquot *dquot_alloc(struct super_block *sb, int type);
     69void dquot_destroy(struct dquot *dquot);
     70
     71int __dquot_alloc_space(struct inode *inode, qsize_t number, int flags);
     72void __dquot_free_space(struct inode *inode, qsize_t number, int flags);
     73
     74int dquot_alloc_inode(struct inode *inode);
     75
     76int dquot_claim_space_nodirty(struct inode *inode, qsize_t number);
     77void dquot_free_inode(struct inode *inode);
     78void dquot_reclaim_space_nodirty(struct inode *inode, qsize_t number);
     79
     80int dquot_disable(struct super_block *sb, int type, unsigned int flags);
     81/* Suspend quotas on remount RO */
     82static inline int dquot_suspend(struct super_block *sb, int type)
     83{
     84	return dquot_disable(sb, type, DQUOT_SUSPENDED);
     85}
     86int dquot_resume(struct super_block *sb, int type);
     87
     88int dquot_commit(struct dquot *dquot);
     89int dquot_acquire(struct dquot *dquot);
     90int dquot_release(struct dquot *dquot);
     91int dquot_commit_info(struct super_block *sb, int type);
     92int dquot_get_next_id(struct super_block *sb, struct kqid *qid);
     93int dquot_mark_dquot_dirty(struct dquot *dquot);
     94
     95int dquot_file_open(struct inode *inode, struct file *file);
     96
     97int dquot_load_quota_sb(struct super_block *sb, int type, int format_id,
     98	unsigned int flags);
     99int dquot_load_quota_inode(struct inode *inode, int type, int format_id,
    100	unsigned int flags);
    101int dquot_quota_on(struct super_block *sb, int type, int format_id,
    102	const struct path *path);
    103int dquot_quota_on_mount(struct super_block *sb, char *qf_name,
    104 	int format_id, int type);
    105int dquot_quota_off(struct super_block *sb, int type);
    106int dquot_writeback_dquots(struct super_block *sb, int type);
    107int dquot_quota_sync(struct super_block *sb, int type);
    108int dquot_get_state(struct super_block *sb, struct qc_state *state);
    109int dquot_set_dqinfo(struct super_block *sb, int type, struct qc_info *ii);
    110int dquot_get_dqblk(struct super_block *sb, struct kqid id,
    111		struct qc_dqblk *di);
    112int dquot_get_next_dqblk(struct super_block *sb, struct kqid *id,
    113		struct qc_dqblk *di);
    114int dquot_set_dqblk(struct super_block *sb, struct kqid id,
    115		struct qc_dqblk *di);
    116
    117int __dquot_transfer(struct inode *inode, struct dquot **transfer_to);
    118int dquot_transfer(struct inode *inode, struct iattr *iattr);
    119
    120static inline struct mem_dqinfo *sb_dqinfo(struct super_block *sb, int type)
    121{
    122	return sb_dqopt(sb)->info + type;
    123}
    124
    125/*
    126 * Functions for checking status of quota
    127 */
    128
    129static inline bool sb_has_quota_usage_enabled(struct super_block *sb, int type)
    130{
    131	return sb_dqopt(sb)->flags &
    132				dquot_state_flag(DQUOT_USAGE_ENABLED, type);
    133}
    134
    135static inline bool sb_has_quota_limits_enabled(struct super_block *sb, int type)
    136{
    137	return sb_dqopt(sb)->flags &
    138				dquot_state_flag(DQUOT_LIMITS_ENABLED, type);
    139}
    140
    141static inline bool sb_has_quota_suspended(struct super_block *sb, int type)
    142{
    143	return sb_dqopt(sb)->flags &
    144				dquot_state_flag(DQUOT_SUSPENDED, type);
    145}
    146
    147static inline unsigned sb_any_quota_suspended(struct super_block *sb)
    148{
    149	return dquot_state_types(sb_dqopt(sb)->flags, DQUOT_SUSPENDED);
    150}
    151
    152/* Does kernel know about any quota information for given sb + type? */
    153static inline bool sb_has_quota_loaded(struct super_block *sb, int type)
    154{
    155	/* Currently if anything is on, then quota usage is on as well */
    156	return sb_has_quota_usage_enabled(sb, type);
    157}
    158
    159static inline unsigned sb_any_quota_loaded(struct super_block *sb)
    160{
    161	return dquot_state_types(sb_dqopt(sb)->flags, DQUOT_USAGE_ENABLED);
    162}
    163
    164static inline bool sb_has_quota_active(struct super_block *sb, int type)
    165{
    166	return sb_has_quota_loaded(sb, type) &&
    167	       !sb_has_quota_suspended(sb, type);
    168}
    169
    170/*
    171 * Operations supported for diskquotas.
    172 */
    173extern const struct dquot_operations dquot_operations;
    174extern const struct quotactl_ops dquot_quotactl_sysfile_ops;
    175
    176#else
    177
    178static inline int sb_has_quota_usage_enabled(struct super_block *sb, int type)
    179{
    180	return 0;
    181}
    182
    183static inline int sb_has_quota_limits_enabled(struct super_block *sb, int type)
    184{
    185	return 0;
    186}
    187
    188static inline int sb_has_quota_suspended(struct super_block *sb, int type)
    189{
    190	return 0;
    191}
    192
    193static inline int sb_any_quota_suspended(struct super_block *sb)
    194{
    195	return 0;
    196}
    197
    198/* Does kernel know about any quota information for given sb + type? */
    199static inline int sb_has_quota_loaded(struct super_block *sb, int type)
    200{
    201	return 0;
    202}
    203
    204static inline int sb_any_quota_loaded(struct super_block *sb)
    205{
    206	return 0;
    207}
    208
    209static inline int sb_has_quota_active(struct super_block *sb, int type)
    210{
    211	return 0;
    212}
    213
    214static inline int dquot_initialize(struct inode *inode)
    215{
    216	return 0;
    217}
    218
    219static inline bool dquot_initialize_needed(struct inode *inode)
    220{
    221	return false;
    222}
    223
    224static inline void dquot_drop(struct inode *inode)
    225{
    226}
    227
    228static inline int dquot_alloc_inode(struct inode *inode)
    229{
    230	return 0;
    231}
    232
    233static inline void dquot_free_inode(struct inode *inode)
    234{
    235}
    236
    237static inline int dquot_transfer(struct inode *inode, struct iattr *iattr)
    238{
    239	return 0;
    240}
    241
    242static inline int __dquot_alloc_space(struct inode *inode, qsize_t number,
    243		int flags)
    244{
    245	if (!(flags & DQUOT_SPACE_RESERVE))
    246		inode_add_bytes(inode, number);
    247	return 0;
    248}
    249
    250static inline void __dquot_free_space(struct inode *inode, qsize_t number,
    251		int flags)
    252{
    253	if (!(flags & DQUOT_SPACE_RESERVE))
    254		inode_sub_bytes(inode, number);
    255}
    256
    257static inline int dquot_claim_space_nodirty(struct inode *inode, qsize_t number)
    258{
    259	inode_add_bytes(inode, number);
    260	return 0;
    261}
    262
    263static inline int dquot_reclaim_space_nodirty(struct inode *inode,
    264					      qsize_t number)
    265{
    266	inode_sub_bytes(inode, number);
    267	return 0;
    268}
    269
    270static inline int dquot_disable(struct super_block *sb, int type,
    271		unsigned int flags)
    272{
    273	return 0;
    274}
    275
    276static inline int dquot_suspend(struct super_block *sb, int type)
    277{
    278	return 0;
    279}
    280
    281static inline int dquot_resume(struct super_block *sb, int type)
    282{
    283	return 0;
    284}
    285
    286#define dquot_file_open		generic_file_open
    287
    288static inline int dquot_writeback_dquots(struct super_block *sb, int type)
    289{
    290	return 0;
    291}
    292
    293#endif /* CONFIG_QUOTA */
    294
    295static inline int dquot_alloc_space_nodirty(struct inode *inode, qsize_t nr)
    296{
    297	return __dquot_alloc_space(inode, nr, DQUOT_SPACE_WARN);
    298}
    299
    300static inline void dquot_alloc_space_nofail(struct inode *inode, qsize_t nr)
    301{
    302	__dquot_alloc_space(inode, nr, DQUOT_SPACE_WARN|DQUOT_SPACE_NOFAIL);
    303	mark_inode_dirty_sync(inode);
    304}
    305
    306static inline int dquot_alloc_space(struct inode *inode, qsize_t nr)
    307{
    308	int ret;
    309
    310	ret = dquot_alloc_space_nodirty(inode, nr);
    311	if (!ret) {
    312		/*
    313		 * Mark inode fully dirty. Since we are allocating blocks, inode
    314		 * would become fully dirty soon anyway and it reportedly
    315		 * reduces lock contention.
    316		 */
    317		mark_inode_dirty(inode);
    318	}
    319	return ret;
    320}
    321
    322static inline int dquot_alloc_block_nodirty(struct inode *inode, qsize_t nr)
    323{
    324	return dquot_alloc_space_nodirty(inode, nr << inode->i_blkbits);
    325}
    326
    327static inline void dquot_alloc_block_nofail(struct inode *inode, qsize_t nr)
    328{
    329	dquot_alloc_space_nofail(inode, nr << inode->i_blkbits);
    330}
    331
    332static inline int dquot_alloc_block(struct inode *inode, qsize_t nr)
    333{
    334	return dquot_alloc_space(inode, nr << inode->i_blkbits);
    335}
    336
    337static inline int dquot_prealloc_block_nodirty(struct inode *inode, qsize_t nr)
    338{
    339	return __dquot_alloc_space(inode, nr << inode->i_blkbits, 0);
    340}
    341
    342static inline int dquot_prealloc_block(struct inode *inode, qsize_t nr)
    343{
    344	int ret;
    345
    346	ret = dquot_prealloc_block_nodirty(inode, nr);
    347	if (!ret)
    348		mark_inode_dirty_sync(inode);
    349	return ret;
    350}
    351
    352static inline int dquot_reserve_block(struct inode *inode, qsize_t nr)
    353{
    354	return __dquot_alloc_space(inode, nr << inode->i_blkbits,
    355				DQUOT_SPACE_WARN|DQUOT_SPACE_RESERVE);
    356}
    357
    358static inline int dquot_claim_block(struct inode *inode, qsize_t nr)
    359{
    360	int ret;
    361
    362	ret = dquot_claim_space_nodirty(inode, nr << inode->i_blkbits);
    363	if (!ret)
    364		mark_inode_dirty_sync(inode);
    365	return ret;
    366}
    367
    368static inline void dquot_reclaim_block(struct inode *inode, qsize_t nr)
    369{
    370	dquot_reclaim_space_nodirty(inode, nr << inode->i_blkbits);
    371	mark_inode_dirty_sync(inode);
    372}
    373
    374static inline void dquot_free_space_nodirty(struct inode *inode, qsize_t nr)
    375{
    376	__dquot_free_space(inode, nr, 0);
    377}
    378
    379static inline void dquot_free_space(struct inode *inode, qsize_t nr)
    380{
    381	dquot_free_space_nodirty(inode, nr);
    382	mark_inode_dirty_sync(inode);
    383}
    384
    385static inline void dquot_free_block_nodirty(struct inode *inode, qsize_t nr)
    386{
    387	dquot_free_space_nodirty(inode, nr << inode->i_blkbits);
    388}
    389
    390static inline void dquot_free_block(struct inode *inode, qsize_t nr)
    391{
    392	dquot_free_space(inode, nr << inode->i_blkbits);
    393}
    394
    395static inline void dquot_release_reservation_block(struct inode *inode,
    396		qsize_t nr)
    397{
    398	__dquot_free_space(inode, nr << inode->i_blkbits, DQUOT_SPACE_RESERVE);
    399}
    400
    401unsigned int qtype_enforce_flag(int type);
    402
    403#endif /* _LINUX_QUOTAOPS_ */