linux/include/linux/quotaops.h
<<
>>
Prefs
   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 && ia->ia_size != inode->i_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}
  54void dqput(struct dquot *dquot);
  55int dquot_scan_active(struct super_block *sb,
  56                      int (*fn)(struct dquot *dquot, unsigned long priv),
  57                      unsigned long priv);
  58struct dquot *dquot_alloc(struct super_block *sb, int type);
  59void dquot_destroy(struct dquot *dquot);
  60
  61int __dquot_alloc_space(struct inode *inode, qsize_t number, int flags);
  62void __dquot_free_space(struct inode *inode, qsize_t number, int flags);
  63
  64int dquot_alloc_inode(struct inode *inode);
  65
  66int dquot_claim_space_nodirty(struct inode *inode, qsize_t number);
  67void dquot_free_inode(struct inode *inode);
  68void dquot_reclaim_space_nodirty(struct inode *inode, qsize_t number);
  69
  70int dquot_disable(struct super_block *sb, int type, unsigned int flags);
  71/* Suspend quotas on remount RO */
  72static inline int dquot_suspend(struct super_block *sb, int type)
  73{
  74        return dquot_disable(sb, type, DQUOT_SUSPENDED);
  75}
  76int dquot_resume(struct super_block *sb, int type);
  77
  78int dquot_commit(struct dquot *dquot);
  79int dquot_acquire(struct dquot *dquot);
  80int dquot_release(struct dquot *dquot);
  81int dquot_commit_info(struct super_block *sb, int type);
  82int dquot_get_next_id(struct super_block *sb, struct kqid *qid);
  83int dquot_mark_dquot_dirty(struct dquot *dquot);
  84
  85int dquot_file_open(struct inode *inode, struct file *file);
  86
  87int dquot_enable(struct inode *inode, int type, int format_id,
  88        unsigned int flags);
  89int dquot_quota_on(struct super_block *sb, int type, int format_id,
  90        const struct path *path);
  91int dquot_quota_on_mount(struct super_block *sb, char *qf_name,
  92        int format_id, int type);
  93int dquot_quota_off(struct super_block *sb, int type);
  94int dquot_writeback_dquots(struct super_block *sb, int type);
  95int dquot_quota_sync(struct super_block *sb, int type);
  96int dquot_get_state(struct super_block *sb, struct qc_state *state);
  97int dquot_set_dqinfo(struct super_block *sb, int type, struct qc_info *ii);
  98int dquot_get_dqblk(struct super_block *sb, struct kqid id,
  99                struct qc_dqblk *di);
 100int dquot_get_next_dqblk(struct super_block *sb, struct kqid *id,
 101                struct qc_dqblk *di);
 102int dquot_set_dqblk(struct super_block *sb, struct kqid id,
 103                struct qc_dqblk *di);
 104
 105int __dquot_transfer(struct inode *inode, struct dquot **transfer_to);
 106int dquot_transfer(struct inode *inode, struct iattr *iattr);
 107
 108static inline struct mem_dqinfo *sb_dqinfo(struct super_block *sb, int type)
 109{
 110        return sb_dqopt(sb)->info + type;
 111}
 112
 113/*
 114 * Functions for checking status of quota
 115 */
 116
 117static inline bool sb_has_quota_usage_enabled(struct super_block *sb, int type)
 118{
 119        return sb_dqopt(sb)->flags &
 120                                dquot_state_flag(DQUOT_USAGE_ENABLED, type);
 121}
 122
 123static inline bool sb_has_quota_limits_enabled(struct super_block *sb, int type)
 124{
 125        return sb_dqopt(sb)->flags &
 126                                dquot_state_flag(DQUOT_LIMITS_ENABLED, type);
 127}
 128
 129static inline bool sb_has_quota_suspended(struct super_block *sb, int type)
 130{
 131        return sb_dqopt(sb)->flags &
 132                                dquot_state_flag(DQUOT_SUSPENDED, type);
 133}
 134
 135static inline unsigned sb_any_quota_suspended(struct super_block *sb)
 136{
 137        return dquot_state_types(sb_dqopt(sb)->flags, DQUOT_SUSPENDED);
 138}
 139
 140/* Does kernel know about any quota information for given sb + type? */
 141static inline bool sb_has_quota_loaded(struct super_block *sb, int type)
 142{
 143        /* Currently if anything is on, then quota usage is on as well */
 144        return sb_has_quota_usage_enabled(sb, type);
 145}
 146
 147static inline unsigned sb_any_quota_loaded(struct super_block *sb)
 148{
 149        return dquot_state_types(sb_dqopt(sb)->flags, DQUOT_USAGE_ENABLED);
 150}
 151
 152static inline bool sb_has_quota_active(struct super_block *sb, int type)
 153{
 154        return sb_has_quota_loaded(sb, type) &&
 155               !sb_has_quota_suspended(sb, type);
 156}
 157
 158/*
 159 * Operations supported for diskquotas.
 160 */
 161extern const struct dquot_operations dquot_operations;
 162extern const struct quotactl_ops dquot_quotactl_sysfile_ops;
 163
 164#else
 165
 166static inline int sb_has_quota_usage_enabled(struct super_block *sb, int type)
 167{
 168        return 0;
 169}
 170
 171static inline int sb_has_quota_limits_enabled(struct super_block *sb, int type)
 172{
 173        return 0;
 174}
 175
 176static inline int sb_has_quota_suspended(struct super_block *sb, int type)
 177{
 178        return 0;
 179}
 180
 181static inline int sb_any_quota_suspended(struct super_block *sb)
 182{
 183        return 0;
 184}
 185
 186/* Does kernel know about any quota information for given sb + type? */
 187static inline int sb_has_quota_loaded(struct super_block *sb, int type)
 188{
 189        return 0;
 190}
 191
 192static inline int sb_any_quota_loaded(struct super_block *sb)
 193{
 194        return 0;
 195}
 196
 197static inline int sb_has_quota_active(struct super_block *sb, int type)
 198{
 199        return 0;
 200}
 201
 202static inline int dquot_initialize(struct inode *inode)
 203{
 204        return 0;
 205}
 206
 207static inline bool dquot_initialize_needed(struct inode *inode)
 208{
 209        return false;
 210}
 211
 212static inline void dquot_drop(struct inode *inode)
 213{
 214}
 215
 216static inline int dquot_alloc_inode(struct inode *inode)
 217{
 218        return 0;
 219}
 220
 221static inline void dquot_free_inode(struct inode *inode)
 222{
 223}
 224
 225static inline int dquot_transfer(struct inode *inode, struct iattr *iattr)
 226{
 227        return 0;
 228}
 229
 230static inline int __dquot_alloc_space(struct inode *inode, qsize_t number,
 231                int flags)
 232{
 233        if (!(flags & DQUOT_SPACE_RESERVE))
 234                inode_add_bytes(inode, number);
 235        return 0;
 236}
 237
 238static inline void __dquot_free_space(struct inode *inode, qsize_t number,
 239                int flags)
 240{
 241        if (!(flags & DQUOT_SPACE_RESERVE))
 242                inode_sub_bytes(inode, number);
 243}
 244
 245static inline int dquot_claim_space_nodirty(struct inode *inode, qsize_t number)
 246{
 247        inode_add_bytes(inode, number);
 248        return 0;
 249}
 250
 251static inline int dquot_reclaim_space_nodirty(struct inode *inode,
 252                                              qsize_t number)
 253{
 254        inode_sub_bytes(inode, number);
 255        return 0;
 256}
 257
 258static inline int dquot_disable(struct super_block *sb, int type,
 259                unsigned int flags)
 260{
 261        return 0;
 262}
 263
 264static inline int dquot_suspend(struct super_block *sb, int type)
 265{
 266        return 0;
 267}
 268
 269static inline int dquot_resume(struct super_block *sb, int type)
 270{
 271        return 0;
 272}
 273
 274#define dquot_file_open         generic_file_open
 275
 276static inline int dquot_writeback_dquots(struct super_block *sb, int type)
 277{
 278        return 0;
 279}
 280
 281#endif /* CONFIG_QUOTA */
 282
 283static inline int dquot_alloc_space_nodirty(struct inode *inode, qsize_t nr)
 284{
 285        return __dquot_alloc_space(inode, nr, DQUOT_SPACE_WARN);
 286}
 287
 288static inline void dquot_alloc_space_nofail(struct inode *inode, qsize_t nr)
 289{
 290        __dquot_alloc_space(inode, nr, DQUOT_SPACE_WARN|DQUOT_SPACE_NOFAIL);
 291        mark_inode_dirty_sync(inode);
 292}
 293
 294static inline int dquot_alloc_space(struct inode *inode, qsize_t nr)
 295{
 296        int ret;
 297
 298        ret = dquot_alloc_space_nodirty(inode, nr);
 299        if (!ret) {
 300                /*
 301                 * Mark inode fully dirty. Since we are allocating blocks, inode
 302                 * would become fully dirty soon anyway and it reportedly
 303                 * reduces lock contention.
 304                 */
 305                mark_inode_dirty(inode);
 306        }
 307        return ret;
 308}
 309
 310static inline int dquot_alloc_block_nodirty(struct inode *inode, qsize_t nr)
 311{
 312        return dquot_alloc_space_nodirty(inode, nr << inode->i_blkbits);
 313}
 314
 315static inline void dquot_alloc_block_nofail(struct inode *inode, qsize_t nr)
 316{
 317        dquot_alloc_space_nofail(inode, nr << inode->i_blkbits);
 318}
 319
 320static inline int dquot_alloc_block(struct inode *inode, qsize_t nr)
 321{
 322        return dquot_alloc_space(inode, nr << inode->i_blkbits);
 323}
 324
 325static inline int dquot_prealloc_block_nodirty(struct inode *inode, qsize_t nr)
 326{
 327        return __dquot_alloc_space(inode, nr << inode->i_blkbits, 0);
 328}
 329
 330static inline int dquot_prealloc_block(struct inode *inode, qsize_t nr)
 331{
 332        int ret;
 333
 334        ret = dquot_prealloc_block_nodirty(inode, nr);
 335        if (!ret)
 336                mark_inode_dirty_sync(inode);
 337        return ret;
 338}
 339
 340static inline int dquot_reserve_block(struct inode *inode, qsize_t nr)
 341{
 342        return __dquot_alloc_space(inode, nr << inode->i_blkbits,
 343                                DQUOT_SPACE_WARN|DQUOT_SPACE_RESERVE);
 344}
 345
 346static inline int dquot_claim_block(struct inode *inode, qsize_t nr)
 347{
 348        int ret;
 349
 350        ret = dquot_claim_space_nodirty(inode, nr << inode->i_blkbits);
 351        if (!ret)
 352                mark_inode_dirty_sync(inode);
 353        return ret;
 354}
 355
 356static inline void dquot_reclaim_block(struct inode *inode, qsize_t nr)
 357{
 358        dquot_reclaim_space_nodirty(inode, nr << inode->i_blkbits);
 359        mark_inode_dirty_sync(inode);
 360}
 361
 362static inline void dquot_free_space_nodirty(struct inode *inode, qsize_t nr)
 363{
 364        __dquot_free_space(inode, nr, 0);
 365}
 366
 367static inline void dquot_free_space(struct inode *inode, qsize_t nr)
 368{
 369        dquot_free_space_nodirty(inode, nr);
 370        mark_inode_dirty_sync(inode);
 371}
 372
 373static inline void dquot_free_block_nodirty(struct inode *inode, qsize_t nr)
 374{
 375        dquot_free_space_nodirty(inode, nr << inode->i_blkbits);
 376}
 377
 378static inline void dquot_free_block(struct inode *inode, qsize_t nr)
 379{
 380        dquot_free_space(inode, nr << inode->i_blkbits);
 381}
 382
 383static inline void dquot_release_reservation_block(struct inode *inode,
 384                qsize_t nr)
 385{
 386        __dquot_free_space(inode, nr << inode->i_blkbits, DQUOT_SPACE_RESERVE);
 387}
 388
 389unsigned int qtype_enforce_flag(int type);
 390
 391#endif /* _LINUX_QUOTAOPS_ */
 392