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