linux/fs/dquot.c
<<
>>
Prefs
   1/*
   2 * Implementation of the diskquota system for the LINUX operating system. QUOTA
   3 * is implemented using the BSD system call interface as the means of
   4 * communication with the user level. This file contains the generic routines
   5 * called by the different filesystems on allocation of an inode or block.
   6 * These routines take care of the administration needed to have a consistent
   7 * diskquota tracking system. The ideas of both user and group quotas are based
   8 * on the Melbourne quota system as used on BSD derived systems. The internal
   9 * implementation is based on one of the several variants of the LINUX
  10 * inode-subsystem with added complexity of the diskquota system.
  11 * 
  12 * Version: $Id: dquot.c,v 6.3 1996/11/17 18:35:34 mvw Exp mvw $
  13 * 
  14 * Author:      Marco van Wieringen <mvw@planets.elm.net>
  15 *
  16 * Fixes:   Dmitry Gorodchanin <pgmdsg@ibi.com>, 11 Feb 96
  17 *
  18 *              Revised list management to avoid races
  19 *              -- Bill Hawes, <whawes@star.net>, 9/98
  20 *
  21 *              Fixed races in dquot_transfer(), dqget() and dquot_alloc_...().
  22 *              As the consequence the locking was moved from dquot_decr_...(),
  23 *              dquot_incr_...() to calling functions.
  24 *              invalidate_dquots() now writes modified dquots.
  25 *              Serialized quota_off() and quota_on() for mount point.
  26 *              Fixed a few bugs in grow_dquots().
  27 *              Fixed deadlock in write_dquot() - we no longer account quotas on
  28 *              quota files
  29 *              remove_dquot_ref() moved to inode.c - it now traverses through inodes
  30 *              add_dquot_ref() restarts after blocking
  31 *              Added check for bogus uid and fixed check for group in quotactl.
  32 *              Jan Kara, <jack@suse.cz>, sponsored by SuSE CR, 10-11/99
  33 *
  34 *              Used struct list_head instead of own list struct
  35 *              Invalidation of referenced dquots is no longer possible
  36 *              Improved free_dquots list management
  37 *              Quota and i_blocks are now updated in one place to avoid races
  38 *              Warnings are now delayed so we won't block in critical section
  39 *              Write updated not to require dquot lock
  40 *              Jan Kara, <jack@suse.cz>, 9/2000
  41 *
  42 *              Added dynamic quota structure allocation
  43 *              Jan Kara <jack@suse.cz> 12/2000
  44 *
  45 *              Rewritten quota interface. Implemented new quota format and
  46 *              formats registering.
  47 *              Jan Kara, <jack@suse.cz>, 2001,2002
  48 *
  49 *              New SMP locking.
  50 *              Jan Kara, <jack@suse.cz>, 10/2002
  51 *
  52 *              Added journalled quota support, fix lock inversion problems
  53 *              Jan Kara, <jack@suse.cz>, 2003,2004
  54 *
  55 * (C) Copyright 1994 - 1997 Marco van Wieringen 
  56 */
  57
  58#include <linux/errno.h>
  59#include <linux/kernel.h>
  60#include <linux/fs.h>
  61#include <linux/mount.h>
  62#include <linux/mm.h>
  63#include <linux/time.h>
  64#include <linux/types.h>
  65#include <linux/string.h>
  66#include <linux/fcntl.h>
  67#include <linux/stat.h>
  68#include <linux/tty.h>
  69#include <linux/file.h>
  70#include <linux/slab.h>
  71#include <linux/sysctl.h>
  72#include <linux/init.h>
  73#include <linux/module.h>
  74#include <linux/proc_fs.h>
  75#include <linux/security.h>
  76#include <linux/kmod.h>
  77#include <linux/namei.h>
  78#include <linux/buffer_head.h>
  79#include <linux/capability.h>
  80#include <linux/quotaops.h>
  81#include <linux/writeback.h> /* for inode_lock, oddly enough.. */
  82
  83#include <asm/uaccess.h>
  84
  85#define __DQUOT_PARANOIA
  86
  87/*
  88 * There are two quota SMP locks. dq_list_lock protects all lists with quotas
  89 * and quota formats and also dqstats structure containing statistics about the
  90 * lists. dq_data_lock protects data from dq_dqb and also mem_dqinfo structures
  91 * and also guards consistency of dquot->dq_dqb with inode->i_blocks, i_bytes.
  92 * i_blocks and i_bytes updates itself are guarded by i_lock acquired directly
  93 * in inode_add_bytes() and inode_sub_bytes().
  94 *
  95 * The spinlock ordering is hence: dq_data_lock > dq_list_lock > i_lock
  96 *
  97 * Note that some things (eg. sb pointer, type, id) doesn't change during
  98 * the life of the dquot structure and so needn't to be protected by a lock
  99 *
 100 * Any operation working on dquots via inode pointers must hold dqptr_sem.  If
 101 * operation is just reading pointers from inode (or not using them at all) the
 102 * read lock is enough. If pointers are altered function must hold write lock
 103 * (these locking rules also apply for S_NOQUOTA flag in the inode - note that
 104 * for altering the flag i_mutex is also needed).  If operation is holding
 105 * reference to dquot in other way (e.g. quotactl ops) it must be guarded by
 106 * dqonoff_mutex.
 107 * This locking assures that:
 108 *   a) update/access to dquot pointers in inode is serialized
 109 *   b) everyone is guarded against invalidate_dquots()
 110 *
 111 * Each dquot has its dq_lock mutex. Locked dquots might not be referenced
 112 * from inodes (dquot_alloc_space() and such don't check the dq_lock).
 113 * Currently dquot is locked only when it is being read to memory (or space for
 114 * it is being allocated) on the first dqget() and when it is being released on
 115 * the last dqput(). The allocation and release oparations are serialized by
 116 * the dq_lock and by checking the use count in dquot_release().  Write
 117 * operations on dquots don't hold dq_lock as they copy data under dq_data_lock
 118 * spinlock to internal buffers before writing.
 119 *
 120 * Lock ordering (including related VFS locks) is the following:
 121 *   i_mutex > dqonoff_sem > journal_lock > dqptr_sem > dquot->dq_lock >
 122 *   dqio_mutex
 123 * i_mutex on quota files is special (it's below dqio_mutex)
 124 */
 125
 126static DEFINE_SPINLOCK(dq_list_lock);
 127DEFINE_SPINLOCK(dq_data_lock);
 128
 129static char *quotatypes[] = INITQFNAMES;
 130static struct quota_format_type *quota_formats; /* List of registered formats */
 131static struct quota_module_name module_names[] = INIT_QUOTA_MODULE_NAMES;
 132
 133/* SLAB cache for dquot structures */
 134static struct kmem_cache *dquot_cachep;
 135
 136int register_quota_format(struct quota_format_type *fmt)
 137{
 138        spin_lock(&dq_list_lock);
 139        fmt->qf_next = quota_formats;
 140        quota_formats = fmt;
 141        spin_unlock(&dq_list_lock);
 142        return 0;
 143}
 144
 145void unregister_quota_format(struct quota_format_type *fmt)
 146{
 147        struct quota_format_type **actqf;
 148
 149        spin_lock(&dq_list_lock);
 150        for (actqf = &quota_formats; *actqf && *actqf != fmt; actqf = &(*actqf)->qf_next);
 151        if (*actqf)
 152                *actqf = (*actqf)->qf_next;
 153        spin_unlock(&dq_list_lock);
 154}
 155
 156static struct quota_format_type *find_quota_format(int id)
 157{
 158        struct quota_format_type *actqf;
 159
 160        spin_lock(&dq_list_lock);
 161        for (actqf = quota_formats; actqf && actqf->qf_fmt_id != id; actqf = actqf->qf_next);
 162        if (!actqf || !try_module_get(actqf->qf_owner)) {
 163                int qm;
 164
 165                spin_unlock(&dq_list_lock);
 166                
 167                for (qm = 0; module_names[qm].qm_fmt_id && module_names[qm].qm_fmt_id != id; qm++);
 168                if (!module_names[qm].qm_fmt_id || request_module(module_names[qm].qm_mod_name))
 169                        return NULL;
 170
 171                spin_lock(&dq_list_lock);
 172                for (actqf = quota_formats; actqf && actqf->qf_fmt_id != id; actqf = actqf->qf_next);
 173                if (actqf && !try_module_get(actqf->qf_owner))
 174                        actqf = NULL;
 175        }
 176        spin_unlock(&dq_list_lock);
 177        return actqf;
 178}
 179
 180static void put_quota_format(struct quota_format_type *fmt)
 181{
 182        module_put(fmt->qf_owner);
 183}
 184
 185/*
 186 * Dquot List Management:
 187 * The quota code uses three lists for dquot management: the inuse_list,
 188 * free_dquots, and dquot_hash[] array. A single dquot structure may be
 189 * on all three lists, depending on its current state.
 190 *
 191 * All dquots are placed to the end of inuse_list when first created, and this
 192 * list is used for invalidate operation, which must look at every dquot.
 193 *
 194 * Unused dquots (dq_count == 0) are added to the free_dquots list when freed,
 195 * and this list is searched whenever we need an available dquot.  Dquots are
 196 * removed from the list as soon as they are used again, and
 197 * dqstats.free_dquots gives the number of dquots on the list. When
 198 * dquot is invalidated it's completely released from memory.
 199 *
 200 * Dquots with a specific identity (device, type and id) are placed on
 201 * one of the dquot_hash[] hash chains. The provides an efficient search
 202 * mechanism to locate a specific dquot.
 203 */
 204
 205static LIST_HEAD(inuse_list);
 206static LIST_HEAD(free_dquots);
 207static unsigned int dq_hash_bits, dq_hash_mask;
 208static struct hlist_head *dquot_hash;
 209
 210struct dqstats dqstats;
 211
 212static void dqput(struct dquot *dquot);
 213
 214static inline unsigned int
 215hashfn(const struct super_block *sb, unsigned int id, int type)
 216{
 217        unsigned long tmp;
 218
 219        tmp = (((unsigned long)sb>>L1_CACHE_SHIFT) ^ id) * (MAXQUOTAS - type);
 220        return (tmp + (tmp >> dq_hash_bits)) & dq_hash_mask;
 221}
 222
 223/*
 224 * Following list functions expect dq_list_lock to be held
 225 */
 226static inline void insert_dquot_hash(struct dquot *dquot)
 227{
 228        struct hlist_head *head = dquot_hash + hashfn(dquot->dq_sb, dquot->dq_id, dquot->dq_type);
 229        hlist_add_head(&dquot->dq_hash, head);
 230}
 231
 232static inline void remove_dquot_hash(struct dquot *dquot)
 233{
 234        hlist_del_init(&dquot->dq_hash);
 235}
 236
 237static inline struct dquot *find_dquot(unsigned int hashent, struct super_block *sb, unsigned int id, int type)
 238{
 239        struct hlist_node *node;
 240        struct dquot *dquot;
 241
 242        hlist_for_each (node, dquot_hash+hashent) {
 243                dquot = hlist_entry(node, struct dquot, dq_hash);
 244                if (dquot->dq_sb == sb && dquot->dq_id == id && dquot->dq_type == type)
 245                        return dquot;
 246        }
 247        return NODQUOT;
 248}
 249
 250/* Add a dquot to the tail of the free list */
 251static inline void put_dquot_last(struct dquot *dquot)
 252{
 253        list_add_tail(&dquot->dq_free, &free_dquots);
 254        dqstats.free_dquots++;
 255}
 256
 257static inline void remove_free_dquot(struct dquot *dquot)
 258{
 259        if (list_empty(&dquot->dq_free))
 260                return;
 261        list_del_init(&dquot->dq_free);
 262        dqstats.free_dquots--;
 263}
 264
 265static inline void put_inuse(struct dquot *dquot)
 266{
 267        /* We add to the back of inuse list so we don't have to restart
 268         * when traversing this list and we block */
 269        list_add_tail(&dquot->dq_inuse, &inuse_list);
 270        dqstats.allocated_dquots++;
 271}
 272
 273static inline void remove_inuse(struct dquot *dquot)
 274{
 275        dqstats.allocated_dquots--;
 276        list_del(&dquot->dq_inuse);
 277}
 278/*
 279 * End of list functions needing dq_list_lock
 280 */
 281
 282static void wait_on_dquot(struct dquot *dquot)
 283{
 284        mutex_lock(&dquot->dq_lock);
 285        mutex_unlock(&dquot->dq_lock);
 286}
 287
 288#define mark_dquot_dirty(dquot) ((dquot)->dq_sb->dq_op->mark_dirty(dquot))
 289
 290int dquot_mark_dquot_dirty(struct dquot *dquot)
 291{
 292        spin_lock(&dq_list_lock);
 293        if (!test_and_set_bit(DQ_MOD_B, &dquot->dq_flags))
 294                list_add(&dquot->dq_dirty, &sb_dqopt(dquot->dq_sb)->
 295                                info[dquot->dq_type].dqi_dirty_list);
 296        spin_unlock(&dq_list_lock);
 297        return 0;
 298}
 299
 300/* This function needs dq_list_lock */
 301static inline int clear_dquot_dirty(struct dquot *dquot)
 302{
 303        if (!test_and_clear_bit(DQ_MOD_B, &dquot->dq_flags))
 304                return 0;
 305        list_del_init(&dquot->dq_dirty);
 306        return 1;
 307}
 308
 309void mark_info_dirty(struct super_block *sb, int type)
 310{
 311        set_bit(DQF_INFO_DIRTY_B, &sb_dqopt(sb)->info[type].dqi_flags);
 312}
 313EXPORT_SYMBOL(mark_info_dirty);
 314
 315/*
 316 *      Read dquot from disk and alloc space for it
 317 */
 318
 319int dquot_acquire(struct dquot *dquot)
 320{
 321        int ret = 0, ret2 = 0;
 322        struct quota_info *dqopt = sb_dqopt(dquot->dq_sb);
 323
 324        mutex_lock(&dquot->dq_lock);
 325        mutex_lock(&dqopt->dqio_mutex);
 326        if (!test_bit(DQ_READ_B, &dquot->dq_flags))
 327                ret = dqopt->ops[dquot->dq_type]->read_dqblk(dquot);
 328        if (ret < 0)
 329                goto out_iolock;
 330        set_bit(DQ_READ_B, &dquot->dq_flags);
 331        /* Instantiate dquot if needed */
 332        if (!test_bit(DQ_ACTIVE_B, &dquot->dq_flags) && !dquot->dq_off) {
 333                ret = dqopt->ops[dquot->dq_type]->commit_dqblk(dquot);
 334                /* Write the info if needed */
 335                if (info_dirty(&dqopt->info[dquot->dq_type]))
 336                        ret2 = dqopt->ops[dquot->dq_type]->write_file_info(dquot->dq_sb, dquot->dq_type);
 337                if (ret < 0)
 338                        goto out_iolock;
 339                if (ret2 < 0) {
 340                        ret = ret2;
 341                        goto out_iolock;
 342                }
 343        }
 344        set_bit(DQ_ACTIVE_B, &dquot->dq_flags);
 345out_iolock:
 346        mutex_unlock(&dqopt->dqio_mutex);
 347        mutex_unlock(&dquot->dq_lock);
 348        return ret;
 349}
 350
 351/*
 352 *      Write dquot to disk
 353 */
 354int dquot_commit(struct dquot *dquot)
 355{
 356        int ret = 0, ret2 = 0;
 357        struct quota_info *dqopt = sb_dqopt(dquot->dq_sb);
 358
 359        mutex_lock(&dqopt->dqio_mutex);
 360        spin_lock(&dq_list_lock);
 361        if (!clear_dquot_dirty(dquot)) {
 362                spin_unlock(&dq_list_lock);
 363                goto out_sem;
 364        }
 365        spin_unlock(&dq_list_lock);
 366        /* Inactive dquot can be only if there was error during read/init
 367         * => we have better not writing it */
 368        if (test_bit(DQ_ACTIVE_B, &dquot->dq_flags)) {
 369                ret = dqopt->ops[dquot->dq_type]->commit_dqblk(dquot);
 370                if (info_dirty(&dqopt->info[dquot->dq_type]))
 371                        ret2 = dqopt->ops[dquot->dq_type]->write_file_info(dquot->dq_sb, dquot->dq_type);
 372                if (ret >= 0)
 373                        ret = ret2;
 374        }
 375out_sem:
 376        mutex_unlock(&dqopt->dqio_mutex);
 377        return ret;
 378}
 379
 380/*
 381 *      Release dquot
 382 */
 383int dquot_release(struct dquot *dquot)
 384{
 385        int ret = 0, ret2 = 0;
 386        struct quota_info *dqopt = sb_dqopt(dquot->dq_sb);
 387
 388        mutex_lock(&dquot->dq_lock);
 389        /* Check whether we are not racing with some other dqget() */
 390        if (atomic_read(&dquot->dq_count) > 1)
 391                goto out_dqlock;
 392        mutex_lock(&dqopt->dqio_mutex);
 393        if (dqopt->ops[dquot->dq_type]->release_dqblk) {
 394                ret = dqopt->ops[dquot->dq_type]->release_dqblk(dquot);
 395                /* Write the info */
 396                if (info_dirty(&dqopt->info[dquot->dq_type]))
 397                        ret2 = dqopt->ops[dquot->dq_type]->write_file_info(dquot->dq_sb, dquot->dq_type);
 398                if (ret >= 0)
 399                        ret = ret2;
 400        }
 401        clear_bit(DQ_ACTIVE_B, &dquot->dq_flags);
 402        mutex_unlock(&dqopt->dqio_mutex);
 403out_dqlock:
 404        mutex_unlock(&dquot->dq_lock);
 405        return ret;
 406}
 407
 408/* Invalidate all dquots on the list. Note that this function is called after
 409 * quota is disabled and pointers from inodes removed so there cannot be new
 410 * quota users. There can still be some users of quotas due to inodes being
 411 * just deleted or pruned by prune_icache() (those are not attached to any
 412 * list). We have to wait for such users.
 413 */
 414static void invalidate_dquots(struct super_block *sb, int type)
 415{
 416        struct dquot *dquot, *tmp;
 417
 418restart:
 419        spin_lock(&dq_list_lock);
 420        list_for_each_entry_safe(dquot, tmp, &inuse_list, dq_inuse) {
 421                if (dquot->dq_sb != sb)
 422                        continue;
 423                if (dquot->dq_type != type)
 424                        continue;
 425                /* Wait for dquot users */
 426                if (atomic_read(&dquot->dq_count)) {
 427                        DEFINE_WAIT(wait);
 428
 429                        atomic_inc(&dquot->dq_count);
 430                        prepare_to_wait(&dquot->dq_wait_unused, &wait,
 431                                        TASK_UNINTERRUPTIBLE);
 432                        spin_unlock(&dq_list_lock);
 433                        /* Once dqput() wakes us up, we know it's time to free
 434                         * the dquot.
 435                         * IMPORTANT: we rely on the fact that there is always
 436                         * at most one process waiting for dquot to free.
 437                         * Otherwise dq_count would be > 1 and we would never
 438                         * wake up.
 439                         */
 440                        if (atomic_read(&dquot->dq_count) > 1)
 441                                schedule();
 442                        finish_wait(&dquot->dq_wait_unused, &wait);
 443                        dqput(dquot);
 444                        /* At this moment dquot() need not exist (it could be
 445                         * reclaimed by prune_dqcache(). Hence we must
 446                         * restart. */
 447                        goto restart;
 448                }
 449                /*
 450                 * Quota now has no users and it has been written on last
 451                 * dqput()
 452                 */
 453                remove_dquot_hash(dquot);
 454                remove_free_dquot(dquot);
 455                remove_inuse(dquot);
 456                kmem_cache_free(dquot_cachep, dquot);
 457        }
 458        spin_unlock(&dq_list_lock);
 459}
 460
 461int vfs_quota_sync(struct super_block *sb, int type)
 462{
 463        struct list_head *dirty;
 464        struct dquot *dquot;
 465        struct quota_info *dqopt = sb_dqopt(sb);
 466        int cnt;
 467
 468        mutex_lock(&dqopt->dqonoff_mutex);
 469        for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
 470                if (type != -1 && cnt != type)
 471                        continue;
 472                if (!sb_has_quota_enabled(sb, cnt))
 473                        continue;
 474                spin_lock(&dq_list_lock);
 475                dirty = &dqopt->info[cnt].dqi_dirty_list;
 476                while (!list_empty(dirty)) {
 477                        dquot = list_first_entry(dirty, struct dquot, dq_dirty);
 478                        /* Dirty and inactive can be only bad dquot... */
 479                        if (!test_bit(DQ_ACTIVE_B, &dquot->dq_flags)) {
 480                                clear_dquot_dirty(dquot);
 481                                continue;
 482                        }
 483                        /* Now we have active dquot from which someone is
 484                         * holding reference so we can safely just increase
 485                         * use count */
 486                        atomic_inc(&dquot->dq_count);
 487                        dqstats.lookups++;
 488                        spin_unlock(&dq_list_lock);
 489                        sb->dq_op->write_dquot(dquot);
 490                        dqput(dquot);
 491                        spin_lock(&dq_list_lock);
 492                }
 493                spin_unlock(&dq_list_lock);
 494        }
 495
 496        for (cnt = 0; cnt < MAXQUOTAS; cnt++)
 497                if ((cnt == type || type == -1) && sb_has_quota_enabled(sb, cnt)
 498                        && info_dirty(&dqopt->info[cnt]))
 499                        sb->dq_op->write_info(sb, cnt);
 500        spin_lock(&dq_list_lock);
 501        dqstats.syncs++;
 502        spin_unlock(&dq_list_lock);
 503        mutex_unlock(&dqopt->dqonoff_mutex);
 504
 505        return 0;
 506}
 507
 508/* Free unused dquots from cache */
 509static void prune_dqcache(int count)
 510{
 511        struct list_head *head;
 512        struct dquot *dquot;
 513
 514        head = free_dquots.prev;
 515        while (head != &free_dquots && count) {
 516                dquot = list_entry(head, struct dquot, dq_free);
 517                remove_dquot_hash(dquot);
 518                remove_free_dquot(dquot);
 519                remove_inuse(dquot);
 520                kmem_cache_free(dquot_cachep, dquot);
 521                count--;
 522                head = free_dquots.prev;
 523        }
 524}
 525
 526/*
 527 * This is called from kswapd when we think we need some
 528 * more memory
 529 */
 530
 531static int shrink_dqcache_memory(int nr, gfp_t gfp_mask)
 532{
 533        if (nr) {
 534                spin_lock(&dq_list_lock);
 535                prune_dqcache(nr);
 536                spin_unlock(&dq_list_lock);
 537        }
 538        return (dqstats.free_dquots / 100) * sysctl_vfs_cache_pressure;
 539}
 540
 541/*
 542 * Put reference to dquot
 543 * NOTE: If you change this function please check whether dqput_blocks() works right...
 544 * MUST be called with either dqptr_sem or dqonoff_mutex held
 545 */
 546static void dqput(struct dquot *dquot)
 547{
 548        if (!dquot)
 549                return;
 550#ifdef __DQUOT_PARANOIA
 551        if (!atomic_read(&dquot->dq_count)) {
 552                printk("VFS: dqput: trying to free free dquot\n");
 553                printk("VFS: device %s, dquot of %s %d\n",
 554                        dquot->dq_sb->s_id,
 555                        quotatypes[dquot->dq_type],
 556                        dquot->dq_id);
 557                BUG();
 558        }
 559#endif
 560        
 561        spin_lock(&dq_list_lock);
 562        dqstats.drops++;
 563        spin_unlock(&dq_list_lock);
 564we_slept:
 565        spin_lock(&dq_list_lock);
 566        if (atomic_read(&dquot->dq_count) > 1) {
 567                /* We have more than one user... nothing to do */
 568                atomic_dec(&dquot->dq_count);
 569                /* Releasing dquot during quotaoff phase? */
 570                if (!sb_has_quota_enabled(dquot->dq_sb, dquot->dq_type) &&
 571                    atomic_read(&dquot->dq_count) == 1)
 572                        wake_up(&dquot->dq_wait_unused);
 573                spin_unlock(&dq_list_lock);
 574                return;
 575        }
 576        /* Need to release dquot? */
 577        if (test_bit(DQ_ACTIVE_B, &dquot->dq_flags) && dquot_dirty(dquot)) {
 578                spin_unlock(&dq_list_lock);
 579                /* Commit dquot before releasing */
 580                dquot->dq_sb->dq_op->write_dquot(dquot);
 581                goto we_slept;
 582        }
 583        /* Clear flag in case dquot was inactive (something bad happened) */
 584        clear_dquot_dirty(dquot);
 585        if (test_bit(DQ_ACTIVE_B, &dquot->dq_flags)) {
 586                spin_unlock(&dq_list_lock);
 587                dquot->dq_sb->dq_op->release_dquot(dquot);
 588                goto we_slept;
 589        }
 590        atomic_dec(&dquot->dq_count);
 591#ifdef __DQUOT_PARANOIA
 592        /* sanity check */
 593        BUG_ON(!list_empty(&dquot->dq_free));
 594#endif
 595        put_dquot_last(dquot);
 596        spin_unlock(&dq_list_lock);
 597}
 598
 599static struct dquot *get_empty_dquot(struct super_block *sb, int type)
 600{
 601        struct dquot *dquot;
 602
 603        dquot = kmem_cache_zalloc(dquot_cachep, GFP_NOFS);
 604        if(!dquot)
 605                return NODQUOT;
 606
 607        mutex_init(&dquot->dq_lock);
 608        INIT_LIST_HEAD(&dquot->dq_free);
 609        INIT_LIST_HEAD(&dquot->dq_inuse);
 610        INIT_HLIST_NODE(&dquot->dq_hash);
 611        INIT_LIST_HEAD(&dquot->dq_dirty);
 612        init_waitqueue_head(&dquot->dq_wait_unused);
 613        dquot->dq_sb = sb;
 614        dquot->dq_type = type;
 615        atomic_set(&dquot->dq_count, 1);
 616
 617        return dquot;
 618}
 619
 620/*
 621 * Get reference to dquot
 622 * MUST be called with either dqptr_sem or dqonoff_mutex held
 623 */
 624static struct dquot *dqget(struct super_block *sb, unsigned int id, int type)
 625{
 626        unsigned int hashent = hashfn(sb, id, type);
 627        struct dquot *dquot, *empty = NODQUOT;
 628
 629        if (!sb_has_quota_enabled(sb, type))
 630                return NODQUOT;
 631we_slept:
 632        spin_lock(&dq_list_lock);
 633        if ((dquot = find_dquot(hashent, sb, id, type)) == NODQUOT) {
 634                if (empty == NODQUOT) {
 635                        spin_unlock(&dq_list_lock);
 636                        if ((empty = get_empty_dquot(sb, type)) == NODQUOT)
 637                                schedule();     /* Try to wait for a moment... */
 638                        goto we_slept;
 639                }
 640                dquot = empty;
 641                dquot->dq_id = id;
 642                /* all dquots go on the inuse_list */
 643                put_inuse(dquot);
 644                /* hash it first so it can be found */
 645                insert_dquot_hash(dquot);
 646                dqstats.lookups++;
 647                spin_unlock(&dq_list_lock);
 648        } else {
 649                if (!atomic_read(&dquot->dq_count))
 650                        remove_free_dquot(dquot);
 651                atomic_inc(&dquot->dq_count);
 652                dqstats.cache_hits++;
 653                dqstats.lookups++;
 654                spin_unlock(&dq_list_lock);
 655                if (empty)
 656                        kmem_cache_free(dquot_cachep, empty);
 657        }
 658        /* Wait for dq_lock - after this we know that either dquot_release() is already
 659         * finished or it will be canceled due to dq_count > 1 test */
 660        wait_on_dquot(dquot);
 661        /* Read the dquot and instantiate it (everything done only if needed) */
 662        if (!test_bit(DQ_ACTIVE_B, &dquot->dq_flags) && sb->dq_op->acquire_dquot(dquot) < 0) {
 663                dqput(dquot);
 664                return NODQUOT;
 665        }
 666#ifdef __DQUOT_PARANOIA
 667        BUG_ON(!dquot->dq_sb);  /* Has somebody invalidated entry under us? */
 668#endif
 669
 670        return dquot;
 671}
 672
 673static int dqinit_needed(struct inode *inode, int type)
 674{
 675        int cnt;
 676
 677        if (IS_NOQUOTA(inode))
 678                return 0;
 679        if (type != -1)
 680                return inode->i_dquot[type] == NODQUOT;
 681        for (cnt = 0; cnt < MAXQUOTAS; cnt++)
 682                if (inode->i_dquot[cnt] == NODQUOT)
 683                        return 1;
 684        return 0;
 685}
 686
 687/* This routine is guarded by dqonoff_mutex mutex */
 688static void add_dquot_ref(struct super_block *sb, int type)
 689{
 690        struct inode *inode;
 691
 692restart:
 693        spin_lock(&inode_lock);
 694        list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
 695                if (!atomic_read(&inode->i_writecount))
 696                        continue;
 697                if (!dqinit_needed(inode, type))
 698                        continue;
 699                if (inode->i_state & (I_FREEING|I_WILL_FREE))
 700                        continue;
 701
 702                __iget(inode);
 703                spin_unlock(&inode_lock);
 704
 705                sb->dq_op->initialize(inode, type);
 706                iput(inode);
 707                /* As we may have blocked we had better restart... */
 708                goto restart;
 709        }
 710        spin_unlock(&inode_lock);
 711}
 712
 713/* Return 0 if dqput() won't block (note that 1 doesn't necessarily mean blocking) */
 714static inline int dqput_blocks(struct dquot *dquot)
 715{
 716        if (atomic_read(&dquot->dq_count) <= 1)
 717                return 1;
 718        return 0;
 719}
 720
 721/* Remove references to dquots from inode - add dquot to list for freeing if needed */
 722/* We can't race with anybody because we hold dqptr_sem for writing... */
 723static int remove_inode_dquot_ref(struct inode *inode, int type,
 724                                  struct list_head *tofree_head)
 725{
 726        struct dquot *dquot = inode->i_dquot[type];
 727
 728        inode->i_dquot[type] = NODQUOT;
 729        if (dquot != NODQUOT) {
 730                if (dqput_blocks(dquot)) {
 731#ifdef __DQUOT_PARANOIA
 732                        if (atomic_read(&dquot->dq_count) != 1)
 733                                printk(KERN_WARNING "VFS: Adding dquot with dq_count %d to dispose list.\n", atomic_read(&dquot->dq_count));
 734#endif
 735                        spin_lock(&dq_list_lock);
 736                        list_add(&dquot->dq_free, tofree_head); /* As dquot must have currently users it can't be on the free list... */
 737                        spin_unlock(&dq_list_lock);
 738                        return 1;
 739                }
 740                else
 741                        dqput(dquot);   /* We have guaranteed we won't block */
 742        }
 743        return 0;
 744}
 745
 746/* Free list of dquots - called from inode.c */
 747/* dquots are removed from inodes, no new references can be got so we are the only ones holding reference */
 748static void put_dquot_list(struct list_head *tofree_head)
 749{
 750        struct list_head *act_head;
 751        struct dquot *dquot;
 752
 753        act_head = tofree_head->next;
 754        /* So now we have dquots on the list... Just free them */
 755        while (act_head != tofree_head) {
 756                dquot = list_entry(act_head, struct dquot, dq_free);
 757                act_head = act_head->next;
 758                list_del_init(&dquot->dq_free); /* Remove dquot from the list so we won't have problems... */
 759                dqput(dquot);
 760        }
 761}
 762
 763static void remove_dquot_ref(struct super_block *sb, int type,
 764                struct list_head *tofree_head)
 765{
 766        struct inode *inode;
 767
 768        spin_lock(&inode_lock);
 769        list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
 770                if (!IS_NOQUOTA(inode))
 771                        remove_inode_dquot_ref(inode, type, tofree_head);
 772        }
 773        spin_unlock(&inode_lock);
 774}
 775
 776/* Gather all references from inodes and drop them */
 777static void drop_dquot_ref(struct super_block *sb, int type)
 778{
 779        LIST_HEAD(tofree_head);
 780
 781        if (sb->dq_op) {
 782                down_write(&sb_dqopt(sb)->dqptr_sem);
 783                remove_dquot_ref(sb, type, &tofree_head);
 784                up_write(&sb_dqopt(sb)->dqptr_sem);
 785                put_dquot_list(&tofree_head);
 786        }
 787}
 788
 789static inline void dquot_incr_inodes(struct dquot *dquot, unsigned long number)
 790{
 791        dquot->dq_dqb.dqb_curinodes += number;
 792}
 793
 794static inline void dquot_incr_space(struct dquot *dquot, qsize_t number)
 795{
 796        dquot->dq_dqb.dqb_curspace += number;
 797}
 798
 799static inline void dquot_decr_inodes(struct dquot *dquot, unsigned long number)
 800{
 801        if (dquot->dq_dqb.dqb_curinodes > number)
 802                dquot->dq_dqb.dqb_curinodes -= number;
 803        else
 804                dquot->dq_dqb.dqb_curinodes = 0;
 805        if (dquot->dq_dqb.dqb_curinodes <= dquot->dq_dqb.dqb_isoftlimit)
 806                dquot->dq_dqb.dqb_itime = (time_t) 0;
 807        clear_bit(DQ_INODES_B, &dquot->dq_flags);
 808}
 809
 810static inline void dquot_decr_space(struct dquot *dquot, qsize_t number)
 811{
 812        if (dquot->dq_dqb.dqb_curspace > number)
 813                dquot->dq_dqb.dqb_curspace -= number;
 814        else
 815                dquot->dq_dqb.dqb_curspace = 0;
 816        if (toqb(dquot->dq_dqb.dqb_curspace) <= dquot->dq_dqb.dqb_bsoftlimit)
 817                dquot->dq_dqb.dqb_btime = (time_t) 0;
 818        clear_bit(DQ_BLKS_B, &dquot->dq_flags);
 819}
 820
 821static int flag_print_warnings = 1;
 822
 823static inline int need_print_warning(struct dquot *dquot)
 824{
 825        if (!flag_print_warnings)
 826                return 0;
 827
 828        switch (dquot->dq_type) {
 829                case USRQUOTA:
 830                        return current->fsuid == dquot->dq_id;
 831                case GRPQUOTA:
 832                        return in_group_p(dquot->dq_id);
 833        }
 834        return 0;
 835}
 836
 837/* Values of warnings */
 838#define NOWARN 0
 839#define IHARDWARN 1
 840#define ISOFTLONGWARN 2
 841#define ISOFTWARN 3
 842#define BHARDWARN 4
 843#define BSOFTLONGWARN 5
 844#define BSOFTWARN 6
 845
 846/* Print warning to user which exceeded quota */
 847static void print_warning(struct dquot *dquot, const char warntype)
 848{
 849        char *msg = NULL;
 850        struct tty_struct *tty;
 851        int flag = (warntype == BHARDWARN || warntype == BSOFTLONGWARN) ? DQ_BLKS_B :
 852          ((warntype == IHARDWARN || warntype == ISOFTLONGWARN) ? DQ_INODES_B : 0);
 853
 854        if (!need_print_warning(dquot) || (flag && test_and_set_bit(flag, &dquot->dq_flags)))
 855                return;
 856
 857        mutex_lock(&tty_mutex);
 858        tty = get_current_tty();
 859        if (!tty)
 860                goto out_lock;
 861        tty_write_message(tty, dquot->dq_sb->s_id);
 862        if (warntype == ISOFTWARN || warntype == BSOFTWARN)
 863                tty_write_message(tty, ": warning, ");
 864        else
 865                tty_write_message(tty, ": write failed, ");
 866        tty_write_message(tty, quotatypes[dquot->dq_type]);
 867        switch (warntype) {
 868                case IHARDWARN:
 869                        msg = " file limit reached.\r\n";
 870                        break;
 871                case ISOFTLONGWARN:
 872                        msg = " file quota exceeded too long.\r\n";
 873                        break;
 874                case ISOFTWARN:
 875                        msg = " file quota exceeded.\r\n";
 876                        break;
 877                case BHARDWARN:
 878                        msg = " block limit reached.\r\n";
 879                        break;
 880                case BSOFTLONGWARN:
 881                        msg = " block quota exceeded too long.\r\n";
 882                        break;
 883                case BSOFTWARN:
 884                        msg = " block quota exceeded.\r\n";
 885                        break;
 886        }
 887        tty_write_message(tty, msg);
 888out_lock:
 889        mutex_unlock(&tty_mutex);
 890}
 891
 892static inline void flush_warnings(struct dquot **dquots, char *warntype)
 893{
 894        int i;
 895
 896        for (i = 0; i < MAXQUOTAS; i++)
 897                if (dquots[i] != NODQUOT && warntype[i] != NOWARN)
 898                        print_warning(dquots[i], warntype[i]);
 899}
 900
 901static inline char ignore_hardlimit(struct dquot *dquot)
 902{
 903        struct mem_dqinfo *info = &sb_dqopt(dquot->dq_sb)->info[dquot->dq_type];
 904
 905        return capable(CAP_SYS_RESOURCE) &&
 906            (info->dqi_format->qf_fmt_id != QFMT_VFS_OLD || !(info->dqi_flags & V1_DQF_RSQUASH));
 907}
 908
 909/* needs dq_data_lock */
 910static int check_idq(struct dquot *dquot, ulong inodes, char *warntype)
 911{
 912        *warntype = NOWARN;
 913        if (inodes <= 0 || test_bit(DQ_FAKE_B, &dquot->dq_flags))
 914                return QUOTA_OK;
 915
 916        if (dquot->dq_dqb.dqb_ihardlimit &&
 917           (dquot->dq_dqb.dqb_curinodes + inodes) > dquot->dq_dqb.dqb_ihardlimit &&
 918            !ignore_hardlimit(dquot)) {
 919                *warntype = IHARDWARN;
 920                return NO_QUOTA;
 921        }
 922
 923        if (dquot->dq_dqb.dqb_isoftlimit &&
 924           (dquot->dq_dqb.dqb_curinodes + inodes) > dquot->dq_dqb.dqb_isoftlimit &&
 925            dquot->dq_dqb.dqb_itime && get_seconds() >= dquot->dq_dqb.dqb_itime &&
 926            !ignore_hardlimit(dquot)) {
 927                *warntype = ISOFTLONGWARN;
 928                return NO_QUOTA;
 929        }
 930
 931        if (dquot->dq_dqb.dqb_isoftlimit &&
 932           (dquot->dq_dqb.dqb_curinodes + inodes) > dquot->dq_dqb.dqb_isoftlimit &&
 933            dquot->dq_dqb.dqb_itime == 0) {
 934                *warntype = ISOFTWARN;
 935                dquot->dq_dqb.dqb_itime = get_seconds() + sb_dqopt(dquot->dq_sb)->info[dquot->dq_type].dqi_igrace;
 936        }
 937
 938        return QUOTA_OK;
 939}
 940
 941/* needs dq_data_lock */
 942static int check_bdq(struct dquot *dquot, qsize_t space, int prealloc, char *warntype)
 943{
 944        *warntype = 0;
 945        if (space <= 0 || test_bit(DQ_FAKE_B, &dquot->dq_flags))
 946                return QUOTA_OK;
 947
 948        if (dquot->dq_dqb.dqb_bhardlimit &&
 949           toqb(dquot->dq_dqb.dqb_curspace + space) > dquot->dq_dqb.dqb_bhardlimit &&
 950            !ignore_hardlimit(dquot)) {
 951                if (!prealloc)
 952                        *warntype = BHARDWARN;
 953                return NO_QUOTA;
 954        }
 955
 956        if (dquot->dq_dqb.dqb_bsoftlimit &&
 957           toqb(dquot->dq_dqb.dqb_curspace + space) > dquot->dq_dqb.dqb_bsoftlimit &&
 958            dquot->dq_dqb.dqb_btime && get_seconds() >= dquot->dq_dqb.dqb_btime &&
 959            !ignore_hardlimit(dquot)) {
 960                if (!prealloc)
 961                        *warntype = BSOFTLONGWARN;
 962                return NO_QUOTA;
 963        }
 964
 965        if (dquot->dq_dqb.dqb_bsoftlimit &&
 966           toqb(dquot->dq_dqb.dqb_curspace + space) > dquot->dq_dqb.dqb_bsoftlimit &&
 967            dquot->dq_dqb.dqb_btime == 0) {
 968                if (!prealloc) {
 969                        *warntype = BSOFTWARN;
 970                        dquot->dq_dqb.dqb_btime = get_seconds() + sb_dqopt(dquot->dq_sb)->info[dquot->dq_type].dqi_bgrace;
 971                }
 972                else
 973                        /*
 974                         * We don't allow preallocation to exceed softlimit so exceeding will
 975                         * be always printed
 976                         */
 977                        return NO_QUOTA;
 978        }
 979
 980        return QUOTA_OK;
 981}
 982
 983/*
 984 *      Initialize quota pointers in inode
 985 *      Transaction must be started at entry
 986 */
 987int dquot_initialize(struct inode *inode, int type)
 988{
 989        unsigned int id = 0;
 990        int cnt, ret = 0;
 991
 992        /* First test before acquiring mutex - solves deadlocks when we
 993         * re-enter the quota code and are already holding the mutex */
 994        if (IS_NOQUOTA(inode))
 995                return 0;
 996        down_write(&sb_dqopt(inode->i_sb)->dqptr_sem);
 997        /* Having dqptr_sem we know NOQUOTA flags can't be altered... */
 998        if (IS_NOQUOTA(inode))
 999                goto out_err;
1000        for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1001                if (type != -1 && cnt != type)
1002                        continue;
1003                if (inode->i_dquot[cnt] == NODQUOT) {
1004                        switch (cnt) {
1005                                case USRQUOTA:
1006                                        id = inode->i_uid;
1007                                        break;
1008                                case GRPQUOTA:
1009                                        id = inode->i_gid;
1010                                        break;
1011                        }
1012                        inode->i_dquot[cnt] = dqget(inode->i_sb, id, cnt);
1013                }
1014        }
1015out_err:
1016        up_write(&sb_dqopt(inode->i_sb)->dqptr_sem);
1017        return ret;
1018}
1019
1020/*
1021 *      Release all quotas referenced by inode
1022 *      Transaction must be started at an entry
1023 */
1024int dquot_drop(struct inode *inode)
1025{
1026        int cnt;
1027
1028        down_write(&sb_dqopt(inode->i_sb)->dqptr_sem);
1029        for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1030                if (inode->i_dquot[cnt] != NODQUOT) {
1031                        dqput(inode->i_dquot[cnt]);
1032                        inode->i_dquot[cnt] = NODQUOT;
1033                }
1034        }
1035        up_write(&sb_dqopt(inode->i_sb)->dqptr_sem);
1036        return 0;
1037}
1038
1039/*
1040 * Following four functions update i_blocks+i_bytes fields and
1041 * quota information (together with appropriate checks)
1042 * NOTE: We absolutely rely on the fact that caller dirties
1043 * the inode (usually macros in quotaops.h care about this) and
1044 * holds a handle for the current transaction so that dquot write and
1045 * inode write go into the same transaction.
1046 */
1047
1048/*
1049 * This operation can block, but only after everything is updated
1050 */
1051int dquot_alloc_space(struct inode *inode, qsize_t number, int warn)
1052{
1053        int cnt, ret = NO_QUOTA;
1054        char warntype[MAXQUOTAS];
1055
1056        /* First test before acquiring mutex - solves deadlocks when we
1057         * re-enter the quota code and are already holding the mutex */
1058        if (IS_NOQUOTA(inode)) {
1059out_add:
1060                inode_add_bytes(inode, number);
1061                return QUOTA_OK;
1062        }
1063        for (cnt = 0; cnt < MAXQUOTAS; cnt++)
1064                warntype[cnt] = NOWARN;
1065
1066        down_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
1067        if (IS_NOQUOTA(inode)) {        /* Now we can do reliable test... */
1068                up_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
1069                goto out_add;
1070        }
1071        spin_lock(&dq_data_lock);
1072        for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1073                if (inode->i_dquot[cnt] == NODQUOT)
1074                        continue;
1075                if (check_bdq(inode->i_dquot[cnt], number, warn, warntype+cnt) == NO_QUOTA)
1076                        goto warn_put_all;
1077        }
1078        for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1079                if (inode->i_dquot[cnt] == NODQUOT)
1080                        continue;
1081                dquot_incr_space(inode->i_dquot[cnt], number);
1082        }
1083        inode_add_bytes(inode, number);
1084        ret = QUOTA_OK;
1085warn_put_all:
1086        spin_unlock(&dq_data_lock);
1087        if (ret == QUOTA_OK)
1088                /* Dirtify all the dquots - this can block when journalling */
1089                for (cnt = 0; cnt < MAXQUOTAS; cnt++)
1090                        if (inode->i_dquot[cnt])
1091                                mark_dquot_dirty(inode->i_dquot[cnt]);
1092        flush_warnings(inode->i_dquot, warntype);
1093        up_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
1094        return ret;
1095}
1096
1097/*
1098 * This operation can block, but only after everything is updated
1099 */
1100int dquot_alloc_inode(const struct inode *inode, unsigned long number)
1101{
1102        int cnt, ret = NO_QUOTA;
1103        char warntype[MAXQUOTAS];
1104
1105        /* First test before acquiring mutex - solves deadlocks when we
1106         * re-enter the quota code and are already holding the mutex */
1107        if (IS_NOQUOTA(inode))
1108                return QUOTA_OK;
1109        for (cnt = 0; cnt < MAXQUOTAS; cnt++)
1110                warntype[cnt] = NOWARN;
1111        down_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
1112        if (IS_NOQUOTA(inode)) {
1113                up_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
1114                return QUOTA_OK;
1115        }
1116        spin_lock(&dq_data_lock);
1117        for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1118                if (inode->i_dquot[cnt] == NODQUOT)
1119                        continue;
1120                if (check_idq(inode->i_dquot[cnt], number, warntype+cnt) == NO_QUOTA)
1121                        goto warn_put_all;
1122        }
1123
1124        for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1125                if (inode->i_dquot[cnt] == NODQUOT)
1126                        continue;
1127                dquot_incr_inodes(inode->i_dquot[cnt], number);
1128        }
1129        ret = QUOTA_OK;
1130warn_put_all:
1131        spin_unlock(&dq_data_lock);
1132        if (ret == QUOTA_OK)
1133                /* Dirtify all the dquots - this can block when journalling */
1134                for (cnt = 0; cnt < MAXQUOTAS; cnt++)
1135                        if (inode->i_dquot[cnt])
1136                                mark_dquot_dirty(inode->i_dquot[cnt]);
1137        flush_warnings((struct dquot **)inode->i_dquot, warntype);
1138        up_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
1139        return ret;
1140}
1141
1142/*
1143 * This operation can block, but only after everything is updated
1144 */
1145int dquot_free_space(struct inode *inode, qsize_t number)
1146{
1147        unsigned int cnt;
1148
1149        /* First test before acquiring mutex - solves deadlocks when we
1150         * re-enter the quota code and are already holding the mutex */
1151        if (IS_NOQUOTA(inode)) {
1152out_sub:
1153                inode_sub_bytes(inode, number);
1154                return QUOTA_OK;
1155        }
1156        down_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
1157        /* Now recheck reliably when holding dqptr_sem */
1158        if (IS_NOQUOTA(inode)) {
1159                up_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
1160                goto out_sub;
1161        }
1162        spin_lock(&dq_data_lock);
1163        for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1164                if (inode->i_dquot[cnt] == NODQUOT)
1165                        continue;
1166                dquot_decr_space(inode->i_dquot[cnt], number);
1167        }
1168        inode_sub_bytes(inode, number);
1169        spin_unlock(&dq_data_lock);
1170        /* Dirtify all the dquots - this can block when journalling */
1171        for (cnt = 0; cnt < MAXQUOTAS; cnt++)
1172                if (inode->i_dquot[cnt])
1173                        mark_dquot_dirty(inode->i_dquot[cnt]);
1174        up_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
1175        return QUOTA_OK;
1176}
1177
1178/*
1179 * This operation can block, but only after everything is updated
1180 */
1181int dquot_free_inode(const struct inode *inode, unsigned long number)
1182{
1183        unsigned int cnt;
1184
1185        /* First test before acquiring mutex - solves deadlocks when we
1186         * re-enter the quota code and are already holding the mutex */
1187        if (IS_NOQUOTA(inode))
1188                return QUOTA_OK;
1189        down_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
1190        /* Now recheck reliably when holding dqptr_sem */
1191        if (IS_NOQUOTA(inode)) {
1192                up_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
1193                return QUOTA_OK;
1194        }
1195        spin_lock(&dq_data_lock);
1196        for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1197                if (inode->i_dquot[cnt] == NODQUOT)
1198                        continue;
1199                dquot_decr_inodes(inode->i_dquot[cnt], number);
1200        }
1201        spin_unlock(&dq_data_lock);
1202        /* Dirtify all the dquots - this can block when journalling */
1203        for (cnt = 0; cnt < MAXQUOTAS; cnt++)
1204                if (inode->i_dquot[cnt])
1205                        mark_dquot_dirty(inode->i_dquot[cnt]);
1206        up_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
1207        return QUOTA_OK;
1208}
1209
1210/*
1211 * Transfer the number of inode and blocks from one diskquota to an other.
1212 *
1213 * This operation can block, but only after everything is updated
1214 * A transaction must be started when entering this function.
1215 */
1216int dquot_transfer(struct inode *inode, struct iattr *iattr)
1217{
1218        qsize_t space;
1219        struct dquot *transfer_from[MAXQUOTAS];
1220        struct dquot *transfer_to[MAXQUOTAS];
1221        int cnt, ret = NO_QUOTA, chuid = (iattr->ia_valid & ATTR_UID) && inode->i_uid != iattr->ia_uid,
1222            chgid = (iattr->ia_valid & ATTR_GID) && inode->i_gid != iattr->ia_gid;
1223        char warntype[MAXQUOTAS];
1224
1225        /* First test before acquiring mutex - solves deadlocks when we
1226         * re-enter the quota code and are already holding the mutex */
1227        if (IS_NOQUOTA(inode))
1228                return QUOTA_OK;
1229        /* Clear the arrays */
1230        for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1231                transfer_to[cnt] = transfer_from[cnt] = NODQUOT;
1232                warntype[cnt] = NOWARN;
1233        }
1234        down_write(&sb_dqopt(inode->i_sb)->dqptr_sem);
1235        /* Now recheck reliably when holding dqptr_sem */
1236        if (IS_NOQUOTA(inode)) {        /* File without quota accounting? */
1237                up_write(&sb_dqopt(inode->i_sb)->dqptr_sem);
1238                return QUOTA_OK;
1239        }
1240        /* First build the transfer_to list - here we can block on
1241         * reading/instantiating of dquots.  We know that the transaction for
1242         * us was already started so we don't violate lock ranking here */
1243        for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1244                switch (cnt) {
1245                        case USRQUOTA:
1246                                if (!chuid)
1247                                        continue;
1248                                transfer_to[cnt] = dqget(inode->i_sb, iattr->ia_uid, cnt);
1249                                break;
1250                        case GRPQUOTA:
1251                                if (!chgid)
1252                                        continue;
1253                                transfer_to[cnt] = dqget(inode->i_sb, iattr->ia_gid, cnt);
1254                                break;
1255                }
1256        }
1257        spin_lock(&dq_data_lock);
1258        space = inode_get_bytes(inode);
1259        /* Build the transfer_from list and check the limits */
1260        for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1261                if (transfer_to[cnt] == NODQUOT)
1262                        continue;
1263                transfer_from[cnt] = inode->i_dquot[cnt];
1264                if (check_idq(transfer_to[cnt], 1, warntype+cnt) == NO_QUOTA ||
1265                    check_bdq(transfer_to[cnt], space, 0, warntype+cnt) == NO_QUOTA)
1266                        goto warn_put_all;
1267        }
1268
1269        /*
1270         * Finally perform the needed transfer from transfer_from to transfer_to
1271         */
1272        for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1273                /*
1274                 * Skip changes for same uid or gid or for turned off quota-type.
1275                 */
1276                if (transfer_to[cnt] == NODQUOT)
1277                        continue;
1278
1279                /* Due to IO error we might not have transfer_from[] structure */
1280                if (transfer_from[cnt]) {
1281                        dquot_decr_inodes(transfer_from[cnt], 1);
1282                        dquot_decr_space(transfer_from[cnt], space);
1283                }
1284
1285                dquot_incr_inodes(transfer_to[cnt], 1);
1286                dquot_incr_space(transfer_to[cnt], space);
1287
1288                inode->i_dquot[cnt] = transfer_to[cnt];
1289        }
1290        ret = QUOTA_OK;
1291warn_put_all:
1292        spin_unlock(&dq_data_lock);
1293        /* Dirtify all the dquots - this can block when journalling */
1294        for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1295                if (transfer_from[cnt])
1296                        mark_dquot_dirty(transfer_from[cnt]);
1297                if (transfer_to[cnt])
1298                        mark_dquot_dirty(transfer_to[cnt]);
1299        }
1300        flush_warnings(transfer_to, warntype);
1301        
1302        for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1303                if (ret == QUOTA_OK && transfer_from[cnt] != NODQUOT)
1304                        dqput(transfer_from[cnt]);
1305                if (ret == NO_QUOTA && transfer_to[cnt] != NODQUOT)
1306                        dqput(transfer_to[cnt]);
1307        }
1308        up_write(&sb_dqopt(inode->i_sb)->dqptr_sem);
1309        return ret;
1310}
1311
1312/*
1313 * Write info of quota file to disk
1314 */
1315int dquot_commit_info(struct super_block *sb, int type)
1316{
1317        int ret;
1318        struct quota_info *dqopt = sb_dqopt(sb);
1319
1320        mutex_lock(&dqopt->dqio_mutex);
1321        ret = dqopt->ops[type]->write_file_info(sb, type);
1322        mutex_unlock(&dqopt->dqio_mutex);
1323        return ret;
1324}
1325
1326/*
1327 * Definitions of diskquota operations.
1328 */
1329struct dquot_operations dquot_operations = {
1330        .initialize     = dquot_initialize,
1331        .drop           = dquot_drop,
1332        .alloc_space    = dquot_alloc_space,
1333        .alloc_inode    = dquot_alloc_inode,
1334        .free_space     = dquot_free_space,
1335        .free_inode     = dquot_free_inode,
1336        .transfer       = dquot_transfer,
1337        .write_dquot    = dquot_commit,
1338        .acquire_dquot  = dquot_acquire,
1339        .release_dquot  = dquot_release,
1340        .mark_dirty     = dquot_mark_dquot_dirty,
1341        .write_info     = dquot_commit_info
1342};
1343
1344static inline void set_enable_flags(struct quota_info *dqopt, int type)
1345{
1346        switch (type) {
1347                case USRQUOTA:
1348                        dqopt->flags |= DQUOT_USR_ENABLED;
1349                        break;
1350                case GRPQUOTA:
1351                        dqopt->flags |= DQUOT_GRP_ENABLED;
1352                        break;
1353        }
1354}
1355
1356static inline void reset_enable_flags(struct quota_info *dqopt, int type)
1357{
1358        switch (type) {
1359                case USRQUOTA:
1360                        dqopt->flags &= ~DQUOT_USR_ENABLED;
1361                        break;
1362                case GRPQUOTA:
1363                        dqopt->flags &= ~DQUOT_GRP_ENABLED;
1364                        break;
1365        }
1366}
1367
1368/*
1369 * Turn quota off on a device. type == -1 ==> quotaoff for all types (umount)
1370 */
1371int vfs_quota_off(struct super_block *sb, int type)
1372{
1373        int cnt;
1374        struct quota_info *dqopt = sb_dqopt(sb);
1375        struct inode *toputinode[MAXQUOTAS];
1376
1377        /* We need to serialize quota_off() for device */
1378        mutex_lock(&dqopt->dqonoff_mutex);
1379        for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1380                toputinode[cnt] = NULL;
1381                if (type != -1 && cnt != type)
1382                        continue;
1383                if (!sb_has_quota_enabled(sb, cnt))
1384                        continue;
1385                reset_enable_flags(dqopt, cnt);
1386
1387                /* Note: these are blocking operations */
1388                drop_dquot_ref(sb, cnt);
1389                invalidate_dquots(sb, cnt);
1390                /*
1391                 * Now all dquots should be invalidated, all writes done so we should be only
1392                 * users of the info. No locks needed.
1393                 */
1394                if (info_dirty(&dqopt->info[cnt]))
1395                        sb->dq_op->write_info(sb, cnt);
1396                if (dqopt->ops[cnt]->free_file_info)
1397                        dqopt->ops[cnt]->free_file_info(sb, cnt);
1398                put_quota_format(dqopt->info[cnt].dqi_format);
1399
1400                toputinode[cnt] = dqopt->files[cnt];
1401                dqopt->files[cnt] = NULL;
1402                dqopt->info[cnt].dqi_flags = 0;
1403                dqopt->info[cnt].dqi_igrace = 0;
1404                dqopt->info[cnt].dqi_bgrace = 0;
1405                dqopt->ops[cnt] = NULL;
1406        }
1407        mutex_unlock(&dqopt->dqonoff_mutex);
1408        /* Sync the superblock so that buffers with quota data are written to
1409         * disk (and so userspace sees correct data afterwards). */
1410        if (sb->s_op->sync_fs)
1411                sb->s_op->sync_fs(sb, 1);
1412        sync_blockdev(sb->s_bdev);
1413        /* Now the quota files are just ordinary files and we can set the
1414         * inode flags back. Moreover we discard the pagecache so that
1415         * userspace sees the writes we did bypassing the pagecache. We
1416         * must also discard the blockdev buffers so that we see the
1417         * changes done by userspace on the next quotaon() */
1418        for (cnt = 0; cnt < MAXQUOTAS; cnt++)
1419                if (toputinode[cnt]) {
1420                        mutex_lock(&dqopt->dqonoff_mutex);
1421                        /* If quota was reenabled in the meantime, we have
1422                         * nothing to do */
1423                        if (!sb_has_quota_enabled(sb, cnt)) {
1424                                mutex_lock_nested(&toputinode[cnt]->i_mutex, I_MUTEX_QUOTA);
1425                                toputinode[cnt]->i_flags &= ~(S_IMMUTABLE |
1426                                  S_NOATIME | S_NOQUOTA);
1427                                truncate_inode_pages(&toputinode[cnt]->i_data, 0);
1428                                mutex_unlock(&toputinode[cnt]->i_mutex);
1429                                mark_inode_dirty(toputinode[cnt]);
1430                                iput(toputinode[cnt]);
1431                        }
1432                        mutex_unlock(&dqopt->dqonoff_mutex);
1433                }
1434        if (sb->s_bdev)
1435                invalidate_bdev(sb->s_bdev);
1436        return 0;
1437}
1438
1439/*
1440 *      Turn quotas on on a device
1441 */
1442
1443/* Helper function when we already have the inode */
1444static int vfs_quota_on_inode(struct inode *inode, int type, int format_id)
1445{
1446        struct quota_format_type *fmt = find_quota_format(format_id);
1447        struct super_block *sb = inode->i_sb;
1448        struct quota_info *dqopt = sb_dqopt(sb);
1449        int error;
1450        int oldflags = -1;
1451
1452        if (!fmt)
1453                return -ESRCH;
1454        if (!S_ISREG(inode->i_mode)) {
1455                error = -EACCES;
1456                goto out_fmt;
1457        }
1458        if (IS_RDONLY(inode)) {
1459                error = -EROFS;
1460                goto out_fmt;
1461        }
1462        if (!sb->s_op->quota_write || !sb->s_op->quota_read) {
1463                error = -EINVAL;
1464                goto out_fmt;
1465        }
1466
1467        /* As we bypass the pagecache we must now flush the inode so that
1468         * we see all the changes from userspace... */
1469        write_inode_now(inode, 1);
1470        /* And now flush the block cache so that kernel sees the changes */
1471        invalidate_bdev(sb->s_bdev);
1472        mutex_lock(&inode->i_mutex);
1473        mutex_lock(&dqopt->dqonoff_mutex);
1474        if (sb_has_quota_enabled(sb, type)) {
1475                error = -EBUSY;
1476                goto out_lock;
1477        }
1478        /* We don't want quota and atime on quota files (deadlocks possible)
1479         * Also nobody should write to the file - we use special IO operations
1480         * which ignore the immutable bit. */
1481        down_write(&dqopt->dqptr_sem);
1482        oldflags = inode->i_flags & (S_NOATIME | S_IMMUTABLE | S_NOQUOTA);
1483        inode->i_flags |= S_NOQUOTA | S_NOATIME | S_IMMUTABLE;
1484        up_write(&dqopt->dqptr_sem);
1485        sb->dq_op->drop(inode);
1486
1487        error = -EIO;
1488        dqopt->files[type] = igrab(inode);
1489        if (!dqopt->files[type])
1490                goto out_lock;
1491        error = -EINVAL;
1492        if (!fmt->qf_ops->check_quota_file(sb, type))
1493                goto out_file_init;
1494
1495        dqopt->ops[type] = fmt->qf_ops;
1496        dqopt->info[type].dqi_format = fmt;
1497        INIT_LIST_HEAD(&dqopt->info[type].dqi_dirty_list);
1498        mutex_lock(&dqopt->dqio_mutex);
1499        if ((error = dqopt->ops[type]->read_file_info(sb, type)) < 0) {
1500                mutex_unlock(&dqopt->dqio_mutex);
1501                goto out_file_init;
1502        }
1503        mutex_unlock(&dqopt->dqio_mutex);
1504        mutex_unlock(&inode->i_mutex);
1505        set_enable_flags(dqopt, type);
1506
1507        add_dquot_ref(sb, type);
1508        mutex_unlock(&dqopt->dqonoff_mutex);
1509
1510        return 0;
1511
1512out_file_init:
1513        dqopt->files[type] = NULL;
1514        iput(inode);
1515out_lock:
1516        mutex_unlock(&dqopt->dqonoff_mutex);
1517        if (oldflags != -1) {
1518                down_write(&dqopt->dqptr_sem);
1519                /* Set the flags back (in the case of accidental quotaon()
1520                 * on a wrong file we don't want to mess up the flags) */
1521                inode->i_flags &= ~(S_NOATIME | S_NOQUOTA | S_IMMUTABLE);
1522                inode->i_flags |= oldflags;
1523                up_write(&dqopt->dqptr_sem);
1524        }
1525        mutex_unlock(&inode->i_mutex);
1526out_fmt:
1527        put_quota_format(fmt);
1528
1529        return error; 
1530}
1531
1532/* Actual function called from quotactl() */
1533int vfs_quota_on(struct super_block *sb, int type, int format_id, char *path)
1534{
1535        struct nameidata nd;
1536        int error;
1537
1538        error = path_lookup(path, LOOKUP_FOLLOW, &nd);
1539        if (error < 0)
1540                return error;
1541        error = security_quota_on(nd.dentry);
1542        if (error)
1543                goto out_path;
1544        /* Quota file not on the same filesystem? */
1545        if (nd.mnt->mnt_sb != sb)
1546                error = -EXDEV;
1547        else
1548                error = vfs_quota_on_inode(nd.dentry->d_inode, type, format_id);
1549out_path:
1550        path_release(&nd);
1551        return error;
1552}
1553
1554/*
1555 * This function is used when filesystem needs to initialize quotas
1556 * during mount time.
1557 */
1558int vfs_quota_on_mount(struct super_block *sb, char *qf_name,
1559                int format_id, int type)
1560{
1561        struct dentry *dentry;
1562        int error;
1563
1564        dentry = lookup_one_len(qf_name, sb->s_root, strlen(qf_name));
1565        if (IS_ERR(dentry))
1566                return PTR_ERR(dentry);
1567
1568        if (!dentry->d_inode) {
1569                error = -ENOENT;
1570                goto out;
1571        }
1572
1573        error = security_quota_on(dentry);
1574        if (!error)
1575                error = vfs_quota_on_inode(dentry->d_inode, type, format_id);
1576
1577out:
1578        dput(dentry);
1579        return error;
1580}
1581
1582/* Generic routine for getting common part of quota structure */
1583static void do_get_dqblk(struct dquot *dquot, struct if_dqblk *di)
1584{
1585        struct mem_dqblk *dm = &dquot->dq_dqb;
1586
1587        spin_lock(&dq_data_lock);
1588        di->dqb_bhardlimit = dm->dqb_bhardlimit;
1589        di->dqb_bsoftlimit = dm->dqb_bsoftlimit;
1590        di->dqb_curspace = dm->dqb_curspace;
1591        di->dqb_ihardlimit = dm->dqb_ihardlimit;
1592        di->dqb_isoftlimit = dm->dqb_isoftlimit;
1593        di->dqb_curinodes = dm->dqb_curinodes;
1594        di->dqb_btime = dm->dqb_btime;
1595        di->dqb_itime = dm->dqb_itime;
1596        di->dqb_valid = QIF_ALL;
1597        spin_unlock(&dq_data_lock);
1598}
1599
1600int vfs_get_dqblk(struct super_block *sb, int type, qid_t id, struct if_dqblk *di)
1601{
1602        struct dquot *dquot;
1603
1604        mutex_lock(&sb_dqopt(sb)->dqonoff_mutex);
1605        if (!(dquot = dqget(sb, id, type))) {
1606                mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex);
1607                return -ESRCH;
1608        }
1609        do_get_dqblk(dquot, di);
1610        dqput(dquot);
1611        mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex);
1612        return 0;
1613}
1614
1615/* Generic routine for setting common part of quota structure */
1616static void do_set_dqblk(struct dquot *dquot, struct if_dqblk *di)
1617{
1618        struct mem_dqblk *dm = &dquot->dq_dqb;
1619        int check_blim = 0, check_ilim = 0;
1620
1621        spin_lock(&dq_data_lock);
1622        if (di->dqb_valid & QIF_SPACE) {
1623                dm->dqb_curspace = di->dqb_curspace;
1624                check_blim = 1;
1625        }
1626        if (di->dqb_valid & QIF_BLIMITS) {
1627                dm->dqb_bsoftlimit = di->dqb_bsoftlimit;
1628                dm->dqb_bhardlimit = di->dqb_bhardlimit;
1629                check_blim = 1;
1630        }
1631        if (di->dqb_valid & QIF_INODES) {
1632                dm->dqb_curinodes = di->dqb_curinodes;
1633                check_ilim = 1;
1634        }
1635        if (di->dqb_valid & QIF_ILIMITS) {
1636                dm->dqb_isoftlimit = di->dqb_isoftlimit;
1637                dm->dqb_ihardlimit = di->dqb_ihardlimit;
1638                check_ilim = 1;
1639        }
1640        if (di->dqb_valid & QIF_BTIME)
1641                dm->dqb_btime = di->dqb_btime;
1642        if (di->dqb_valid & QIF_ITIME)
1643                dm->dqb_itime = di->dqb_itime;
1644
1645        if (check_blim) {
1646                if (!dm->dqb_bsoftlimit || toqb(dm->dqb_curspace) < dm->dqb_bsoftlimit) {
1647                        dm->dqb_btime = 0;
1648                        clear_bit(DQ_BLKS_B, &dquot->dq_flags);
1649                }
1650                else if (!(di->dqb_valid & QIF_BTIME))  /* Set grace only if user hasn't provided his own... */
1651                        dm->dqb_btime = get_seconds() + sb_dqopt(dquot->dq_sb)->info[dquot->dq_type].dqi_bgrace;
1652        }
1653        if (check_ilim) {
1654                if (!dm->dqb_isoftlimit || dm->dqb_curinodes < dm->dqb_isoftlimit) {
1655                        dm->dqb_itime = 0;
1656                        clear_bit(DQ_INODES_B, &dquot->dq_flags);
1657                }
1658                else if (!(di->dqb_valid & QIF_ITIME))  /* Set grace only if user hasn't provided his own... */
1659                        dm->dqb_itime = get_seconds() + sb_dqopt(dquot->dq_sb)->info[dquot->dq_type].dqi_igrace;
1660        }
1661        if (dm->dqb_bhardlimit || dm->dqb_bsoftlimit || dm->dqb_ihardlimit || dm->dqb_isoftlimit)
1662                clear_bit(DQ_FAKE_B, &dquot->dq_flags);
1663        else
1664                set_bit(DQ_FAKE_B, &dquot->dq_flags);
1665        spin_unlock(&dq_data_lock);
1666        mark_dquot_dirty(dquot);
1667}
1668
1669int vfs_set_dqblk(struct super_block *sb, int type, qid_t id, struct if_dqblk *di)
1670{
1671        struct dquot *dquot;
1672
1673        mutex_lock(&sb_dqopt(sb)->dqonoff_mutex);
1674        if (!(dquot = dqget(sb, id, type))) {
1675                mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex);
1676                return -ESRCH;
1677        }
1678        do_set_dqblk(dquot, di);
1679        dqput(dquot);
1680        mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex);
1681        return 0;
1682}
1683
1684/* Generic routine for getting common part of quota file information */
1685int vfs_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii)
1686{
1687        struct mem_dqinfo *mi;
1688  
1689        mutex_lock(&sb_dqopt(sb)->dqonoff_mutex);
1690        if (!sb_has_quota_enabled(sb, type)) {
1691                mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex);
1692                return -ESRCH;
1693        }
1694        mi = sb_dqopt(sb)->info + type;
1695        spin_lock(&dq_data_lock);
1696        ii->dqi_bgrace = mi->dqi_bgrace;
1697        ii->dqi_igrace = mi->dqi_igrace;
1698        ii->dqi_flags = mi->dqi_flags & DQF_MASK;
1699        ii->dqi_valid = IIF_ALL;
1700        spin_unlock(&dq_data_lock);
1701        mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex);
1702        return 0;
1703}
1704
1705/* Generic routine for setting common part of quota file information */
1706int vfs_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii)
1707{
1708        struct mem_dqinfo *mi;
1709
1710        mutex_lock(&sb_dqopt(sb)->dqonoff_mutex);
1711        if (!sb_has_quota_enabled(sb, type)) {
1712                mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex);
1713                return -ESRCH;
1714        }
1715        mi = sb_dqopt(sb)->info + type;
1716        spin_lock(&dq_data_lock);
1717        if (ii->dqi_valid & IIF_BGRACE)
1718                mi->dqi_bgrace = ii->dqi_bgrace;
1719        if (ii->dqi_valid & IIF_IGRACE)
1720                mi->dqi_igrace = ii->dqi_igrace;
1721        if (ii->dqi_valid & IIF_FLAGS)
1722                mi->dqi_flags = (mi->dqi_flags & ~DQF_MASK) | (ii->dqi_flags & DQF_MASK);
1723        spin_unlock(&dq_data_lock);
1724        mark_info_dirty(sb, type);
1725        /* Force write to disk */
1726        sb->dq_op->write_info(sb, type);
1727        mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex);
1728        return 0;
1729}
1730
1731struct quotactl_ops vfs_quotactl_ops = {
1732        .quota_on       = vfs_quota_on,
1733        .quota_off      = vfs_quota_off,
1734        .quota_sync     = vfs_quota_sync,
1735        .get_info       = vfs_get_dqinfo,
1736        .set_info       = vfs_set_dqinfo,
1737        .get_dqblk      = vfs_get_dqblk,
1738        .set_dqblk      = vfs_set_dqblk
1739};
1740
1741static ctl_table fs_dqstats_table[] = {
1742        {
1743                .ctl_name       = FS_DQ_LOOKUPS,
1744                .procname       = "lookups",
1745                .data           = &dqstats.lookups,
1746                .maxlen         = sizeof(int),
1747                .mode           = 0444,
1748                .proc_handler   = &proc_dointvec,
1749        },
1750        {
1751                .ctl_name       = FS_DQ_DROPS,
1752                .procname       = "drops",
1753                .data           = &dqstats.drops,
1754                .maxlen         = sizeof(int),
1755                .mode           = 0444,
1756                .proc_handler   = &proc_dointvec,
1757        },
1758        {
1759                .ctl_name       = FS_DQ_READS,
1760                .procname       = "reads",
1761                .data           = &dqstats.reads,
1762                .maxlen         = sizeof(int),
1763                .mode           = 0444,
1764                .proc_handler   = &proc_dointvec,
1765        },
1766        {
1767                .ctl_name       = FS_DQ_WRITES,
1768                .procname       = "writes",
1769                .data           = &dqstats.writes,
1770                .maxlen         = sizeof(int),
1771                .mode           = 0444,
1772                .proc_handler   = &proc_dointvec,
1773        },
1774        {
1775                .ctl_name       = FS_DQ_CACHE_HITS,
1776                .procname       = "cache_hits",
1777                .data           = &dqstats.cache_hits,
1778                .maxlen         = sizeof(int),
1779                .mode           = 0444,
1780                .proc_handler   = &proc_dointvec,
1781        },
1782        {
1783                .ctl_name       = FS_DQ_ALLOCATED,
1784                .procname       = "allocated_dquots",
1785                .data           = &dqstats.allocated_dquots,
1786                .maxlen         = sizeof(int),
1787                .mode           = 0444,
1788                .proc_handler   = &proc_dointvec,
1789        },
1790        {
1791                .ctl_name       = FS_DQ_FREE,
1792                .procname       = "free_dquots",
1793                .data           = &dqstats.free_dquots,
1794                .maxlen         = sizeof(int),
1795                .mode           = 0444,
1796                .proc_handler   = &proc_dointvec,
1797        },
1798        {
1799                .ctl_name       = FS_DQ_SYNCS,
1800                .procname       = "syncs",
1801                .data           = &dqstats.syncs,
1802                .maxlen         = sizeof(int),
1803                .mode           = 0444,
1804                .proc_handler   = &proc_dointvec,
1805        },
1806        {
1807                .ctl_name       = FS_DQ_WARNINGS,
1808                .procname       = "warnings",
1809                .data           = &flag_print_warnings,
1810                .maxlen         = sizeof(int),
1811                .mode           = 0644,
1812                .proc_handler   = &proc_dointvec,
1813        },
1814        { .ctl_name = 0 },
1815};
1816
1817static ctl_table fs_table[] = {
1818        {
1819                .ctl_name       = FS_DQSTATS,
1820                .procname       = "quota",
1821                .mode           = 0555,
1822                .child          = fs_dqstats_table,
1823        },
1824        { .ctl_name = 0 },
1825};
1826
1827static ctl_table sys_table[] = {
1828        {
1829                .ctl_name       = CTL_FS,
1830                .procname       = "fs",
1831                .mode           = 0555,
1832                .child          = fs_table,
1833        },
1834        { .ctl_name = 0 },
1835};
1836
1837static int __init dquot_init(void)
1838{
1839        int i;
1840        unsigned long nr_hash, order;
1841
1842        printk(KERN_NOTICE "VFS: Disk quotas %s\n", __DQUOT_VERSION__);
1843
1844        register_sysctl_table(sys_table);
1845
1846        dquot_cachep = kmem_cache_create("dquot", 
1847                        sizeof(struct dquot), sizeof(unsigned long) * 4,
1848                        (SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT|
1849                                SLAB_MEM_SPREAD|SLAB_PANIC),
1850                        NULL, NULL);
1851
1852        order = 0;
1853        dquot_hash = (struct hlist_head *)__get_free_pages(GFP_ATOMIC, order);
1854        if (!dquot_hash)
1855                panic("Cannot create dquot hash table");
1856
1857        /* Find power-of-two hlist_heads which can fit into allocation */
1858        nr_hash = (1UL << order) * PAGE_SIZE / sizeof(struct hlist_head);
1859        dq_hash_bits = 0;
1860        do {
1861                dq_hash_bits++;
1862        } while (nr_hash >> dq_hash_bits);
1863        dq_hash_bits--;
1864
1865        nr_hash = 1UL << dq_hash_bits;
1866        dq_hash_mask = nr_hash - 1;
1867        for (i = 0; i < nr_hash; i++)
1868                INIT_HLIST_HEAD(dquot_hash + i);
1869
1870        printk("Dquot-cache hash table entries: %ld (order %ld, %ld bytes)\n",
1871                        nr_hash, order, (PAGE_SIZE << order));
1872
1873        set_shrinker(DEFAULT_SEEKS, shrink_dqcache_memory);
1874
1875        return 0;
1876}
1877module_init(dquot_init);
1878
1879EXPORT_SYMBOL(register_quota_format);
1880EXPORT_SYMBOL(unregister_quota_format);
1881EXPORT_SYMBOL(dqstats);
1882EXPORT_SYMBOL(dq_data_lock);
1883EXPORT_SYMBOL(vfs_quota_on);
1884EXPORT_SYMBOL(vfs_quota_on_mount);
1885EXPORT_SYMBOL(vfs_quota_off);
1886EXPORT_SYMBOL(vfs_quota_sync);
1887EXPORT_SYMBOL(vfs_get_dqinfo);
1888EXPORT_SYMBOL(vfs_set_dqinfo);
1889EXPORT_SYMBOL(vfs_get_dqblk);
1890EXPORT_SYMBOL(vfs_set_dqblk);
1891EXPORT_SYMBOL(dquot_commit);
1892EXPORT_SYMBOL(dquot_commit_info);
1893EXPORT_SYMBOL(dquot_acquire);
1894EXPORT_SYMBOL(dquot_release);
1895EXPORT_SYMBOL(dquot_mark_dquot_dirty);
1896EXPORT_SYMBOL(dquot_initialize);
1897EXPORT_SYMBOL(dquot_drop);
1898EXPORT_SYMBOL(dquot_alloc_space);
1899EXPORT_SYMBOL(dquot_alloc_inode);
1900EXPORT_SYMBOL(dquot_free_space);
1901EXPORT_SYMBOL(dquot_free_inode);
1902EXPORT_SYMBOL(dquot_transfer);
1903
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.