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