LCOV - code coverage report
Current view: top level - fs/quota - dquot.c (source / functions) Hit Total Coverage
Test: combined.info Lines: 108 1431 7.5 %
Date: 2022-03-28 16:04:14 Functions: 12 78 15.4 %
Branches: 41 931 4.4 %

           Branch data     Line data    Source code
       1                 :            : // SPDX-License-Identifier: GPL-2.0
       2                 :            : /*
       3                 :            :  * Implementation of the diskquota system for the LINUX operating system. QUOTA
       4                 :            :  * is implemented using the BSD system call interface as the means of
       5                 :            :  * communication with the user level. This file contains the generic routines
       6                 :            :  * called by the different filesystems on allocation of an inode or block.
       7                 :            :  * These routines take care of the administration needed to have a consistent
       8                 :            :  * diskquota tracking system. The ideas of both user and group quotas are based
       9                 :            :  * on the Melbourne quota system as used on BSD derived systems. The internal
      10                 :            :  * implementation is based on one of the several variants of the LINUX
      11                 :            :  * inode-subsystem with added complexity of the diskquota system.
      12                 :            :  *
      13                 :            :  * Author:      Marco van Wieringen <mvw@planets.elm.net>
      14                 :            :  *
      15                 :            :  * Fixes:   Dmitry Gorodchanin <pgmdsg@ibi.com>, 11 Feb 96
      16                 :            :  *
      17                 :            :  *              Revised list management to avoid races
      18                 :            :  *              -- Bill Hawes, <whawes@star.net>, 9/98
      19                 :            :  *
      20                 :            :  *              Fixed races in dquot_transfer(), dqget() and dquot_alloc_...().
      21                 :            :  *              As the consequence the locking was moved from dquot_decr_...(),
      22                 :            :  *              dquot_incr_...() to calling functions.
      23                 :            :  *              invalidate_dquots() now writes modified dquots.
      24                 :            :  *              Serialized quota_off() and quota_on() for mount point.
      25                 :            :  *              Fixed a few bugs in grow_dquots().
      26                 :            :  *              Fixed deadlock in write_dquot() - we no longer account quotas on
      27                 :            :  *              quota files
      28                 :            :  *              remove_dquot_ref() moved to inode.c - it now traverses through inodes
      29                 :            :  *              add_dquot_ref() restarts after blocking
      30                 :            :  *              Added check for bogus uid and fixed check for group in quotactl.
      31                 :            :  *              Jan Kara, <jack@suse.cz>, sponsored by SuSE CR, 10-11/99
      32                 :            :  *
      33                 :            :  *              Used struct list_head instead of own list struct
      34                 :            :  *              Invalidation of referenced dquots is no longer possible
      35                 :            :  *              Improved free_dquots list management
      36                 :            :  *              Quota and i_blocks are now updated in one place to avoid races
      37                 :            :  *              Warnings are now delayed so we won't block in critical section
      38                 :            :  *              Write updated not to require dquot lock
      39                 :            :  *              Jan Kara, <jack@suse.cz>, 9/2000
      40                 :            :  *
      41                 :            :  *              Added dynamic quota structure allocation
      42                 :            :  *              Jan Kara <jack@suse.cz> 12/2000
      43                 :            :  *
      44                 :            :  *              Rewritten quota interface. Implemented new quota format and
      45                 :            :  *              formats registering.
      46                 :            :  *              Jan Kara, <jack@suse.cz>, 2001,2002
      47                 :            :  *
      48                 :            :  *              New SMP locking.
      49                 :            :  *              Jan Kara, <jack@suse.cz>, 10/2002
      50                 :            :  *
      51                 :            :  *              Added journalled quota support, fix lock inversion problems
      52                 :            :  *              Jan Kara, <jack@suse.cz>, 2003,2004
      53                 :            :  *
      54                 :            :  * (C) Copyright 1994 - 1997 Marco van Wieringen
      55                 :            :  */
      56                 :            : 
      57                 :            : #include <linux/errno.h>
      58                 :            : #include <linux/kernel.h>
      59                 :            : #include <linux/fs.h>
      60                 :            : #include <linux/mount.h>
      61                 :            : #include <linux/mm.h>
      62                 :            : #include <linux/time.h>
      63                 :            : #include <linux/types.h>
      64                 :            : #include <linux/string.h>
      65                 :            : #include <linux/fcntl.h>
      66                 :            : #include <linux/stat.h>
      67                 :            : #include <linux/tty.h>
      68                 :            : #include <linux/file.h>
      69                 :            : #include <linux/slab.h>
      70                 :            : #include <linux/sysctl.h>
      71                 :            : #include <linux/init.h>
      72                 :            : #include <linux/module.h>
      73                 :            : #include <linux/proc_fs.h>
      74                 :            : #include <linux/security.h>
      75                 :            : #include <linux/sched.h>
      76                 :            : #include <linux/cred.h>
      77                 :            : #include <linux/kmod.h>
      78                 :            : #include <linux/namei.h>
      79                 :            : #include <linux/capability.h>
      80                 :            : #include <linux/quotaops.h>
      81                 :            : #include "../internal.h" /* ugh */
      82                 :            : 
      83                 :            : #include <linux/uaccess.h>
      84                 :            : 
      85                 :            : /*
      86                 :            :  * There are five quota SMP locks:
      87                 :            :  * * dq_list_lock protects all lists with quotas and quota formats.
      88                 :            :  * * dquot->dq_dqb_lock protects data from dq_dqb
      89                 :            :  * * inode->i_lock protects inode->i_blocks, i_bytes and also guards
      90                 :            :  *   consistency of dquot->dq_dqb with inode->i_blocks, i_bytes so that
      91                 :            :  *   dquot_transfer() can stabilize amount it transfers
      92                 :            :  * * dq_data_lock protects mem_dqinfo structures and modifications of dquot
      93                 :            :  *   pointers in the inode
      94                 :            :  * * dq_state_lock protects modifications of quota state (on quotaon and
      95                 :            :  *   quotaoff) and readers who care about latest values take it as well.
      96                 :            :  *
      97                 :            :  * The spinlock ordering is hence:
      98                 :            :  *   dq_data_lock > dq_list_lock > i_lock > dquot->dq_dqb_lock,
      99                 :            :  *   dq_list_lock > dq_state_lock
     100                 :            :  *
     101                 :            :  * Note that some things (eg. sb pointer, type, id) doesn't change during
     102                 :            :  * the life of the dquot structure and so needn't to be protected by a lock
     103                 :            :  *
     104                 :            :  * Operation accessing dquots via inode pointers are protected by dquot_srcu.
     105                 :            :  * Operation of reading pointer needs srcu_read_lock(&dquot_srcu), and
     106                 :            :  * synchronize_srcu(&dquot_srcu) is called after clearing pointers from
     107                 :            :  * inode and before dropping dquot references to avoid use of dquots after
     108                 :            :  * they are freed. dq_data_lock is used to serialize the pointer setting and
     109                 :            :  * clearing operations.
     110                 :            :  * Special care needs to be taken about S_NOQUOTA inode flag (marking that
     111                 :            :  * inode is a quota file). Functions adding pointers from inode to dquots have
     112                 :            :  * to check this flag under dq_data_lock and then (if S_NOQUOTA is not set) they
     113                 :            :  * have to do all pointer modifications before dropping dq_data_lock. This makes
     114                 :            :  * sure they cannot race with quotaon which first sets S_NOQUOTA flag and
     115                 :            :  * then drops all pointers to dquots from an inode.
     116                 :            :  *
     117                 :            :  * Each dquot has its dq_lock mutex.  Dquot is locked when it is being read to
     118                 :            :  * memory (or space for it is being allocated) on the first dqget(), when it is
     119                 :            :  * being written out, and when it is being released on the last dqput(). The
     120                 :            :  * allocation and release operations are serialized by the dq_lock and by
     121                 :            :  * checking the use count in dquot_release().
     122                 :            :  *
     123                 :            :  * Lock ordering (including related VFS locks) is the following:
     124                 :            :  *   s_umount > i_mutex > journal_lock > dquot->dq_lock > dqio_sem
     125                 :            :  */
     126                 :            : 
     127                 :            : static __cacheline_aligned_in_smp DEFINE_SPINLOCK(dq_list_lock);
     128                 :            : static __cacheline_aligned_in_smp DEFINE_SPINLOCK(dq_state_lock);
     129                 :            : __cacheline_aligned_in_smp DEFINE_SPINLOCK(dq_data_lock);
     130                 :            : EXPORT_SYMBOL(dq_data_lock);
     131                 :            : DEFINE_STATIC_SRCU(dquot_srcu);
     132                 :            : 
     133                 :            : static DECLARE_WAIT_QUEUE_HEAD(dquot_ref_wq);
     134                 :            : 
     135                 :          0 : void __quota_error(struct super_block *sb, const char *func,
     136                 :            :                    const char *fmt, ...)
     137                 :            : {
     138         [ #  # ]:          0 :         if (printk_ratelimit()) {
     139                 :          0 :                 va_list args;
     140                 :          0 :                 struct va_format vaf;
     141                 :            : 
     142                 :          0 :                 va_start(args, fmt);
     143                 :            : 
     144                 :          0 :                 vaf.fmt = fmt;
     145                 :          0 :                 vaf.va = &args;
     146                 :            : 
     147                 :          0 :                 printk(KERN_ERR "Quota error (device %s): %s: %pV\n",
     148                 :          0 :                        sb->s_id, func, &vaf);
     149                 :            : 
     150                 :          0 :                 va_end(args);
     151                 :            :         }
     152                 :          0 : }
     153                 :            : EXPORT_SYMBOL(__quota_error);
     154                 :            : 
     155                 :            : #if defined(CONFIG_QUOTA_DEBUG) || defined(CONFIG_PRINT_QUOTA_WARNING)
     156                 :            : static char *quotatypes[] = INITQFNAMES;
     157                 :            : #endif
     158                 :            : static struct quota_format_type *quota_formats; /* List of registered formats */
     159                 :            : static struct quota_module_name module_names[] = INIT_QUOTA_MODULE_NAMES;
     160                 :            : 
     161                 :            : /* SLAB cache for dquot structures */
     162                 :            : static struct kmem_cache *dquot_cachep;
     163                 :            : 
     164                 :         26 : int register_quota_format(struct quota_format_type *fmt)
     165                 :            : {
     166                 :         26 :         spin_lock(&dq_list_lock);
     167                 :         26 :         fmt->qf_next = quota_formats;
     168                 :         26 :         quota_formats = fmt;
     169                 :         26 :         spin_unlock(&dq_list_lock);
     170                 :         26 :         return 0;
     171                 :            : }
     172                 :            : EXPORT_SYMBOL(register_quota_format);
     173                 :            : 
     174                 :          0 : void unregister_quota_format(struct quota_format_type *fmt)
     175                 :            : {
     176                 :          0 :         struct quota_format_type **actqf;
     177                 :            : 
     178                 :          0 :         spin_lock(&dq_list_lock);
     179   [ #  #  #  # ]:          0 :         for (actqf = &quota_formats; *actqf && *actqf != fmt;
     180                 :          0 :              actqf = &(*actqf)->qf_next)
     181                 :          0 :                 ;
     182         [ #  # ]:          0 :         if (*actqf)
     183                 :          0 :                 *actqf = (*actqf)->qf_next;
     184                 :          0 :         spin_unlock(&dq_list_lock);
     185                 :          0 : }
     186                 :            : EXPORT_SYMBOL(unregister_quota_format);
     187                 :            : 
     188                 :          0 : static struct quota_format_type *find_quota_format(int id)
     189                 :            : {
     190                 :          0 :         struct quota_format_type *actqf;
     191                 :            : 
     192                 :          0 :         spin_lock(&dq_list_lock);
     193   [ #  #  #  # ]:          0 :         for (actqf = quota_formats; actqf && actqf->qf_fmt_id != id;
     194                 :          0 :              actqf = actqf->qf_next)
     195                 :          0 :                 ;
     196   [ #  #  #  # ]:          0 :         if (!actqf || !try_module_get(actqf->qf_owner)) {
     197                 :          0 :                 int qm;
     198                 :            : 
     199                 :          0 :                 spin_unlock(&dq_list_lock);
     200                 :            : 
     201   [ #  #  #  # ]:          0 :                 for (qm = 0; module_names[qm].qm_fmt_id &&
     202                 :          0 :                              module_names[qm].qm_fmt_id != id; qm++)
     203                 :          0 :                         ;
     204   [ #  #  #  # ]:          0 :                 if (!module_names[qm].qm_fmt_id ||
     205                 :          0 :                     request_module(module_names[qm].qm_mod_name))
     206                 :          0 :                         return NULL;
     207                 :            : 
     208                 :          0 :                 spin_lock(&dq_list_lock);
     209   [ #  #  #  # ]:          0 :                 for (actqf = quota_formats; actqf && actqf->qf_fmt_id != id;
     210                 :          0 :                      actqf = actqf->qf_next)
     211                 :          0 :                         ;
     212   [ #  #  #  # ]:          0 :                 if (actqf && !try_module_get(actqf->qf_owner))
     213                 :          0 :                         actqf = NULL;
     214                 :            :         }
     215                 :          0 :         spin_unlock(&dq_list_lock);
     216                 :          0 :         return actqf;
     217                 :            : }
     218                 :            : 
     219                 :          0 : static void put_quota_format(struct quota_format_type *fmt)
     220                 :            : {
     221                 :          0 :         module_put(fmt->qf_owner);
     222                 :            : }
     223                 :            : 
     224                 :            : /*
     225                 :            :  * Dquot List Management:
     226                 :            :  * The quota code uses four lists for dquot management: the inuse_list,
     227                 :            :  * free_dquots, dqi_dirty_list, and dquot_hash[] array. A single dquot
     228                 :            :  * structure may be on some of those lists, depending on its current state.
     229                 :            :  *
     230                 :            :  * All dquots are placed to the end of inuse_list when first created, and this
     231                 :            :  * list is used for invalidate operation, which must look at every dquot.
     232                 :            :  *
     233                 :            :  * Unused dquots (dq_count == 0) are added to the free_dquots list when freed,
     234                 :            :  * and this list is searched whenever we need an available dquot.  Dquots are
     235                 :            :  * removed from the list as soon as they are used again, and
     236                 :            :  * dqstats.free_dquots gives the number of dquots on the list. When
     237                 :            :  * dquot is invalidated it's completely released from memory.
     238                 :            :  *
     239                 :            :  * Dirty dquots are added to the dqi_dirty_list of quota_info when mark
     240                 :            :  * dirtied, and this list is searched when writing dirty dquots back to
     241                 :            :  * quota file. Note that some filesystems do dirty dquot tracking on their
     242                 :            :  * own (e.g. in a journal) and thus don't use dqi_dirty_list.
     243                 :            :  *
     244                 :            :  * Dquots with a specific identity (device, type and id) are placed on
     245                 :            :  * one of the dquot_hash[] hash chains. The provides an efficient search
     246                 :            :  * mechanism to locate a specific dquot.
     247                 :            :  */
     248                 :            : 
     249                 :            : static LIST_HEAD(inuse_list);
     250                 :            : static LIST_HEAD(free_dquots);
     251                 :            : static unsigned int dq_hash_bits, dq_hash_mask;
     252                 :            : static struct hlist_head *dquot_hash;
     253                 :            : 
     254                 :            : struct dqstats dqstats;
     255                 :            : EXPORT_SYMBOL(dqstats);
     256                 :            : 
     257                 :            : static qsize_t inode_get_rsv_space(struct inode *inode);
     258                 :            : static qsize_t __inode_get_rsv_space(struct inode *inode);
     259                 :            : static int __dquot_initialize(struct inode *inode, int type);
     260                 :            : 
     261                 :            : static inline unsigned int
     262                 :          0 : hashfn(const struct super_block *sb, struct kqid qid)
     263                 :            : {
     264                 :          0 :         unsigned int id = from_kqid(&init_user_ns, qid);
     265                 :          0 :         int type = qid.type;
     266                 :          0 :         unsigned long tmp;
     267                 :            : 
     268                 :          0 :         tmp = (((unsigned long)sb>>L1_CACHE_SHIFT) ^ id) * (MAXQUOTAS - type);
     269                 :          0 :         return (tmp + (tmp >> dq_hash_bits)) & dq_hash_mask;
     270                 :            : }
     271                 :            : 
     272                 :            : /*
     273                 :            :  * Following list functions expect dq_list_lock to be held
     274                 :            :  */
     275                 :          0 : static inline void insert_dquot_hash(struct dquot *dquot)
     276                 :            : {
     277                 :          0 :         struct hlist_head *head;
     278                 :          0 :         head = dquot_hash + hashfn(dquot->dq_sb, dquot->dq_id);
     279         [ #  # ]:          0 :         hlist_add_head(&dquot->dq_hash, head);
     280                 :          0 : }
     281                 :            : 
     282                 :          0 : static inline void remove_dquot_hash(struct dquot *dquot)
     283                 :            : {
     284                 :          0 :         hlist_del_init(&dquot->dq_hash);
     285                 :            : }
     286                 :            : 
     287                 :          0 : static struct dquot *find_dquot(unsigned int hashent, struct super_block *sb,
     288                 :            :                                 struct kqid qid)
     289                 :            : {
     290                 :          0 :         struct hlist_node *node;
     291                 :          0 :         struct dquot *dquot;
     292                 :            : 
     293         [ #  # ]:          0 :         hlist_for_each (node, dquot_hash+hashent) {
     294                 :          0 :                 dquot = hlist_entry(node, struct dquot, dq_hash);
     295   [ #  #  #  # ]:          0 :                 if (dquot->dq_sb == sb && qid_eq(dquot->dq_id, qid))
     296                 :          0 :                         return dquot;
     297                 :            :         }
     298                 :            :         return NULL;
     299                 :            : }
     300                 :            : 
     301                 :            : /* Add a dquot to the tail of the free list */
     302                 :          0 : static inline void put_dquot_last(struct dquot *dquot)
     303                 :            : {
     304                 :          0 :         list_add_tail(&dquot->dq_free, &free_dquots);
     305                 :          0 :         dqstats_inc(DQST_FREE_DQUOTS);
     306                 :            : }
     307                 :            : 
     308                 :          0 : static inline void remove_free_dquot(struct dquot *dquot)
     309                 :            : {
     310         [ #  # ]:          0 :         if (list_empty(&dquot->dq_free))
     311                 :            :                 return;
     312                 :          0 :         list_del_init(&dquot->dq_free);
     313                 :          0 :         dqstats_dec(DQST_FREE_DQUOTS);
     314                 :            : }
     315                 :            : 
     316                 :          0 : static inline void put_inuse(struct dquot *dquot)
     317                 :            : {
     318                 :            :         /* We add to the back of inuse list so we don't have to restart
     319                 :            :          * when traversing this list and we block */
     320                 :          0 :         list_add_tail(&dquot->dq_inuse, &inuse_list);
     321                 :          0 :         dqstats_inc(DQST_ALLOC_DQUOTS);
     322                 :            : }
     323                 :            : 
     324                 :          0 : static inline void remove_inuse(struct dquot *dquot)
     325                 :            : {
     326                 :          0 :         dqstats_dec(DQST_ALLOC_DQUOTS);
     327                 :          0 :         list_del(&dquot->dq_inuse);
     328                 :            : }
     329                 :            : /*
     330                 :            :  * End of list functions needing dq_list_lock
     331                 :            :  */
     332                 :            : 
     333                 :          0 : static void wait_on_dquot(struct dquot *dquot)
     334                 :            : {
     335                 :          0 :         mutex_lock(&dquot->dq_lock);
     336                 :          0 :         mutex_unlock(&dquot->dq_lock);
     337                 :            : }
     338                 :            : 
     339                 :          0 : static inline int dquot_dirty(struct dquot *dquot)
     340                 :            : {
     341                 :          0 :         return test_bit(DQ_MOD_B, &dquot->dq_flags);
     342                 :            : }
     343                 :            : 
     344                 :          0 : static inline int mark_dquot_dirty(struct dquot *dquot)
     345                 :            : {
     346                 :          0 :         return dquot->dq_sb->dq_op->mark_dirty(dquot);
     347                 :            : }
     348                 :            : 
     349                 :            : /* Mark dquot dirty in atomic manner, and return it's old dirty flag state */
     350                 :          0 : int dquot_mark_dquot_dirty(struct dquot *dquot)
     351                 :            : {
     352                 :          0 :         int ret = 1;
     353                 :            : 
     354         [ #  # ]:          0 :         if (!test_bit(DQ_ACTIVE_B, &dquot->dq_flags))
     355                 :            :                 return 0;
     356                 :            : 
     357         [ #  # ]:          0 :         if (sb_dqopt(dquot->dq_sb)->flags & DQUOT_NOLIST_DIRTY)
     358                 :          0 :                 return test_and_set_bit(DQ_MOD_B, &dquot->dq_flags);
     359                 :            : 
     360                 :            :         /* If quota is dirty already, we don't have to acquire dq_list_lock */
     361         [ #  # ]:          0 :         if (test_bit(DQ_MOD_B, &dquot->dq_flags))
     362                 :            :                 return 1;
     363                 :            : 
     364                 :          0 :         spin_lock(&dq_list_lock);
     365         [ #  # ]:          0 :         if (!test_and_set_bit(DQ_MOD_B, &dquot->dq_flags)) {
     366                 :          0 :                 list_add(&dquot->dq_dirty, &sb_dqopt(dquot->dq_sb)->
     367                 :          0 :                                 info[dquot->dq_id.type].dqi_dirty_list);
     368                 :          0 :                 ret = 0;
     369                 :            :         }
     370                 :          0 :         spin_unlock(&dq_list_lock);
     371                 :          0 :         return ret;
     372                 :            : }
     373                 :            : EXPORT_SYMBOL(dquot_mark_dquot_dirty);
     374                 :            : 
     375                 :            : /* Dirtify all the dquots - this can block when journalling */
     376                 :          0 : static inline int mark_all_dquot_dirty(struct dquot * const *dquot)
     377                 :            : {
     378                 :          0 :         int ret, err, cnt;
     379                 :            : 
     380                 :          0 :         ret = err = 0;
     381         [ #  # ]:          0 :         for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
     382         [ #  # ]:          0 :                 if (dquot[cnt])
     383                 :            :                         /* Even in case of error we have to continue */
     384                 :          0 :                         ret = mark_dquot_dirty(dquot[cnt]);
     385         [ #  # ]:          0 :                 if (!err)
     386                 :          0 :                         err = ret;
     387                 :            :         }
     388                 :          0 :         return err;
     389                 :            : }
     390                 :            : 
     391                 :          0 : static inline void dqput_all(struct dquot **dquot)
     392                 :            : {
     393                 :          0 :         unsigned int cnt;
     394                 :            : 
     395   [ #  #  #  #  :          0 :         for (cnt = 0; cnt < MAXQUOTAS; cnt++)
                   #  # ]
     396                 :          0 :                 dqput(dquot[cnt]);
     397                 :            : }
     398                 :            : 
     399                 :          0 : static inline int clear_dquot_dirty(struct dquot *dquot)
     400                 :            : {
     401         [ #  # ]:          0 :         if (sb_dqopt(dquot->dq_sb)->flags & DQUOT_NOLIST_DIRTY)
     402                 :          0 :                 return test_and_clear_bit(DQ_MOD_B, &dquot->dq_flags);
     403                 :            : 
     404                 :          0 :         spin_lock(&dq_list_lock);
     405         [ #  # ]:          0 :         if (!test_and_clear_bit(DQ_MOD_B, &dquot->dq_flags)) {
     406                 :          0 :                 spin_unlock(&dq_list_lock);
     407                 :          0 :                 return 0;
     408                 :            :         }
     409                 :          0 :         list_del_init(&dquot->dq_dirty);
     410                 :          0 :         spin_unlock(&dq_list_lock);
     411                 :          0 :         return 1;
     412                 :            : }
     413                 :            : 
     414                 :          0 : void mark_info_dirty(struct super_block *sb, int type)
     415                 :            : {
     416                 :          0 :         spin_lock(&dq_data_lock);
     417                 :          0 :         sb_dqopt(sb)->info[type].dqi_flags |= DQF_INFO_DIRTY;
     418                 :          0 :         spin_unlock(&dq_data_lock);
     419                 :          0 : }
     420                 :            : EXPORT_SYMBOL(mark_info_dirty);
     421                 :            : 
     422                 :            : /*
     423                 :            :  *      Read dquot from disk and alloc space for it
     424                 :            :  */
     425                 :            : 
     426                 :          0 : int dquot_acquire(struct dquot *dquot)
     427                 :            : {
     428                 :          0 :         int ret = 0, ret2 = 0;
     429                 :          0 :         struct quota_info *dqopt = sb_dqopt(dquot->dq_sb);
     430                 :            : 
     431                 :          0 :         mutex_lock(&dquot->dq_lock);
     432         [ #  # ]:          0 :         if (!test_bit(DQ_READ_B, &dquot->dq_flags)) {
     433                 :          0 :                 ret = dqopt->ops[dquot->dq_id.type]->read_dqblk(dquot);
     434         [ #  # ]:          0 :                 if (ret < 0)
     435                 :          0 :                         goto out_iolock;
     436                 :            :         }
     437                 :            :         /* Make sure flags update is visible after dquot has been filled */
     438                 :          0 :         smp_mb__before_atomic();
     439                 :          0 :         set_bit(DQ_READ_B, &dquot->dq_flags);
     440                 :            :         /* Instantiate dquot if needed */
     441   [ #  #  #  # ]:          0 :         if (!test_bit(DQ_ACTIVE_B, &dquot->dq_flags) && !dquot->dq_off) {
     442                 :          0 :                 ret = dqopt->ops[dquot->dq_id.type]->commit_dqblk(dquot);
     443                 :            :                 /* Write the info if needed */
     444         [ #  # ]:          0 :                 if (info_dirty(&dqopt->info[dquot->dq_id.type])) {
     445                 :          0 :                         ret2 = dqopt->ops[dquot->dq_id.type]->write_file_info(
     446                 :            :                                         dquot->dq_sb, dquot->dq_id.type);
     447                 :            :                 }
     448         [ #  # ]:          0 :                 if (ret < 0)
     449                 :          0 :                         goto out_iolock;
     450         [ #  # ]:          0 :                 if (ret2 < 0) {
     451                 :          0 :                         ret = ret2;
     452                 :          0 :                         goto out_iolock;
     453                 :            :                 }
     454                 :            :         }
     455                 :            :         /*
     456                 :            :          * Make sure flags update is visible after on-disk struct has been
     457                 :            :          * allocated. Paired with smp_rmb() in dqget().
     458                 :            :          */
     459                 :          0 :         smp_mb__before_atomic();
     460                 :          0 :         set_bit(DQ_ACTIVE_B, &dquot->dq_flags);
     461                 :          0 : out_iolock:
     462                 :          0 :         mutex_unlock(&dquot->dq_lock);
     463                 :          0 :         return ret;
     464                 :            : }
     465                 :            : EXPORT_SYMBOL(dquot_acquire);
     466                 :            : 
     467                 :            : /*
     468                 :            :  *      Write dquot to disk
     469                 :            :  */
     470                 :          0 : int dquot_commit(struct dquot *dquot)
     471                 :            : {
     472                 :          0 :         int ret = 0;
     473                 :          0 :         struct quota_info *dqopt = sb_dqopt(dquot->dq_sb);
     474                 :            : 
     475                 :          0 :         mutex_lock(&dquot->dq_lock);
     476         [ #  # ]:          0 :         if (!clear_dquot_dirty(dquot))
     477                 :          0 :                 goto out_lock;
     478                 :            :         /* Inactive dquot can be only if there was error during read/init
     479                 :            :          * => we have better not writing it */
     480         [ #  # ]:          0 :         if (test_bit(DQ_ACTIVE_B, &dquot->dq_flags))
     481                 :          0 :                 ret = dqopt->ops[dquot->dq_id.type]->commit_dqblk(dquot);
     482                 :            :         else
     483                 :            :                 ret = -EIO;
     484                 :          0 : out_lock:
     485                 :          0 :         mutex_unlock(&dquot->dq_lock);
     486                 :          0 :         return ret;
     487                 :            : }
     488                 :            : EXPORT_SYMBOL(dquot_commit);
     489                 :            : 
     490                 :            : /*
     491                 :            :  *      Release dquot
     492                 :            :  */
     493                 :          0 : int dquot_release(struct dquot *dquot)
     494                 :            : {
     495                 :          0 :         int ret = 0, ret2 = 0;
     496                 :          0 :         struct quota_info *dqopt = sb_dqopt(dquot->dq_sb);
     497                 :            : 
     498                 :          0 :         mutex_lock(&dquot->dq_lock);
     499                 :            :         /* Check whether we are not racing with some other dqget() */
     500         [ #  # ]:          0 :         if (dquot_is_busy(dquot))
     501                 :          0 :                 goto out_dqlock;
     502         [ #  # ]:          0 :         if (dqopt->ops[dquot->dq_id.type]->release_dqblk) {
     503                 :          0 :                 ret = dqopt->ops[dquot->dq_id.type]->release_dqblk(dquot);
     504                 :            :                 /* Write the info */
     505         [ #  # ]:          0 :                 if (info_dirty(&dqopt->info[dquot->dq_id.type])) {
     506                 :          0 :                         ret2 = dqopt->ops[dquot->dq_id.type]->write_file_info(
     507                 :            :                                                 dquot->dq_sb, dquot->dq_id.type);
     508                 :            :                 }
     509         [ #  # ]:          0 :                 if (ret >= 0)
     510                 :          0 :                         ret = ret2;
     511                 :            :         }
     512                 :          0 :         clear_bit(DQ_ACTIVE_B, &dquot->dq_flags);
     513                 :          0 : out_dqlock:
     514                 :          0 :         mutex_unlock(&dquot->dq_lock);
     515                 :          0 :         return ret;
     516                 :            : }
     517                 :            : EXPORT_SYMBOL(dquot_release);
     518                 :            : 
     519                 :          0 : void dquot_destroy(struct dquot *dquot)
     520                 :            : {
     521                 :          0 :         kmem_cache_free(dquot_cachep, dquot);
     522                 :          0 : }
     523                 :            : EXPORT_SYMBOL(dquot_destroy);
     524                 :            : 
     525                 :          0 : static inline void do_destroy_dquot(struct dquot *dquot)
     526                 :            : {
     527                 :          0 :         dquot->dq_sb->dq_op->destroy_dquot(dquot);
     528                 :          0 : }
     529                 :            : 
     530                 :            : /* Invalidate all dquots on the list. Note that this function is called after
     531                 :            :  * quota is disabled and pointers from inodes removed so there cannot be new
     532                 :            :  * quota users. There can still be some users of quotas due to inodes being
     533                 :            :  * just deleted or pruned by prune_icache() (those are not attached to any
     534                 :            :  * list) or parallel quotactl call. We have to wait for such users.
     535                 :            :  */
     536                 :          0 : static void invalidate_dquots(struct super_block *sb, int type)
     537                 :            : {
     538                 :          0 :         struct dquot *dquot, *tmp;
     539                 :            : 
     540                 :          0 : restart:
     541                 :          0 :         spin_lock(&dq_list_lock);
     542         [ #  # ]:          0 :         list_for_each_entry_safe(dquot, tmp, &inuse_list, dq_inuse) {
     543         [ #  # ]:          0 :                 if (dquot->dq_sb != sb)
     544                 :          0 :                         continue;
     545         [ #  # ]:          0 :                 if (dquot->dq_id.type != type)
     546                 :          0 :                         continue;
     547                 :            :                 /* Wait for dquot users */
     548         [ #  # ]:          0 :                 if (atomic_read(&dquot->dq_count)) {
     549                 :          0 :                         dqgrab(dquot);
     550                 :          0 :                         spin_unlock(&dq_list_lock);
     551                 :            :                         /*
     552                 :            :                          * Once dqput() wakes us up, we know it's time to free
     553                 :            :                          * the dquot.
     554                 :            :                          * IMPORTANT: we rely on the fact that there is always
     555                 :            :                          * at most one process waiting for dquot to free.
     556                 :            :                          * Otherwise dq_count would be > 1 and we would never
     557                 :            :                          * wake up.
     558                 :            :                          */
     559   [ #  #  #  # ]:          0 :                         wait_event(dquot_ref_wq,
     560                 :            :                                    atomic_read(&dquot->dq_count) == 1);
     561                 :          0 :                         dqput(dquot);
     562                 :            :                         /* At this moment dquot() need not exist (it could be
     563                 :            :                          * reclaimed by prune_dqcache(). Hence we must
     564                 :            :                          * restart. */
     565                 :          0 :                         goto restart;
     566                 :            :                 }
     567                 :            :                 /*
     568                 :            :                  * Quota now has no users and it has been written on last
     569                 :            :                  * dqput()
     570                 :            :                  */
     571         [ #  # ]:          0 :                 remove_dquot_hash(dquot);
     572                 :          0 :                 remove_free_dquot(dquot);
     573                 :          0 :                 remove_inuse(dquot);
     574                 :          0 :                 do_destroy_dquot(dquot);
     575                 :            :         }
     576                 :          0 :         spin_unlock(&dq_list_lock);
     577                 :          0 : }
     578                 :            : 
     579                 :            : /* Call callback for every active dquot on given filesystem */
     580                 :          0 : int dquot_scan_active(struct super_block *sb,
     581                 :            :                       int (*fn)(struct dquot *dquot, unsigned long priv),
     582                 :            :                       unsigned long priv)
     583                 :            : {
     584                 :          0 :         struct dquot *dquot, *old_dquot = NULL;
     585                 :          0 :         int ret = 0;
     586                 :            : 
     587         [ #  # ]:          0 :         WARN_ON_ONCE(!rwsem_is_locked(&sb->s_umount));
     588                 :            : 
     589                 :          0 :         spin_lock(&dq_list_lock);
     590         [ #  # ]:          0 :         list_for_each_entry(dquot, &inuse_list, dq_inuse) {
     591         [ #  # ]:          0 :                 if (!test_bit(DQ_ACTIVE_B, &dquot->dq_flags))
     592                 :          0 :                         continue;
     593         [ #  # ]:          0 :                 if (dquot->dq_sb != sb)
     594                 :          0 :                         continue;
     595                 :            :                 /* Now we have active dquot so we can just increase use count */
     596                 :          0 :                 atomic_inc(&dquot->dq_count);
     597                 :          0 :                 spin_unlock(&dq_list_lock);
     598                 :          0 :                 dqput(old_dquot);
     599                 :          0 :                 old_dquot = dquot;
     600                 :            :                 /*
     601                 :            :                  * ->release_dquot() can be racing with us. Our reference
     602                 :            :                  * protects us from new calls to it so just wait for any
     603                 :            :                  * outstanding call and recheck the DQ_ACTIVE_B after that.
     604                 :            :                  */
     605                 :          0 :                 wait_on_dquot(dquot);
     606         [ #  # ]:          0 :                 if (test_bit(DQ_ACTIVE_B, &dquot->dq_flags)) {
     607                 :          0 :                         ret = fn(dquot, priv);
     608         [ #  # ]:          0 :                         if (ret < 0)
     609                 :          0 :                                 goto out;
     610                 :            :                 }
     611                 :          0 :                 spin_lock(&dq_list_lock);
     612                 :            :                 /* We are safe to continue now because our dquot could not
     613                 :            :                  * be moved out of the inuse list while we hold the reference */
     614                 :            :         }
     615                 :          0 :         spin_unlock(&dq_list_lock);
     616                 :          0 : out:
     617                 :          0 :         dqput(old_dquot);
     618                 :          0 :         return ret;
     619                 :            : }
     620                 :            : EXPORT_SYMBOL(dquot_scan_active);
     621                 :            : 
     622                 :            : /* Write all dquot structures to quota files */
     623                 :          0 : int dquot_writeback_dquots(struct super_block *sb, int type)
     624                 :            : {
     625                 :          0 :         struct list_head dirty;
     626                 :          0 :         struct dquot *dquot;
     627                 :          0 :         struct quota_info *dqopt = sb_dqopt(sb);
     628                 :          0 :         int cnt;
     629                 :          0 :         int err, ret = 0;
     630                 :            : 
     631         [ #  # ]:          0 :         WARN_ON_ONCE(!rwsem_is_locked(&sb->s_umount));
     632                 :            : 
     633         [ #  # ]:          0 :         for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
     634         [ #  # ]:          0 :                 if (type != -1 && cnt != type)
     635                 :          0 :                         continue;
     636   [ #  #  #  # ]:          0 :                 if (!sb_has_quota_active(sb, cnt))
     637                 :          0 :                         continue;
     638                 :          0 :                 spin_lock(&dq_list_lock);
     639                 :            :                 /* Move list away to avoid livelock. */
     640                 :          0 :                 list_replace_init(&dqopt->info[cnt].dqi_dirty_list, &dirty);
     641         [ #  # ]:          0 :                 while (!list_empty(&dirty)) {
     642                 :          0 :                         dquot = list_first_entry(&dirty, struct dquot,
     643                 :            :                                                  dq_dirty);
     644                 :            : 
     645         [ #  # ]:          0 :                         WARN_ON(!test_bit(DQ_ACTIVE_B, &dquot->dq_flags));
     646                 :            : 
     647                 :            :                         /* Now we have active dquot from which someone is
     648                 :            :                          * holding reference so we can safely just increase
     649                 :            :                          * use count */
     650                 :          0 :                         dqgrab(dquot);
     651                 :          0 :                         spin_unlock(&dq_list_lock);
     652                 :          0 :                         err = sb->dq_op->write_dquot(dquot);
     653         [ #  # ]:          0 :                         if (err) {
     654                 :            :                                 /*
     655                 :            :                                  * Clear dirty bit anyway to avoid infinite
     656                 :            :                                  * loop here.
     657                 :            :                                  */
     658                 :          0 :                                 clear_dquot_dirty(dquot);
     659         [ #  # ]:          0 :                                 if (!ret)
     660                 :          0 :                                         ret = err;
     661                 :            :                         }
     662                 :          0 :                         dqput(dquot);
     663                 :          0 :                         spin_lock(&dq_list_lock);
     664                 :            :                 }
     665                 :          0 :                 spin_unlock(&dq_list_lock);
     666                 :            :         }
     667                 :            : 
     668         [ #  # ]:          0 :         for (cnt = 0; cnt < MAXQUOTAS; cnt++)
     669   [ #  #  #  # ]:          0 :                 if ((cnt == type || type == -1) && sb_has_quota_active(sb, cnt)
     670         [ #  # ]:          0 :                     && info_dirty(&dqopt->info[cnt]))
     671                 :          0 :                         sb->dq_op->write_info(sb, cnt);
     672                 :          0 :         dqstats_inc(DQST_SYNCS);
     673                 :            : 
     674                 :          0 :         return ret;
     675                 :            : }
     676                 :            : EXPORT_SYMBOL(dquot_writeback_dquots);
     677                 :            : 
     678                 :            : /* Write all dquot structures to disk and make them visible from userspace */
     679                 :          0 : int dquot_quota_sync(struct super_block *sb, int type)
     680                 :            : {
     681                 :          0 :         struct quota_info *dqopt = sb_dqopt(sb);
     682                 :          0 :         int cnt;
     683                 :          0 :         int ret;
     684                 :            : 
     685                 :          0 :         ret = dquot_writeback_dquots(sb, type);
     686         [ #  # ]:          0 :         if (ret)
     687                 :            :                 return ret;
     688         [ #  # ]:          0 :         if (dqopt->flags & DQUOT_QUOTA_SYS_FILE)
     689                 :            :                 return 0;
     690                 :            : 
     691                 :            :         /* This is not very clever (and fast) but currently I don't know about
     692                 :            :          * any other simple way of getting quota data to disk and we must get
     693                 :            :          * them there for userspace to be visible... */
     694         [ #  # ]:          0 :         if (sb->s_op->sync_fs)
     695                 :          0 :                 sb->s_op->sync_fs(sb, 1);
     696                 :          0 :         sync_blockdev(sb->s_bdev);
     697                 :            : 
     698                 :            :         /*
     699                 :            :          * Now when everything is written we can discard the pagecache so
     700                 :            :          * that userspace sees the changes.
     701                 :            :          */
     702         [ #  # ]:          0 :         for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
     703         [ #  # ]:          0 :                 if (type != -1 && cnt != type)
     704                 :          0 :                         continue;
     705   [ #  #  #  # ]:          0 :                 if (!sb_has_quota_active(sb, cnt))
     706                 :          0 :                         continue;
     707                 :          0 :                 inode_lock(dqopt->files[cnt]);
     708                 :          0 :                 truncate_inode_pages(&dqopt->files[cnt]->i_data, 0);
     709                 :          0 :                 inode_unlock(dqopt->files[cnt]);
     710                 :            :         }
     711                 :            : 
     712                 :            :         return 0;
     713                 :            : }
     714                 :            : EXPORT_SYMBOL(dquot_quota_sync);
     715                 :            : 
     716                 :            : static unsigned long
     717                 :          0 : dqcache_shrink_scan(struct shrinker *shrink, struct shrink_control *sc)
     718                 :            : {
     719                 :          0 :         struct dquot *dquot;
     720                 :          0 :         unsigned long freed = 0;
     721                 :            : 
     722                 :          0 :         spin_lock(&dq_list_lock);
     723   [ #  #  #  # ]:          0 :         while (!list_empty(&free_dquots) && sc->nr_to_scan) {
     724                 :          0 :                 dquot = list_first_entry(&free_dquots, struct dquot, dq_free);
     725         [ #  # ]:          0 :                 remove_dquot_hash(dquot);
     726                 :          0 :                 remove_free_dquot(dquot);
     727                 :          0 :                 remove_inuse(dquot);
     728                 :          0 :                 do_destroy_dquot(dquot);
     729                 :          0 :                 sc->nr_to_scan--;
     730                 :          0 :                 freed++;
     731                 :            :         }
     732                 :          0 :         spin_unlock(&dq_list_lock);
     733                 :          0 :         return freed;
     734                 :            : }
     735                 :            : 
     736                 :            : static unsigned long
     737                 :          0 : dqcache_shrink_count(struct shrinker *shrink, struct shrink_control *sc)
     738                 :            : {
     739                 :          0 :         return vfs_pressure_ratio(
     740                 :          0 :         percpu_counter_read_positive(&dqstats.counter[DQST_FREE_DQUOTS]));
     741                 :            : }
     742                 :            : 
     743                 :            : static struct shrinker dqcache_shrinker = {
     744                 :            :         .count_objects = dqcache_shrink_count,
     745                 :            :         .scan_objects = dqcache_shrink_scan,
     746                 :            :         .seeks = DEFAULT_SEEKS,
     747                 :            : };
     748                 :            : 
     749                 :            : /*
     750                 :            :  * Put reference to dquot
     751                 :            :  */
     752                 :          0 : void dqput(struct dquot *dquot)
     753                 :            : {
     754                 :          0 :         int ret;
     755                 :            : 
     756         [ #  # ]:          0 :         if (!dquot)
     757                 :            :                 return;
     758                 :            : #ifdef CONFIG_QUOTA_DEBUG
     759                 :            :         if (!atomic_read(&dquot->dq_count)) {
     760                 :            :                 quota_error(dquot->dq_sb, "trying to free free dquot of %s %d",
     761                 :            :                             quotatypes[dquot->dq_id.type],
     762                 :            :                             from_kqid(&init_user_ns, dquot->dq_id));
     763                 :            :                 BUG();
     764                 :            :         }
     765                 :            : #endif
     766                 :          0 :         dqstats_inc(DQST_DROPS);
     767                 :            : we_slept:
     768                 :          0 :         spin_lock(&dq_list_lock);
     769         [ #  # ]:          0 :         if (atomic_read(&dquot->dq_count) > 1) {
     770                 :            :                 /* We have more than one user... nothing to do */
     771                 :          0 :                 atomic_dec(&dquot->dq_count);
     772                 :            :                 /* Releasing dquot during quotaoff phase? */
     773   [ #  #  #  #  :          0 :                 if (!sb_has_quota_active(dquot->dq_sb, dquot->dq_id.type) &&
                   #  # ]
     774                 :            :                     atomic_read(&dquot->dq_count) == 1)
     775                 :          0 :                         wake_up(&dquot_ref_wq);
     776                 :          0 :                 spin_unlock(&dq_list_lock);
     777                 :          0 :                 return;
     778                 :            :         }
     779                 :            :         /* Need to release dquot? */
     780         [ #  # ]:          0 :         if (dquot_dirty(dquot)) {
     781                 :          0 :                 spin_unlock(&dq_list_lock);
     782                 :            :                 /* Commit dquot before releasing */
     783                 :          0 :                 ret = dquot->dq_sb->dq_op->write_dquot(dquot);
     784         [ #  # ]:          0 :                 if (ret < 0) {
     785                 :          0 :                         quota_error(dquot->dq_sb, "Can't write quota structure"
     786                 :            :                                     " (error %d). Quota may get out of sync!",
     787                 :            :                                     ret);
     788                 :            :                         /*
     789                 :            :                          * We clear dirty bit anyway, so that we avoid
     790                 :            :                          * infinite loop here
     791                 :            :                          */
     792                 :          0 :                         clear_dquot_dirty(dquot);
     793                 :            :                 }
     794                 :          0 :                 goto we_slept;
     795                 :            :         }
     796         [ #  # ]:          0 :         if (test_bit(DQ_ACTIVE_B, &dquot->dq_flags)) {
     797                 :          0 :                 spin_unlock(&dq_list_lock);
     798                 :          0 :                 dquot->dq_sb->dq_op->release_dquot(dquot);
     799                 :          0 :                 goto we_slept;
     800                 :            :         }
     801                 :          0 :         atomic_dec(&dquot->dq_count);
     802                 :            : #ifdef CONFIG_QUOTA_DEBUG
     803                 :            :         /* sanity check */
     804                 :            :         BUG_ON(!list_empty(&dquot->dq_free));
     805                 :            : #endif
     806                 :          0 :         put_dquot_last(dquot);
     807                 :          0 :         spin_unlock(&dq_list_lock);
     808                 :            : }
     809                 :            : EXPORT_SYMBOL(dqput);
     810                 :            : 
     811                 :          0 : struct dquot *dquot_alloc(struct super_block *sb, int type)
     812                 :            : {
     813                 :          0 :         return kmem_cache_zalloc(dquot_cachep, GFP_NOFS);
     814                 :            : }
     815                 :            : EXPORT_SYMBOL(dquot_alloc);
     816                 :            : 
     817                 :          0 : static struct dquot *get_empty_dquot(struct super_block *sb, int type)
     818                 :            : {
     819                 :          0 :         struct dquot *dquot;
     820                 :            : 
     821                 :          0 :         dquot = sb->dq_op->alloc_dquot(sb, type);
     822         [ #  # ]:          0 :         if(!dquot)
     823                 :            :                 return NULL;
     824                 :            : 
     825                 :          0 :         mutex_init(&dquot->dq_lock);
     826         [ #  # ]:          0 :         INIT_LIST_HEAD(&dquot->dq_free);
     827                 :          0 :         INIT_LIST_HEAD(&dquot->dq_inuse);
     828         [ #  # ]:          0 :         INIT_HLIST_NODE(&dquot->dq_hash);
     829                 :          0 :         INIT_LIST_HEAD(&dquot->dq_dirty);
     830                 :          0 :         dquot->dq_sb = sb;
     831         [ #  # ]:          0 :         dquot->dq_id = make_kqid_invalid(type);
     832                 :          0 :         atomic_set(&dquot->dq_count, 1);
     833                 :          0 :         spin_lock_init(&dquot->dq_dqb_lock);
     834                 :            : 
     835                 :          0 :         return dquot;
     836                 :            : }
     837                 :            : 
     838                 :            : /*
     839                 :            :  * Get reference to dquot
     840                 :            :  *
     841                 :            :  * Locking is slightly tricky here. We are guarded from parallel quotaoff()
     842                 :            :  * destroying our dquot by:
     843                 :            :  *   a) checking for quota flags under dq_list_lock and
     844                 :            :  *   b) getting a reference to dquot before we release dq_list_lock
     845                 :            :  */
     846                 :          0 : struct dquot *dqget(struct super_block *sb, struct kqid qid)
     847                 :            : {
     848                 :          0 :         unsigned int hashent = hashfn(sb, qid);
     849                 :          0 :         struct dquot *dquot, *empty = NULL;
     850                 :            : 
     851         [ #  # ]:          0 :         if (!qid_has_mapping(sb->s_user_ns, qid))
     852                 :            :                 return ERR_PTR(-EINVAL);
     853                 :            : 
     854   [ #  #  #  # ]:          0 :         if (!sb_has_quota_active(sb, qid.type))
     855                 :            :                 return ERR_PTR(-ESRCH);
     856                 :          0 : we_slept:
     857                 :          0 :         spin_lock(&dq_list_lock);
     858                 :          0 :         spin_lock(&dq_state_lock);
     859   [ #  #  #  # ]:          0 :         if (!sb_has_quota_active(sb, qid.type)) {
     860                 :          0 :                 spin_unlock(&dq_state_lock);
     861                 :          0 :                 spin_unlock(&dq_list_lock);
     862                 :          0 :                 dquot = ERR_PTR(-ESRCH);
     863                 :          0 :                 goto out;
     864                 :            :         }
     865                 :          0 :         spin_unlock(&dq_state_lock);
     866                 :            : 
     867                 :          0 :         dquot = find_dquot(hashent, sb, qid);
     868         [ #  # ]:          0 :         if (!dquot) {
     869         [ #  # ]:          0 :                 if (!empty) {
     870                 :          0 :                         spin_unlock(&dq_list_lock);
     871                 :          0 :                         empty = get_empty_dquot(sb, qid.type);
     872         [ #  # ]:          0 :                         if (!empty)
     873                 :          0 :                                 schedule();     /* Try to wait for a moment... */
     874                 :          0 :                         goto we_slept;
     875                 :            :                 }
     876                 :          0 :                 dquot = empty;
     877                 :          0 :                 empty = NULL;
     878                 :          0 :                 dquot->dq_id = qid;
     879                 :            :                 /* all dquots go on the inuse_list */
     880                 :          0 :                 put_inuse(dquot);
     881                 :            :                 /* hash it first so it can be found */
     882                 :          0 :                 insert_dquot_hash(dquot);
     883                 :          0 :                 spin_unlock(&dq_list_lock);
     884                 :          0 :                 dqstats_inc(DQST_LOOKUPS);
     885                 :            :         } else {
     886         [ #  # ]:          0 :                 if (!atomic_read(&dquot->dq_count))
     887                 :          0 :                         remove_free_dquot(dquot);
     888                 :          0 :                 atomic_inc(&dquot->dq_count);
     889                 :          0 :                 spin_unlock(&dq_list_lock);
     890                 :          0 :                 dqstats_inc(DQST_CACHE_HITS);
     891                 :          0 :                 dqstats_inc(DQST_LOOKUPS);
     892                 :            :         }
     893                 :            :         /* Wait for dq_lock - after this we know that either dquot_release() is
     894                 :            :          * already finished or it will be canceled due to dq_count > 1 test */
     895                 :          0 :         wait_on_dquot(dquot);
     896                 :            :         /* Read the dquot / allocate space in quota file */
     897         [ #  # ]:          0 :         if (!test_bit(DQ_ACTIVE_B, &dquot->dq_flags)) {
     898                 :          0 :                 int err;
     899                 :            : 
     900                 :          0 :                 err = sb->dq_op->acquire_dquot(dquot);
     901         [ #  # ]:          0 :                 if (err < 0) {
     902                 :          0 :                         dqput(dquot);
     903                 :          0 :                         dquot = ERR_PTR(err);
     904                 :          0 :                         goto out;
     905                 :            :                 }
     906                 :            :         }
     907                 :            :         /*
     908                 :            :          * Make sure following reads see filled structure - paired with
     909                 :            :          * smp_mb__before_atomic() in dquot_acquire().
     910                 :            :          */
     911                 :          0 :         smp_rmb();
     912                 :            : #ifdef CONFIG_QUOTA_DEBUG
     913                 :            :         BUG_ON(!dquot->dq_sb);       /* Has somebody invalidated entry under us? */
     914                 :            : #endif
     915                 :          0 : out:
     916         [ #  # ]:          0 :         if (empty)
     917                 :          0 :                 do_destroy_dquot(empty);
     918                 :            : 
     919                 :            :         return dquot;
     920                 :            : }
     921                 :            : EXPORT_SYMBOL(dqget);
     922                 :            : 
     923                 :        130 : static inline struct dquot **i_dquot(struct inode *inode)
     924                 :            : {
     925                 :        130 :         return inode->i_sb->s_op->get_dquots(inode);
     926                 :            : }
     927                 :            : 
     928                 :          0 : static int dqinit_needed(struct inode *inode, int type)
     929                 :            : {
     930                 :          0 :         struct dquot * const *dquots;
     931                 :          0 :         int cnt;
     932                 :            : 
     933         [ #  # ]:          0 :         if (IS_NOQUOTA(inode))
     934                 :            :                 return 0;
     935                 :            : 
     936                 :          0 :         dquots = i_dquot(inode);
     937         [ #  # ]:          0 :         if (type != -1)
     938                 :          0 :                 return !dquots[type];
     939         [ #  # ]:          0 :         for (cnt = 0; cnt < MAXQUOTAS; cnt++)
     940         [ #  # ]:          0 :                 if (!dquots[cnt])
     941                 :            :                         return 1;
     942                 :            :         return 0;
     943                 :            : }
     944                 :            : 
     945                 :            : /* This routine is guarded by s_umount semaphore */
     946                 :          0 : static int add_dquot_ref(struct super_block *sb, int type)
     947                 :            : {
     948                 :          0 :         struct inode *inode, *old_inode = NULL;
     949                 :            : #ifdef CONFIG_QUOTA_DEBUG
     950                 :            :         int reserved = 0;
     951                 :            : #endif
     952                 :          0 :         int err = 0;
     953                 :            : 
     954                 :          0 :         spin_lock(&sb->s_inode_list_lock);
     955         [ #  # ]:          0 :         list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
     956                 :          0 :                 spin_lock(&inode->i_lock);
     957   [ #  #  #  # ]:          0 :                 if ((inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW)) ||
     958         [ #  # ]:          0 :                     !atomic_read(&inode->i_writecount) ||
     959                 :          0 :                     !dqinit_needed(inode, type)) {
     960                 :          0 :                         spin_unlock(&inode->i_lock);
     961                 :          0 :                         continue;
     962                 :            :                 }
     963                 :          0 :                 __iget(inode);
     964                 :          0 :                 spin_unlock(&inode->i_lock);
     965                 :          0 :                 spin_unlock(&sb->s_inode_list_lock);
     966                 :            : 
     967                 :            : #ifdef CONFIG_QUOTA_DEBUG
     968                 :            :                 if (unlikely(inode_get_rsv_space(inode) > 0))
     969                 :            :                         reserved = 1;
     970                 :            : #endif
     971                 :          0 :                 iput(old_inode);
     972                 :          0 :                 err = __dquot_initialize(inode, type);
     973         [ #  # ]:          0 :                 if (err) {
     974                 :          0 :                         iput(inode);
     975                 :          0 :                         goto out;
     976                 :            :                 }
     977                 :            : 
     978                 :            :                 /*
     979                 :            :                  * We hold a reference to 'inode' so it couldn't have been
     980                 :            :                  * removed from s_inodes list while we dropped the
     981                 :            :                  * s_inode_list_lock. We cannot iput the inode now as we can be
     982                 :            :                  * holding the last reference and we cannot iput it under
     983                 :            :                  * s_inode_list_lock. So we keep the reference and iput it
     984                 :            :                  * later.
     985                 :            :                  */
     986                 :          0 :                 old_inode = inode;
     987                 :          0 :                 cond_resched();
     988                 :          0 :                 spin_lock(&sb->s_inode_list_lock);
     989                 :            :         }
     990                 :          0 :         spin_unlock(&sb->s_inode_list_lock);
     991                 :          0 :         iput(old_inode);
     992                 :          0 : out:
     993                 :            : #ifdef CONFIG_QUOTA_DEBUG
     994                 :            :         if (reserved) {
     995                 :            :                 quota_error(sb, "Writes happened before quota was turned on "
     996                 :            :                         "thus quota information is probably inconsistent. "
     997                 :            :                         "Please run quotacheck(8)");
     998                 :            :         }
     999                 :            : #endif
    1000                 :          0 :         return err;
    1001                 :            : }
    1002                 :            : 
    1003                 :            : /*
    1004                 :            :  * Remove references to dquots from inode and add dquot to list for freeing
    1005                 :            :  * if we have the last reference to dquot
    1006                 :            :  */
    1007                 :          0 : static void remove_inode_dquot_ref(struct inode *inode, int type,
    1008                 :            :                                    struct list_head *tofree_head)
    1009                 :            : {
    1010                 :          0 :         struct dquot **dquots = i_dquot(inode);
    1011                 :          0 :         struct dquot *dquot = dquots[type];
    1012                 :            : 
    1013         [ #  # ]:          0 :         if (!dquot)
    1014                 :            :                 return;
    1015                 :            : 
    1016                 :          0 :         dquots[type] = NULL;
    1017         [ #  # ]:          0 :         if (list_empty(&dquot->dq_free)) {
    1018                 :            :                 /*
    1019                 :            :                  * The inode still has reference to dquot so it can't be in the
    1020                 :            :                  * free list
    1021                 :            :                  */
    1022                 :          0 :                 spin_lock(&dq_list_lock);
    1023                 :          0 :                 list_add(&dquot->dq_free, tofree_head);
    1024                 :          0 :                 spin_unlock(&dq_list_lock);
    1025                 :            :         } else {
    1026                 :            :                 /*
    1027                 :            :                  * Dquot is already in a list to put so we won't drop the last
    1028                 :            :                  * reference here.
    1029                 :            :                  */
    1030                 :          0 :                 dqput(dquot);
    1031                 :            :         }
    1032                 :            : }
    1033                 :            : 
    1034                 :            : /*
    1035                 :            :  * Free list of dquots
    1036                 :            :  * Dquots are removed from inodes and no new references can be got so we are
    1037                 :            :  * the only ones holding reference
    1038                 :            :  */
    1039                 :          0 : static void put_dquot_list(struct list_head *tofree_head)
    1040                 :            : {
    1041                 :          0 :         struct list_head *act_head;
    1042                 :          0 :         struct dquot *dquot;
    1043                 :            : 
    1044                 :          0 :         act_head = tofree_head->next;
    1045         [ #  # ]:          0 :         while (act_head != tofree_head) {
    1046                 :          0 :                 dquot = list_entry(act_head, struct dquot, dq_free);
    1047                 :          0 :                 act_head = act_head->next;
    1048                 :            :                 /* Remove dquot from the list so we won't have problems... */
    1049                 :          0 :                 list_del_init(&dquot->dq_free);
    1050                 :          0 :                 dqput(dquot);
    1051                 :            :         }
    1052                 :          0 : }
    1053                 :            : 
    1054                 :          0 : static void remove_dquot_ref(struct super_block *sb, int type,
    1055                 :            :                 struct list_head *tofree_head)
    1056                 :            : {
    1057                 :          0 :         struct inode *inode;
    1058                 :            : #ifdef CONFIG_QUOTA_DEBUG
    1059                 :            :         int reserved = 0;
    1060                 :            : #endif
    1061                 :            : 
    1062                 :          0 :         spin_lock(&sb->s_inode_list_lock);
    1063         [ #  # ]:          0 :         list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
    1064                 :            :                 /*
    1065                 :            :                  *  We have to scan also I_NEW inodes because they can already
    1066                 :            :                  *  have quota pointer initialized. Luckily, we need to touch
    1067                 :            :                  *  only quota pointers and these have separate locking
    1068                 :            :                  *  (dq_data_lock).
    1069                 :            :                  */
    1070                 :          0 :                 spin_lock(&dq_data_lock);
    1071         [ #  # ]:          0 :                 if (!IS_NOQUOTA(inode)) {
    1072                 :            : #ifdef CONFIG_QUOTA_DEBUG
    1073                 :            :                         if (unlikely(inode_get_rsv_space(inode) > 0))
    1074                 :            :                                 reserved = 1;
    1075                 :            : #endif
    1076                 :          0 :                         remove_inode_dquot_ref(inode, type, tofree_head);
    1077                 :            :                 }
    1078                 :          0 :                 spin_unlock(&dq_data_lock);
    1079                 :            :         }
    1080                 :          0 :         spin_unlock(&sb->s_inode_list_lock);
    1081                 :            : #ifdef CONFIG_QUOTA_DEBUG
    1082                 :            :         if (reserved) {
    1083                 :            :                 printk(KERN_WARNING "VFS (%s): Writes happened after quota"
    1084                 :            :                         " was disabled thus quota information is probably "
    1085                 :            :                         "inconsistent. Please run quotacheck(8).\n", sb->s_id);
    1086                 :            :         }
    1087                 :            : #endif
    1088                 :          0 : }
    1089                 :            : 
    1090                 :            : /* Gather all references from inodes and drop them */
    1091                 :          0 : static void drop_dquot_ref(struct super_block *sb, int type)
    1092                 :            : {
    1093                 :          0 :         LIST_HEAD(tofree_head);
    1094                 :            : 
    1095         [ #  # ]:          0 :         if (sb->dq_op) {
    1096                 :          0 :                 remove_dquot_ref(sb, type, &tofree_head);
    1097                 :          0 :                 synchronize_srcu(&dquot_srcu);
    1098                 :          0 :                 put_dquot_list(&tofree_head);
    1099                 :            :         }
    1100                 :          0 : }
    1101                 :            : 
    1102                 :            : static inline
    1103                 :          0 : void dquot_free_reserved_space(struct dquot *dquot, qsize_t number)
    1104                 :            : {
    1105         [ #  # ]:          0 :         if (dquot->dq_dqb.dqb_rsvspace >= number)
    1106                 :          0 :                 dquot->dq_dqb.dqb_rsvspace -= number;
    1107                 :            :         else {
    1108                 :          0 :                 WARN_ON_ONCE(1);
    1109                 :          0 :                 dquot->dq_dqb.dqb_rsvspace = 0;
    1110                 :            :         }
    1111                 :          0 :         if (dquot->dq_dqb.dqb_curspace + dquot->dq_dqb.dqb_rsvspace <=
    1112         [ #  # ]:          0 :             dquot->dq_dqb.dqb_bsoftlimit)
    1113                 :          0 :                 dquot->dq_dqb.dqb_btime = (time64_t) 0;
    1114                 :          0 :         clear_bit(DQ_BLKS_B, &dquot->dq_flags);
    1115                 :          0 : }
    1116                 :            : 
    1117                 :          0 : static void dquot_decr_inodes(struct dquot *dquot, qsize_t number)
    1118                 :            : {
    1119         [ #  # ]:          0 :         if (sb_dqopt(dquot->dq_sb)->flags & DQUOT_NEGATIVE_USAGE ||
    1120         [ #  # ]:          0 :             dquot->dq_dqb.dqb_curinodes >= number)
    1121                 :          0 :                 dquot->dq_dqb.dqb_curinodes -= number;
    1122                 :            :         else
    1123                 :          0 :                 dquot->dq_dqb.dqb_curinodes = 0;
    1124         [ #  # ]:          0 :         if (dquot->dq_dqb.dqb_curinodes <= dquot->dq_dqb.dqb_isoftlimit)
    1125                 :          0 :                 dquot->dq_dqb.dqb_itime = (time64_t) 0;
    1126                 :          0 :         clear_bit(DQ_INODES_B, &dquot->dq_flags);
    1127                 :          0 : }
    1128                 :            : 
    1129                 :          0 : static void dquot_decr_space(struct dquot *dquot, qsize_t number)
    1130                 :            : {
    1131         [ #  # ]:          0 :         if (sb_dqopt(dquot->dq_sb)->flags & DQUOT_NEGATIVE_USAGE ||
    1132         [ #  # ]:          0 :             dquot->dq_dqb.dqb_curspace >= number)
    1133                 :          0 :                 dquot->dq_dqb.dqb_curspace -= number;
    1134                 :            :         else
    1135                 :          0 :                 dquot->dq_dqb.dqb_curspace = 0;
    1136                 :          0 :         if (dquot->dq_dqb.dqb_curspace + dquot->dq_dqb.dqb_rsvspace <=
    1137         [ #  # ]:          0 :             dquot->dq_dqb.dqb_bsoftlimit)
    1138                 :          0 :                 dquot->dq_dqb.dqb_btime = (time64_t) 0;
    1139                 :          0 :         clear_bit(DQ_BLKS_B, &dquot->dq_flags);
    1140                 :          0 : }
    1141                 :            : 
    1142                 :            : struct dquot_warn {
    1143                 :            :         struct super_block *w_sb;
    1144                 :            :         struct kqid w_dq_id;
    1145                 :            :         short w_type;
    1146                 :            : };
    1147                 :            : 
    1148                 :          0 : static int warning_issued(struct dquot *dquot, const int warntype)
    1149                 :            : {
    1150                 :          0 :         int flag = (warntype == QUOTA_NL_BHARDWARN ||
    1151                 :          0 :                 warntype == QUOTA_NL_BSOFTLONGWARN) ? DQ_BLKS_B :
    1152                 :          0 :                 ((warntype == QUOTA_NL_IHARDWARN ||
    1153         [ #  # ]:          0 :                 warntype == QUOTA_NL_ISOFTLONGWARN) ? DQ_INODES_B : 0);
    1154                 :            : 
    1155                 :            :         if (!flag)
    1156                 :            :                 return 0;
    1157                 :          0 :         return test_and_set_bit(flag, &dquot->dq_flags);
    1158                 :            : }
    1159                 :            : 
    1160                 :            : #ifdef CONFIG_PRINT_QUOTA_WARNING
    1161                 :            : static int flag_print_warnings = 1;
    1162                 :            : 
    1163                 :            : static int need_print_warning(struct dquot_warn *warn)
    1164                 :            : {
    1165                 :            :         if (!flag_print_warnings)
    1166                 :            :                 return 0;
    1167                 :            : 
    1168                 :            :         switch (warn->w_dq_id.type) {
    1169                 :            :                 case USRQUOTA:
    1170                 :            :                         return uid_eq(current_fsuid(), warn->w_dq_id.uid);
    1171                 :            :                 case GRPQUOTA:
    1172                 :            :                         return in_group_p(warn->w_dq_id.gid);
    1173                 :            :                 case PRJQUOTA:
    1174                 :            :                         return 1;
    1175                 :            :         }
    1176                 :            :         return 0;
    1177                 :            : }
    1178                 :            : 
    1179                 :            : /* Print warning to user which exceeded quota */
    1180                 :            : static void print_warning(struct dquot_warn *warn)
    1181                 :            : {
    1182                 :            :         char *msg = NULL;
    1183                 :            :         struct tty_struct *tty;
    1184                 :            :         int warntype = warn->w_type;
    1185                 :            : 
    1186                 :            :         if (warntype == QUOTA_NL_IHARDBELOW ||
    1187                 :            :             warntype == QUOTA_NL_ISOFTBELOW ||
    1188                 :            :             warntype == QUOTA_NL_BHARDBELOW ||
    1189                 :            :             warntype == QUOTA_NL_BSOFTBELOW || !need_print_warning(warn))
    1190                 :            :                 return;
    1191                 :            : 
    1192                 :            :         tty = get_current_tty();
    1193                 :            :         if (!tty)
    1194                 :            :                 return;
    1195                 :            :         tty_write_message(tty, warn->w_sb->s_id);
    1196                 :            :         if (warntype == QUOTA_NL_ISOFTWARN || warntype == QUOTA_NL_BSOFTWARN)
    1197                 :            :                 tty_write_message(tty, ": warning, ");
    1198                 :            :         else
    1199                 :            :                 tty_write_message(tty, ": write failed, ");
    1200                 :            :         tty_write_message(tty, quotatypes[warn->w_dq_id.type]);
    1201                 :            :         switch (warntype) {
    1202                 :            :                 case QUOTA_NL_IHARDWARN:
    1203                 :            :                         msg = " file limit reached.\r\n";
    1204                 :            :                         break;
    1205                 :            :                 case QUOTA_NL_ISOFTLONGWARN:
    1206                 :            :                         msg = " file quota exceeded too long.\r\n";
    1207                 :            :                         break;
    1208                 :            :                 case QUOTA_NL_ISOFTWARN:
    1209                 :            :                         msg = " file quota exceeded.\r\n";
    1210                 :            :                         break;
    1211                 :            :                 case QUOTA_NL_BHARDWARN:
    1212                 :            :                         msg = " block limit reached.\r\n";
    1213                 :            :                         break;
    1214                 :            :                 case QUOTA_NL_BSOFTLONGWARN:
    1215                 :            :                         msg = " block quota exceeded too long.\r\n";
    1216                 :            :                         break;
    1217                 :            :                 case QUOTA_NL_BSOFTWARN:
    1218                 :            :                         msg = " block quota exceeded.\r\n";
    1219                 :            :                         break;
    1220                 :            :         }
    1221                 :            :         tty_write_message(tty, msg);
    1222                 :            :         tty_kref_put(tty);
    1223                 :            : }
    1224                 :            : #endif
    1225                 :            : 
    1226                 :          0 : static void prepare_warning(struct dquot_warn *warn, struct dquot *dquot,
    1227                 :            :                             int warntype)
    1228                 :            : {
    1229   [ #  #  #  #  :          0 :         if (warning_issued(dquot, warntype))
          #  #  #  #  #  
                #  #  # ]
    1230                 :            :                 return;
    1231                 :          0 :         warn->w_type = warntype;
    1232                 :          0 :         warn->w_sb = dquot->dq_sb;
    1233                 :          0 :         warn->w_dq_id = dquot->dq_id;
    1234                 :            : }
    1235                 :            : 
    1236                 :            : /*
    1237                 :            :  * Write warnings to the console and send warning messages over netlink.
    1238                 :            :  *
    1239                 :            :  * Note that this function can call into tty and networking code.
    1240                 :            :  */
    1241                 :          0 : static void flush_warnings(struct dquot_warn *warn)
    1242                 :            : {
    1243                 :          0 :         int i;
    1244                 :            : 
    1245         [ #  # ]:          0 :         for (i = 0; i < MAXQUOTAS; i++) {
    1246         [ #  # ]:          0 :                 if (warn[i].w_type == QUOTA_NL_NOWARN)
    1247                 :          0 :                         continue;
    1248                 :            : #ifdef CONFIG_PRINT_QUOTA_WARNING
    1249                 :            :                 print_warning(&warn[i]);
    1250                 :            : #endif
    1251                 :          0 :                 quota_send_warning(warn[i].w_dq_id,
    1252                 :          0 :                                    warn[i].w_sb->s_dev, warn[i].w_type);
    1253                 :            :         }
    1254                 :          0 : }
    1255                 :            : 
    1256                 :            : static int ignore_hardlimit(struct dquot *dquot)
    1257                 :            : {
    1258                 :            :         struct mem_dqinfo *info = &sb_dqopt(dquot->dq_sb)->info[dquot->dq_id.type];
    1259                 :            : 
    1260                 :            :         return capable(CAP_SYS_RESOURCE) &&
    1261                 :            :                (info->dqi_format->qf_fmt_id != QFMT_VFS_OLD ||
    1262                 :            :                 !(info->dqi_flags & DQF_ROOT_SQUASH));
    1263                 :            : }
    1264                 :            : 
    1265                 :          0 : static int dquot_add_inodes(struct dquot *dquot, qsize_t inodes,
    1266                 :            :                             struct dquot_warn *warn)
    1267                 :            : {
    1268                 :          0 :         qsize_t newinodes;
    1269                 :          0 :         int ret = 0;
    1270                 :            : 
    1271                 :          0 :         spin_lock(&dquot->dq_dqb_lock);
    1272                 :          0 :         newinodes = dquot->dq_dqb.dqb_curinodes + inodes;
    1273   [ #  #  #  # ]:          0 :         if (!sb_has_quota_limits_enabled(dquot->dq_sb, dquot->dq_id.type) ||
    1274                 :          0 :             test_bit(DQ_FAKE_B, &dquot->dq_flags))
    1275                 :          0 :                 goto add;
    1276                 :            : 
    1277   [ #  #  #  # ]:          0 :         if (dquot->dq_dqb.dqb_ihardlimit &&
    1278         [ #  # ]:          0 :             newinodes > dquot->dq_dqb.dqb_ihardlimit &&
    1279                 :          0 :             !ignore_hardlimit(dquot)) {
    1280                 :          0 :                 prepare_warning(warn, dquot, QUOTA_NL_IHARDWARN);
    1281                 :          0 :                 ret = -EDQUOT;
    1282                 :          0 :                 goto out;
    1283                 :            :         }
    1284                 :            : 
    1285   [ #  #  #  # ]:          0 :         if (dquot->dq_dqb.dqb_isoftlimit &&
    1286                 :          0 :             newinodes > dquot->dq_dqb.dqb_isoftlimit &&
    1287         [ #  # ]:          0 :             dquot->dq_dqb.dqb_itime &&
    1288   [ #  #  #  # ]:          0 :             ktime_get_real_seconds() >= dquot->dq_dqb.dqb_itime &&
    1289                 :          0 :             !ignore_hardlimit(dquot)) {
    1290                 :          0 :                 prepare_warning(warn, dquot, QUOTA_NL_ISOFTLONGWARN);
    1291                 :          0 :                 ret = -EDQUOT;
    1292                 :          0 :                 goto out;
    1293                 :            :         }
    1294                 :            : 
    1295   [ #  #  #  # ]:          0 :         if (dquot->dq_dqb.dqb_isoftlimit &&
    1296                 :          0 :             newinodes > dquot->dq_dqb.dqb_isoftlimit &&
    1297         [ #  # ]:          0 :             dquot->dq_dqb.dqb_itime == 0) {
    1298                 :          0 :                 prepare_warning(warn, dquot, QUOTA_NL_ISOFTWARN);
    1299                 :          0 :                 dquot->dq_dqb.dqb_itime = ktime_get_real_seconds() +
    1300                 :          0 :                     sb_dqopt(dquot->dq_sb)->info[dquot->dq_id.type].dqi_igrace;
    1301                 :            :         }
    1302                 :          0 : add:
    1303                 :          0 :         dquot->dq_dqb.dqb_curinodes = newinodes;
    1304                 :            : 
    1305                 :          0 : out:
    1306                 :          0 :         spin_unlock(&dquot->dq_dqb_lock);
    1307                 :          0 :         return ret;
    1308                 :            : }
    1309                 :            : 
    1310                 :          0 : static int dquot_add_space(struct dquot *dquot, qsize_t space,
    1311                 :            :                            qsize_t rsv_space, unsigned int flags,
    1312                 :            :                            struct dquot_warn *warn)
    1313                 :            : {
    1314                 :          0 :         qsize_t tspace;
    1315                 :          0 :         struct super_block *sb = dquot->dq_sb;
    1316                 :          0 :         int ret = 0;
    1317                 :            : 
    1318                 :          0 :         spin_lock(&dquot->dq_dqb_lock);
    1319   [ #  #  #  # ]:          0 :         if (!sb_has_quota_limits_enabled(sb, dquot->dq_id.type) ||
    1320                 :          0 :             test_bit(DQ_FAKE_B, &dquot->dq_flags))
    1321                 :          0 :                 goto finish;
    1322                 :            : 
    1323                 :          0 :         tspace = dquot->dq_dqb.dqb_curspace + dquot->dq_dqb.dqb_rsvspace
    1324                 :          0 :                 + space + rsv_space;
    1325                 :            : 
    1326   [ #  #  #  # ]:          0 :         if (dquot->dq_dqb.dqb_bhardlimit &&
    1327         [ #  # ]:          0 :             tspace > dquot->dq_dqb.dqb_bhardlimit &&
    1328                 :          0 :             !ignore_hardlimit(dquot)) {
    1329         [ #  # ]:          0 :                 if (flags & DQUOT_SPACE_WARN)
    1330                 :          0 :                         prepare_warning(warn, dquot, QUOTA_NL_BHARDWARN);
    1331                 :          0 :                 ret = -EDQUOT;
    1332                 :          0 :                 goto finish;
    1333                 :            :         }
    1334                 :            : 
    1335   [ #  #  #  # ]:          0 :         if (dquot->dq_dqb.dqb_bsoftlimit &&
    1336                 :          0 :             tspace > dquot->dq_dqb.dqb_bsoftlimit &&
    1337         [ #  # ]:          0 :             dquot->dq_dqb.dqb_btime &&
    1338   [ #  #  #  # ]:          0 :             ktime_get_real_seconds() >= dquot->dq_dqb.dqb_btime &&
    1339                 :          0 :             !ignore_hardlimit(dquot)) {
    1340         [ #  # ]:          0 :                 if (flags & DQUOT_SPACE_WARN)
    1341                 :          0 :                         prepare_warning(warn, dquot, QUOTA_NL_BSOFTLONGWARN);
    1342                 :          0 :                 ret = -EDQUOT;
    1343                 :          0 :                 goto finish;
    1344                 :            :         }
    1345                 :            : 
    1346   [ #  #  #  # ]:          0 :         if (dquot->dq_dqb.dqb_bsoftlimit &&
    1347                 :          0 :             tspace > dquot->dq_dqb.dqb_bsoftlimit &&
    1348         [ #  # ]:          0 :             dquot->dq_dqb.dqb_btime == 0) {
    1349         [ #  # ]:          0 :                 if (flags & DQUOT_SPACE_WARN) {
    1350                 :          0 :                         prepare_warning(warn, dquot, QUOTA_NL_BSOFTWARN);
    1351                 :          0 :                         dquot->dq_dqb.dqb_btime = ktime_get_real_seconds() +
    1352                 :          0 :                             sb_dqopt(sb)->info[dquot->dq_id.type].dqi_bgrace;
    1353                 :            :                 } else {
    1354                 :            :                         /*
    1355                 :            :                          * We don't allow preallocation to exceed softlimit so exceeding will
    1356                 :            :                          * be always printed
    1357                 :            :                          */
    1358                 :          0 :                         ret = -EDQUOT;
    1359                 :          0 :                         goto finish;
    1360                 :            :                 }
    1361                 :            :         }
    1362                 :          0 : finish:
    1363                 :            :         /*
    1364                 :            :          * We have to be careful and go through warning generation & grace time
    1365                 :            :          * setting even if DQUOT_SPACE_NOFAIL is set. That's why we check it
    1366                 :            :          * only here...
    1367                 :            :          */
    1368         [ #  # ]:          0 :         if (flags & DQUOT_SPACE_NOFAIL)
    1369                 :            :                 ret = 0;
    1370         [ #  # ]:          0 :         if (!ret) {
    1371                 :          0 :                 dquot->dq_dqb.dqb_rsvspace += rsv_space;
    1372                 :          0 :                 dquot->dq_dqb.dqb_curspace += space;
    1373                 :            :         }
    1374                 :          0 :         spin_unlock(&dquot->dq_dqb_lock);
    1375                 :          0 :         return ret;
    1376                 :            : }
    1377                 :            : 
    1378                 :          0 : static int info_idq_free(struct dquot *dquot, qsize_t inodes)
    1379                 :            : {
    1380                 :          0 :         qsize_t newinodes;
    1381                 :            : 
    1382         [ #  # ]:          0 :         if (test_bit(DQ_FAKE_B, &dquot->dq_flags) ||
    1383   [ #  #  #  # ]:          0 :             dquot->dq_dqb.dqb_curinodes <= dquot->dq_dqb.dqb_isoftlimit ||
    1384         [ #  # ]:          0 :             !sb_has_quota_limits_enabled(dquot->dq_sb, dquot->dq_id.type))
    1385                 :            :                 return QUOTA_NL_NOWARN;
    1386                 :            : 
    1387                 :          0 :         newinodes = dquot->dq_dqb.dqb_curinodes - inodes;
    1388         [ #  # ]:          0 :         if (newinodes <= dquot->dq_dqb.dqb_isoftlimit)
    1389                 :            :                 return QUOTA_NL_ISOFTBELOW;
    1390   [ #  #  #  # ]:          0 :         if (dquot->dq_dqb.dqb_curinodes >= dquot->dq_dqb.dqb_ihardlimit &&
    1391                 :            :             newinodes < dquot->dq_dqb.dqb_ihardlimit)
    1392                 :          0 :                 return QUOTA_NL_IHARDBELOW;
    1393                 :            :         return QUOTA_NL_NOWARN;
    1394                 :            : }
    1395                 :            : 
    1396                 :          0 : static int info_bdq_free(struct dquot *dquot, qsize_t space)
    1397                 :            : {
    1398                 :          0 :         qsize_t tspace;
    1399                 :            : 
    1400                 :          0 :         tspace = dquot->dq_dqb.dqb_curspace + dquot->dq_dqb.dqb_rsvspace;
    1401                 :            : 
    1402         [ #  # ]:          0 :         if (test_bit(DQ_FAKE_B, &dquot->dq_flags) ||
    1403         [ #  # ]:          0 :             tspace <= dquot->dq_dqb.dqb_bsoftlimit)
    1404                 :            :                 return QUOTA_NL_NOWARN;
    1405                 :            : 
    1406         [ #  # ]:          0 :         if (tspace - space <= dquot->dq_dqb.dqb_bsoftlimit)
    1407                 :            :                 return QUOTA_NL_BSOFTBELOW;
    1408   [ #  #  #  # ]:          0 :         if (tspace >= dquot->dq_dqb.dqb_bhardlimit &&
    1409                 :            :             tspace - space < dquot->dq_dqb.dqb_bhardlimit)
    1410                 :          0 :                 return QUOTA_NL_BHARDBELOW;
    1411                 :            :         return QUOTA_NL_NOWARN;
    1412                 :            : }
    1413                 :            : 
    1414                 :      42127 : static int dquot_active(const struct inode *inode)
    1415                 :            : {
    1416                 :      42127 :         struct super_block *sb = inode->i_sb;
    1417                 :            : 
    1418                 :      42127 :         if (IS_NOQUOTA(inode))
    1419                 :            :                 return 0;
    1420   [ -  +  +  -  :      42127 :         return sb_any_quota_loaded(sb) & ~sb_any_quota_suspended(sb);
          +  -  -  -  +  
          -  -  +  +  -  
             -  -  -  + ]
    1421                 :            : }
    1422                 :            : 
    1423                 :            : /*
    1424                 :            :  * Initialize quota pointers in inode
    1425                 :            :  *
    1426                 :            :  * It is better to call this function outside of any transaction as it
    1427                 :            :  * might need a lot of space in journal for dquot structure allocation.
    1428                 :            :  */
    1429                 :      21970 : static int __dquot_initialize(struct inode *inode, int type)
    1430                 :            : {
    1431                 :      21970 :         int cnt, init_needed = 0;
    1432                 :      21970 :         struct dquot **dquots, *got[MAXQUOTAS] = {};
    1433                 :      21970 :         struct super_block *sb = inode->i_sb;
    1434                 :      21970 :         qsize_t rsv;
    1435                 :      21970 :         int ret = 0;
    1436                 :            : 
    1437   [ +  -  -  + ]:      21970 :         if (!dquot_active(inode))
    1438                 :            :                 return 0;
    1439                 :            : 
    1440                 :          0 :         dquots = i_dquot(inode);
    1441                 :            : 
    1442                 :            :         /* First get references to structures we might need. */
    1443         [ #  # ]:          0 :         for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
    1444                 :          0 :                 struct kqid qid;
    1445                 :          0 :                 kprojid_t projid;
    1446                 :          0 :                 int rc;
    1447                 :          0 :                 struct dquot *dquot;
    1448                 :            : 
    1449         [ #  # ]:          0 :                 if (type != -1 && cnt != type)
    1450                 :          0 :                         continue;
    1451                 :            :                 /*
    1452                 :            :                  * The i_dquot should have been initialized in most cases,
    1453                 :            :                  * we check it without locking here to avoid unnecessary
    1454                 :            :                  * dqget()/dqput() calls.
    1455                 :            :                  */
    1456         [ #  # ]:          0 :                 if (dquots[cnt])
    1457                 :          0 :                         continue;
    1458                 :            : 
    1459   [ #  #  #  # ]:          0 :                 if (!sb_has_quota_active(sb, cnt))
    1460                 :          0 :                         continue;
    1461                 :            : 
    1462                 :          0 :                 init_needed = 1;
    1463                 :            : 
    1464      [ #  #  # ]:          0 :                 switch (cnt) {
    1465                 :          0 :                 case USRQUOTA:
    1466                 :          0 :                         qid = make_kqid_uid(inode->i_uid);
    1467                 :          0 :                         break;
    1468                 :          0 :                 case GRPQUOTA:
    1469                 :          0 :                         qid = make_kqid_gid(inode->i_gid);
    1470                 :          0 :                         break;
    1471                 :          0 :                 case PRJQUOTA:
    1472                 :          0 :                         rc = inode->i_sb->dq_op->get_projid(inode, &projid);
    1473         [ #  # ]:          0 :                         if (rc)
    1474                 :          0 :                                 continue;
    1475                 :          0 :                         qid = make_kqid_projid(projid);
    1476                 :          0 :                         break;
    1477                 :            :                 }
    1478                 :          0 :                 dquot = dqget(sb, qid);
    1479         [ #  # ]:          0 :                 if (IS_ERR(dquot)) {
    1480                 :            :                         /* We raced with somebody turning quotas off... */
    1481         [ #  # ]:          0 :                         if (PTR_ERR(dquot) != -ESRCH) {
    1482                 :          0 :                                 ret = PTR_ERR(dquot);
    1483                 :          0 :                                 goto out_put;
    1484                 :            :                         }
    1485                 :            :                         dquot = NULL;
    1486                 :            :                 }
    1487                 :          0 :                 got[cnt] = dquot;
    1488                 :            :         }
    1489                 :            : 
    1490                 :            :         /* All required i_dquot has been initialized */
    1491         [ #  # ]:          0 :         if (!init_needed)
    1492                 :            :                 return 0;
    1493                 :            : 
    1494                 :          0 :         spin_lock(&dq_data_lock);
    1495         [ #  # ]:          0 :         if (IS_NOQUOTA(inode))
    1496                 :          0 :                 goto out_lock;
    1497         [ #  # ]:          0 :         for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
    1498         [ #  # ]:          0 :                 if (type != -1 && cnt != type)
    1499                 :          0 :                         continue;
    1500                 :            :                 /* Avoid races with quotaoff() */
    1501   [ #  #  #  # ]:          0 :                 if (!sb_has_quota_active(sb, cnt))
    1502                 :          0 :                         continue;
    1503                 :            :                 /* We could race with quotaon or dqget() could have failed */
    1504         [ #  # ]:          0 :                 if (!got[cnt])
    1505                 :          0 :                         continue;
    1506         [ #  # ]:          0 :                 if (!dquots[cnt]) {
    1507                 :          0 :                         dquots[cnt] = got[cnt];
    1508                 :          0 :                         got[cnt] = NULL;
    1509                 :            :                         /*
    1510                 :            :                          * Make quota reservation system happy if someone
    1511                 :            :                          * did a write before quota was turned on
    1512                 :            :                          */
    1513                 :          0 :                         rsv = inode_get_rsv_space(inode);
    1514         [ #  # ]:          0 :                         if (unlikely(rsv)) {
    1515                 :          0 :                                 spin_lock(&inode->i_lock);
    1516                 :            :                                 /* Get reservation again under proper lock */
    1517                 :          0 :                                 rsv = __inode_get_rsv_space(inode);
    1518                 :          0 :                                 spin_lock(&dquots[cnt]->dq_dqb_lock);
    1519                 :          0 :                                 dquots[cnt]->dq_dqb.dqb_rsvspace += rsv;
    1520                 :          0 :                                 spin_unlock(&dquots[cnt]->dq_dqb_lock);
    1521                 :          0 :                                 spin_unlock(&inode->i_lock);
    1522                 :            :                         }
    1523                 :            :                 }
    1524                 :            :         }
    1525                 :          0 : out_lock:
    1526                 :          0 :         spin_unlock(&dq_data_lock);
    1527                 :          0 : out_put:
    1528                 :            :         /* Drop unused references */
    1529                 :          0 :         dqput_all(got);
    1530                 :            : 
    1531                 :            :         return ret;
    1532                 :            : }
    1533                 :            : 
    1534                 :      21970 : int dquot_initialize(struct inode *inode)
    1535                 :            : {
    1536                 :      17017 :         return __dquot_initialize(inode, -1);
    1537                 :            : }
    1538                 :            : EXPORT_SYMBOL(dquot_initialize);
    1539                 :            : 
    1540                 :          0 : bool dquot_initialize_needed(struct inode *inode)
    1541                 :            : {
    1542                 :          0 :         struct dquot **dquots;
    1543                 :          0 :         int i;
    1544                 :            : 
    1545   [ #  #  #  # ]:          0 :         if (!dquot_active(inode))
    1546                 :            :                 return false;
    1547                 :            : 
    1548                 :          0 :         dquots = i_dquot(inode);
    1549         [ #  # ]:          0 :         for (i = 0; i < MAXQUOTAS; i++)
    1550   [ #  #  #  #  :          0 :                 if (!dquots[i] && sb_has_quota_active(inode->i_sb, i))
                   #  # ]
    1551                 :            :                         return true;
    1552                 :            :         return false;
    1553                 :            : }
    1554                 :            : EXPORT_SYMBOL(dquot_initialize_needed);
    1555                 :            : 
    1556                 :            : /*
    1557                 :            :  * Release all quotas referenced by inode.
    1558                 :            :  *
    1559                 :            :  * This function only be called on inode free or converting
    1560                 :            :  * a file to quota file, no other users for the i_dquot in
    1561                 :            :  * both cases, so we needn't call synchronize_srcu() after
    1562                 :            :  * clearing i_dquot.
    1563                 :            :  */
    1564                 :          0 : static void __dquot_drop(struct inode *inode)
    1565                 :            : {
    1566                 :          0 :         int cnt;
    1567                 :          0 :         struct dquot **dquots = i_dquot(inode);
    1568                 :          0 :         struct dquot *put[MAXQUOTAS];
    1569                 :            : 
    1570                 :          0 :         spin_lock(&dq_data_lock);
    1571         [ #  # ]:          0 :         for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
    1572                 :          0 :                 put[cnt] = dquots[cnt];
    1573                 :          0 :                 dquots[cnt] = NULL;
    1574                 :            :         }
    1575                 :          0 :         spin_unlock(&dq_data_lock);
    1576                 :            :         dqput_all(put);
    1577                 :          0 : }
    1578                 :            : 
    1579                 :        130 : void dquot_drop(struct inode *inode)
    1580                 :            : {
    1581                 :        130 :         struct dquot * const *dquots;
    1582                 :        130 :         int cnt;
    1583                 :            : 
    1584         [ +  - ]:        130 :         if (IS_NOQUOTA(inode))
    1585                 :            :                 return;
    1586                 :            : 
    1587                 :            :         /*
    1588                 :            :          * Test before calling to rule out calls from proc and such
    1589                 :            :          * where we are not allowed to block. Note that this is
    1590                 :            :          * actually reliable test even without the lock - the caller
    1591                 :            :          * must assure that nobody can come after the DQUOT_DROP and
    1592                 :            :          * add quota pointers back anyway.
    1593                 :            :          */
    1594                 :        130 :         dquots = i_dquot(inode);
    1595         [ +  + ]:        650 :         for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
    1596         [ +  - ]:        390 :                 if (dquots[cnt])
    1597                 :            :                         break;
    1598                 :            :         }
    1599                 :            : 
    1600         [ -  + ]:        130 :         if (cnt < MAXQUOTAS)
    1601                 :          0 :                 __dquot_drop(inode);
    1602                 :            : }
    1603                 :            : EXPORT_SYMBOL(dquot_drop);
    1604                 :            : 
    1605                 :            : /*
    1606                 :            :  * inode_reserved_space is managed internally by quota, and protected by
    1607                 :            :  * i_lock similar to i_blocks+i_bytes.
    1608                 :            :  */
    1609                 :       8392 : static qsize_t *inode_reserved_space(struct inode * inode)
    1610                 :            : {
    1611                 :            :         /* Filesystem must explicitly define it's own method in order to use
    1612                 :            :          * quota reservation interface */
    1613                 :          0 :         BUG_ON(!inode->i_sb->dq_op->get_reserved_space);
    1614                 :       8392 :         return inode->i_sb->dq_op->get_reserved_space(inode);
    1615                 :            : }
    1616                 :            : 
    1617                 :          0 : static qsize_t __inode_get_rsv_space(struct inode *inode)
    1618                 :            : {
    1619         [ #  # ]:          0 :         if (!inode->i_sb->dq_op->get_reserved_space)
    1620                 :            :                 return 0;
    1621                 :          0 :         return *inode_reserved_space(inode);
    1622                 :            : }
    1623                 :            : 
    1624                 :          0 : static qsize_t inode_get_rsv_space(struct inode *inode)
    1625                 :            : {
    1626                 :          0 :         qsize_t ret;
    1627                 :            : 
    1628         [ #  # ]:          0 :         if (!inode->i_sb->dq_op->get_reserved_space)
    1629                 :            :                 return 0;
    1630                 :          0 :         spin_lock(&inode->i_lock);
    1631         [ #  # ]:          0 :         ret = __inode_get_rsv_space(inode);
    1632                 :          0 :         spin_unlock(&inode->i_lock);
    1633                 :          0 :         return ret;
    1634                 :            : }
    1635                 :            : 
    1636                 :            : /*
    1637                 :            :  * This functions updates i_blocks+i_bytes fields and quota information
    1638                 :            :  * (together with appropriate checks).
    1639                 :            :  *
    1640                 :            :  * NOTE: We absolutely rely on the fact that caller dirties the inode
    1641                 :            :  * (usually helpers in quotaops.h care about this) and holds a handle for
    1642                 :            :  * the current transaction so that dquot write and inode write go into the
    1643                 :            :  * same transaction.
    1644                 :            :  */
    1645                 :            : 
    1646                 :            : /*
    1647                 :            :  * This operation can block, but only after everything is updated
    1648                 :            :  */
    1649                 :      11538 : int __dquot_alloc_space(struct inode *inode, qsize_t number, int flags)
    1650                 :            : {
    1651                 :      11538 :         int cnt, ret = 0, index;
    1652                 :      11538 :         struct dquot_warn warn[MAXQUOTAS];
    1653                 :      11538 :         int reserve = flags & DQUOT_SPACE_RESERVE;
    1654                 :      11538 :         struct dquot **dquots;
    1655                 :            : 
    1656   [ +  -  +  - ]:      11538 :         if (!dquot_active(inode)) {
    1657         [ +  + ]:      11538 :                 if (reserve) {
    1658                 :       8288 :                         spin_lock(&inode->i_lock);
    1659         [ -  + ]:       8288 :                         *inode_reserved_space(inode) += number;
    1660                 :       8288 :                         spin_unlock(&inode->i_lock);
    1661                 :            :                 } else {
    1662                 :       3250 :                         inode_add_bytes(inode, number);
    1663                 :            :                 }
    1664                 :      11538 :                 goto out;
    1665                 :            :         }
    1666                 :            : 
    1667         [ #  # ]:          0 :         for (cnt = 0; cnt < MAXQUOTAS; cnt++)
    1668                 :          0 :                 warn[cnt].w_type = QUOTA_NL_NOWARN;
    1669                 :            : 
    1670                 :          0 :         dquots = i_dquot(inode);
    1671                 :          0 :         index = srcu_read_lock(&dquot_srcu);
    1672                 :          0 :         spin_lock(&inode->i_lock);
    1673         [ #  # ]:          0 :         for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
    1674         [ #  # ]:          0 :                 if (!dquots[cnt])
    1675                 :          0 :                         continue;
    1676         [ #  # ]:          0 :                 if (reserve) {
    1677                 :          0 :                         ret = dquot_add_space(dquots[cnt], 0, number, flags,
    1678                 :            :                                               &warn[cnt]);
    1679                 :            :                 } else {
    1680                 :          0 :                         ret = dquot_add_space(dquots[cnt], number, 0, flags,
    1681                 :            :                                               &warn[cnt]);
    1682                 :            :                 }
    1683         [ #  # ]:          0 :                 if (ret) {
    1684                 :            :                         /* Back out changes we already did */
    1685         [ #  # ]:          0 :                         for (cnt--; cnt >= 0; cnt--) {
    1686         [ #  # ]:          0 :                                 if (!dquots[cnt])
    1687                 :          0 :                                         continue;
    1688                 :          0 :                                 spin_lock(&dquots[cnt]->dq_dqb_lock);
    1689         [ #  # ]:          0 :                                 if (reserve)
    1690                 :          0 :                                         dquot_free_reserved_space(dquots[cnt],
    1691                 :            :                                                                   number);
    1692                 :            :                                 else
    1693                 :          0 :                                         dquot_decr_space(dquots[cnt], number);
    1694                 :          0 :                                 spin_unlock(&dquots[cnt]->dq_dqb_lock);
    1695                 :            :                         }
    1696                 :          0 :                         spin_unlock(&inode->i_lock);
    1697                 :          0 :                         goto out_flush_warn;
    1698                 :            :                 }
    1699                 :            :         }
    1700         [ #  # ]:          0 :         if (reserve)
    1701         [ #  # ]:          0 :                 *inode_reserved_space(inode) += number;
    1702                 :            :         else
    1703                 :          0 :                 __inode_add_bytes(inode, number);
    1704                 :          0 :         spin_unlock(&inode->i_lock);
    1705                 :            : 
    1706         [ #  # ]:          0 :         if (reserve)
    1707                 :          0 :                 goto out_flush_warn;
    1708                 :          0 :         mark_all_dquot_dirty(dquots);
    1709                 :          0 : out_flush_warn:
    1710                 :          0 :         srcu_read_unlock(&dquot_srcu, index);
    1711                 :          0 :         flush_warnings(warn);
    1712                 :      11538 : out:
    1713                 :      11538 :         return ret;
    1714                 :            : }
    1715                 :            : EXPORT_SYMBOL(__dquot_alloc_space);
    1716                 :            : 
    1717                 :            : /*
    1718                 :            :  * This operation can block, but only after everything is updated
    1719                 :            :  */
    1720                 :       8112 : int dquot_alloc_inode(struct inode *inode)
    1721                 :            : {
    1722                 :       8112 :         int cnt, ret = 0, index;
    1723                 :       8112 :         struct dquot_warn warn[MAXQUOTAS];
    1724                 :       8112 :         struct dquot * const *dquots;
    1725                 :            : 
    1726   [ +  -  -  + ]:       8112 :         if (!dquot_active(inode))
    1727                 :            :                 return 0;
    1728         [ #  # ]:          0 :         for (cnt = 0; cnt < MAXQUOTAS; cnt++)
    1729                 :          0 :                 warn[cnt].w_type = QUOTA_NL_NOWARN;
    1730                 :            : 
    1731                 :          0 :         dquots = i_dquot(inode);
    1732                 :          0 :         index = srcu_read_lock(&dquot_srcu);
    1733                 :          0 :         spin_lock(&inode->i_lock);
    1734         [ #  # ]:          0 :         for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
    1735         [ #  # ]:          0 :                 if (!dquots[cnt])
    1736                 :          0 :                         continue;
    1737                 :          0 :                 ret = dquot_add_inodes(dquots[cnt], 1, &warn[cnt]);
    1738         [ #  # ]:          0 :                 if (ret) {
    1739         [ #  # ]:          0 :                         for (cnt--; cnt >= 0; cnt--) {
    1740         [ #  # ]:          0 :                                 if (!dquots[cnt])
    1741                 :          0 :                                         continue;
    1742                 :            :                                 /* Back out changes we already did */
    1743                 :          0 :                                 spin_lock(&dquots[cnt]->dq_dqb_lock);
    1744                 :          0 :                                 dquot_decr_inodes(dquots[cnt], 1);
    1745                 :          0 :                                 spin_unlock(&dquots[cnt]->dq_dqb_lock);
    1746                 :            :                         }
    1747                 :          0 :                         goto warn_put_all;
    1748                 :            :                 }
    1749                 :            :         }
    1750                 :            : 
    1751                 :          0 : warn_put_all:
    1752                 :          0 :         spin_unlock(&inode->i_lock);
    1753         [ #  # ]:          0 :         if (ret == 0)
    1754                 :          0 :                 mark_all_dquot_dirty(dquots);
    1755                 :          0 :         srcu_read_unlock(&dquot_srcu, index);
    1756                 :          0 :         flush_warnings(warn);
    1757                 :          0 :         return ret;
    1758                 :            : }
    1759                 :            : EXPORT_SYMBOL(dquot_alloc_inode);
    1760                 :            : 
    1761                 :            : /*
    1762                 :            :  * Convert in-memory reserved quotas to real consumed quotas
    1763                 :            :  */
    1764                 :        104 : int dquot_claim_space_nodirty(struct inode *inode, qsize_t number)
    1765                 :            : {
    1766                 :        104 :         struct dquot **dquots;
    1767                 :        104 :         int cnt, index;
    1768                 :            : 
    1769   [ +  -  +  - ]:        104 :         if (!dquot_active(inode)) {
    1770                 :        104 :                 spin_lock(&inode->i_lock);
    1771         [ -  + ]:        104 :                 *inode_reserved_space(inode) -= number;
    1772                 :        104 :                 __inode_add_bytes(inode, number);
    1773                 :        104 :                 spin_unlock(&inode->i_lock);
    1774                 :        104 :                 return 0;
    1775                 :            :         }
    1776                 :            : 
    1777                 :          0 :         dquots = i_dquot(inode);
    1778                 :          0 :         index = srcu_read_lock(&dquot_srcu);
    1779                 :          0 :         spin_lock(&inode->i_lock);
    1780                 :            :         /* Claim reserved quotas to allocated quotas */
    1781         [ #  # ]:          0 :         for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
    1782         [ #  # ]:          0 :                 if (dquots[cnt]) {
    1783                 :          0 :                         struct dquot *dquot = dquots[cnt];
    1784                 :            : 
    1785                 :          0 :                         spin_lock(&dquot->dq_dqb_lock);
    1786   [ #  #  #  # ]:          0 :                         if (WARN_ON_ONCE(dquot->dq_dqb.dqb_rsvspace < number))
    1787                 :          0 :                                 number = dquot->dq_dqb.dqb_rsvspace;
    1788                 :          0 :                         dquot->dq_dqb.dqb_curspace += number;
    1789                 :          0 :                         dquot->dq_dqb.dqb_rsvspace -= number;
    1790                 :          0 :                         spin_unlock(&dquot->dq_dqb_lock);
    1791                 :            :                 }
    1792                 :            :         }
    1793                 :            :         /* Update inode bytes */
    1794         [ #  # ]:          0 :         *inode_reserved_space(inode) -= number;
    1795                 :          0 :         __inode_add_bytes(inode, number);
    1796                 :          0 :         spin_unlock(&inode->i_lock);
    1797                 :          0 :         mark_all_dquot_dirty(dquots);
    1798                 :          0 :         srcu_read_unlock(&dquot_srcu, index);
    1799                 :          0 :         return 0;
    1800                 :            : }
    1801                 :            : EXPORT_SYMBOL(dquot_claim_space_nodirty);
    1802                 :            : 
    1803                 :            : /*
    1804                 :            :  * Convert allocated space back to in-memory reserved quotas
    1805                 :            :  */
    1806                 :          0 : void dquot_reclaim_space_nodirty(struct inode *inode, qsize_t number)
    1807                 :            : {
    1808                 :          0 :         struct dquot **dquots;
    1809                 :          0 :         int cnt, index;
    1810                 :            : 
    1811   [ #  #  #  # ]:          0 :         if (!dquot_active(inode)) {
    1812                 :          0 :                 spin_lock(&inode->i_lock);
    1813         [ #  # ]:          0 :                 *inode_reserved_space(inode) += number;
    1814                 :          0 :                 __inode_sub_bytes(inode, number);
    1815                 :          0 :                 spin_unlock(&inode->i_lock);
    1816                 :          0 :                 return;
    1817                 :            :         }
    1818                 :            : 
    1819                 :          0 :         dquots = i_dquot(inode);
    1820                 :          0 :         index = srcu_read_lock(&dquot_srcu);
    1821                 :          0 :         spin_lock(&inode->i_lock);
    1822                 :            :         /* Claim reserved quotas to allocated quotas */
    1823         [ #  # ]:          0 :         for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
    1824         [ #  # ]:          0 :                 if (dquots[cnt]) {
    1825                 :          0 :                         struct dquot *dquot = dquots[cnt];
    1826                 :            : 
    1827                 :          0 :                         spin_lock(&dquot->dq_dqb_lock);
    1828   [ #  #  #  # ]:          0 :                         if (WARN_ON_ONCE(dquot->dq_dqb.dqb_curspace < number))
    1829                 :          0 :                                 number = dquot->dq_dqb.dqb_curspace;
    1830                 :          0 :                         dquot->dq_dqb.dqb_rsvspace += number;
    1831                 :          0 :                         dquot->dq_dqb.dqb_curspace -= number;
    1832                 :          0 :                         spin_unlock(&dquot->dq_dqb_lock);
    1833                 :            :                 }
    1834                 :            :         }
    1835                 :            :         /* Update inode bytes */
    1836         [ #  # ]:          0 :         *inode_reserved_space(inode) += number;
    1837                 :          0 :         __inode_sub_bytes(inode, number);
    1838                 :          0 :         spin_unlock(&inode->i_lock);
    1839                 :          0 :         mark_all_dquot_dirty(dquots);
    1840                 :          0 :         srcu_read_unlock(&dquot_srcu, index);
    1841                 :          0 :         return;
    1842                 :            : }
    1843                 :            : EXPORT_SYMBOL(dquot_reclaim_space_nodirty);
    1844                 :            : 
    1845                 :            : /*
    1846                 :            :  * This operation can block, but only after everything is updated
    1847                 :            :  */
    1848                 :        130 : void __dquot_free_space(struct inode *inode, qsize_t number, int flags)
    1849                 :            : {
    1850                 :        130 :         unsigned int cnt;
    1851                 :        130 :         struct dquot_warn warn[MAXQUOTAS];
    1852                 :        130 :         struct dquot **dquots;
    1853                 :        130 :         int reserve = flags & DQUOT_SPACE_RESERVE, index;
    1854                 :            : 
    1855   [ +  -  +  - ]:        130 :         if (!dquot_active(inode)) {
    1856         [ -  + ]:        130 :                 if (reserve) {
    1857                 :          0 :                         spin_lock(&inode->i_lock);
    1858         [ #  # ]:          0 :                         *inode_reserved_space(inode) -= number;
    1859                 :          0 :                         spin_unlock(&inode->i_lock);
    1860                 :            :                 } else {
    1861                 :        130 :                         inode_sub_bytes(inode, number);
    1862                 :            :                 }
    1863                 :        130 :                 return;
    1864                 :            :         }
    1865                 :            : 
    1866                 :          0 :         dquots = i_dquot(inode);
    1867                 :          0 :         index = srcu_read_lock(&dquot_srcu);
    1868                 :          0 :         spin_lock(&inode->i_lock);
    1869         [ #  # ]:          0 :         for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
    1870                 :          0 :                 int wtype;
    1871                 :            : 
    1872                 :          0 :                 warn[cnt].w_type = QUOTA_NL_NOWARN;
    1873         [ #  # ]:          0 :                 if (!dquots[cnt])
    1874                 :          0 :                         continue;
    1875                 :          0 :                 spin_lock(&dquots[cnt]->dq_dqb_lock);
    1876                 :          0 :                 wtype = info_bdq_free(dquots[cnt], number);
    1877         [ #  # ]:          0 :                 if (wtype != QUOTA_NL_NOWARN)
    1878                 :          0 :                         prepare_warning(&warn[cnt], dquots[cnt], wtype);
    1879         [ #  # ]:          0 :                 if (reserve)
    1880                 :          0 :                         dquot_free_reserved_space(dquots[cnt], number);
    1881                 :            :                 else
    1882                 :          0 :                         dquot_decr_space(dquots[cnt], number);
    1883                 :          0 :                 spin_unlock(&dquots[cnt]->dq_dqb_lock);
    1884                 :            :         }
    1885         [ #  # ]:          0 :         if (reserve)
    1886         [ #  # ]:          0 :                 *inode_reserved_space(inode) -= number;
    1887                 :            :         else
    1888                 :          0 :                 __inode_sub_bytes(inode, number);
    1889                 :          0 :         spin_unlock(&inode->i_lock);
    1890                 :            : 
    1891         [ #  # ]:          0 :         if (reserve)
    1892                 :          0 :                 goto out_unlock;
    1893                 :          0 :         mark_all_dquot_dirty(dquots);
    1894                 :          0 : out_unlock:
    1895                 :          0 :         srcu_read_unlock(&dquot_srcu, index);
    1896                 :          0 :         flush_warnings(warn);
    1897                 :            : }
    1898                 :            : EXPORT_SYMBOL(__dquot_free_space);
    1899                 :            : 
    1900                 :            : /*
    1901                 :            :  * This operation can block, but only after everything is updated
    1902                 :            :  */
    1903                 :        130 : void dquot_free_inode(struct inode *inode)
    1904                 :            : {
    1905                 :        130 :         unsigned int cnt;
    1906                 :        130 :         struct dquot_warn warn[MAXQUOTAS];
    1907                 :        130 :         struct dquot * const *dquots;
    1908                 :        130 :         int index;
    1909                 :            : 
    1910   [ +  -  +  - ]:        130 :         if (!dquot_active(inode))
    1911                 :        130 :                 return;
    1912                 :            : 
    1913                 :          0 :         dquots = i_dquot(inode);
    1914                 :          0 :         index = srcu_read_lock(&dquot_srcu);
    1915                 :          0 :         spin_lock(&inode->i_lock);
    1916         [ #  # ]:          0 :         for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
    1917                 :          0 :                 int wtype;
    1918                 :            : 
    1919                 :          0 :                 warn[cnt].w_type = QUOTA_NL_NOWARN;
    1920         [ #  # ]:          0 :                 if (!dquots[cnt])
    1921                 :          0 :                         continue;
    1922                 :          0 :                 spin_lock(&dquots[cnt]->dq_dqb_lock);
    1923                 :          0 :                 wtype = info_idq_free(dquots[cnt], 1);
    1924         [ #  # ]:          0 :                 if (wtype != QUOTA_NL_NOWARN)
    1925                 :          0 :                         prepare_warning(&warn[cnt], dquots[cnt], wtype);
    1926                 :          0 :                 dquot_decr_inodes(dquots[cnt], 1);
    1927                 :          0 :                 spin_unlock(&dquots[cnt]->dq_dqb_lock);
    1928                 :            :         }
    1929                 :          0 :         spin_unlock(&inode->i_lock);
    1930                 :          0 :         mark_all_dquot_dirty(dquots);
    1931                 :          0 :         srcu_read_unlock(&dquot_srcu, index);
    1932                 :          0 :         flush_warnings(warn);
    1933                 :            : }
    1934                 :            : EXPORT_SYMBOL(dquot_free_inode);
    1935                 :            : 
    1936                 :            : /*
    1937                 :            :  * Transfer the number of inode and blocks from one diskquota to an other.
    1938                 :            :  * On success, dquot references in transfer_to are consumed and references
    1939                 :            :  * to original dquots that need to be released are placed there. On failure,
    1940                 :            :  * references are kept untouched.
    1941                 :            :  *
    1942                 :            :  * This operation can block, but only after everything is updated
    1943                 :            :  * A transaction must be started when entering this function.
    1944                 :            :  *
    1945                 :            :  * We are holding reference on transfer_from & transfer_to, no need to
    1946                 :            :  * protect them by srcu_read_lock().
    1947                 :            :  */
    1948                 :          0 : int __dquot_transfer(struct inode *inode, struct dquot **transfer_to)
    1949                 :            : {
    1950                 :          0 :         qsize_t cur_space;
    1951                 :          0 :         qsize_t rsv_space = 0;
    1952                 :          0 :         qsize_t inode_usage = 1;
    1953                 :          0 :         struct dquot *transfer_from[MAXQUOTAS] = {};
    1954                 :          0 :         int cnt, ret = 0;
    1955                 :          0 :         char is_valid[MAXQUOTAS] = {};
    1956                 :          0 :         struct dquot_warn warn_to[MAXQUOTAS];
    1957                 :          0 :         struct dquot_warn warn_from_inodes[MAXQUOTAS];
    1958                 :          0 :         struct dquot_warn warn_from_space[MAXQUOTAS];
    1959                 :            : 
    1960         [ #  # ]:          0 :         if (IS_NOQUOTA(inode))
    1961                 :            :                 return 0;
    1962                 :            : 
    1963         [ #  # ]:          0 :         if (inode->i_sb->dq_op->get_inode_usage) {
    1964                 :          0 :                 ret = inode->i_sb->dq_op->get_inode_usage(inode, &inode_usage);
    1965         [ #  # ]:          0 :                 if (ret)
    1966                 :            :                         return ret;
    1967                 :            :         }
    1968                 :            : 
    1969                 :            :         /* Initialize the arrays */
    1970         [ #  # ]:          0 :         for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
    1971                 :          0 :                 warn_to[cnt].w_type = QUOTA_NL_NOWARN;
    1972                 :          0 :                 warn_from_inodes[cnt].w_type = QUOTA_NL_NOWARN;
    1973                 :          0 :                 warn_from_space[cnt].w_type = QUOTA_NL_NOWARN;
    1974                 :            :         }
    1975                 :            : 
    1976                 :          0 :         spin_lock(&dq_data_lock);
    1977                 :          0 :         spin_lock(&inode->i_lock);
    1978         [ #  # ]:          0 :         if (IS_NOQUOTA(inode)) {        /* File without quota accounting? */
    1979                 :          0 :                 spin_unlock(&inode->i_lock);
    1980                 :          0 :                 spin_unlock(&dq_data_lock);
    1981                 :          0 :                 return 0;
    1982                 :            :         }
    1983         [ #  # ]:          0 :         cur_space = __inode_get_bytes(inode);
    1984         [ #  # ]:          0 :         rsv_space = __inode_get_rsv_space(inode);
    1985                 :            :         /*
    1986                 :            :          * Build the transfer_from list, check limits, and update usage in
    1987                 :            :          * the target structures.
    1988                 :            :          */
    1989         [ #  # ]:          0 :         for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
    1990                 :            :                 /*
    1991                 :            :                  * Skip changes for same uid or gid or for turned off quota-type.
    1992                 :            :                  */
    1993         [ #  # ]:          0 :                 if (!transfer_to[cnt])
    1994                 :          0 :                         continue;
    1995                 :            :                 /* Avoid races with quotaoff() */
    1996   [ #  #  #  # ]:          0 :                 if (!sb_has_quota_active(inode->i_sb, cnt))
    1997                 :          0 :                         continue;
    1998                 :          0 :                 is_valid[cnt] = 1;
    1999                 :          0 :                 transfer_from[cnt] = i_dquot(inode)[cnt];
    2000                 :          0 :                 ret = dquot_add_inodes(transfer_to[cnt], inode_usage,
    2001                 :            :                                        &warn_to[cnt]);
    2002         [ #  # ]:          0 :                 if (ret)
    2003                 :          0 :                         goto over_quota;
    2004                 :          0 :                 ret = dquot_add_space(transfer_to[cnt], cur_space, rsv_space,
    2005                 :            :                                       DQUOT_SPACE_WARN, &warn_to[cnt]);
    2006         [ #  # ]:          0 :                 if (ret) {
    2007                 :          0 :                         spin_lock(&transfer_to[cnt]->dq_dqb_lock);
    2008                 :          0 :                         dquot_decr_inodes(transfer_to[cnt], inode_usage);
    2009                 :          0 :                         spin_unlock(&transfer_to[cnt]->dq_dqb_lock);
    2010                 :          0 :                         goto over_quota;
    2011                 :            :                 }
    2012                 :            :         }
    2013                 :            : 
    2014                 :            :         /* Decrease usage for source structures and update quota pointers */
    2015         [ #  # ]:          0 :         for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
    2016         [ #  # ]:          0 :                 if (!is_valid[cnt])
    2017                 :          0 :                         continue;
    2018                 :            :                 /* Due to IO error we might not have transfer_from[] structure */
    2019         [ #  # ]:          0 :                 if (transfer_from[cnt]) {
    2020                 :          0 :                         int wtype;
    2021                 :            : 
    2022                 :          0 :                         spin_lock(&transfer_from[cnt]->dq_dqb_lock);
    2023                 :          0 :                         wtype = info_idq_free(transfer_from[cnt], inode_usage);
    2024         [ #  # ]:          0 :                         if (wtype != QUOTA_NL_NOWARN)
    2025                 :          0 :                                 prepare_warning(&warn_from_inodes[cnt],
    2026                 :            :                                                 transfer_from[cnt], wtype);
    2027                 :          0 :                         wtype = info_bdq_free(transfer_from[cnt],
    2028                 :            :                                               cur_space + rsv_space);
    2029         [ #  # ]:          0 :                         if (wtype != QUOTA_NL_NOWARN)
    2030                 :          0 :                                 prepare_warning(&warn_from_space[cnt],
    2031                 :            :                                                 transfer_from[cnt], wtype);
    2032                 :          0 :                         dquot_decr_inodes(transfer_from[cnt], inode_usage);
    2033                 :          0 :                         dquot_decr_space(transfer_from[cnt], cur_space);
    2034                 :          0 :                         dquot_free_reserved_space(transfer_from[cnt],
    2035                 :            :                                                   rsv_space);
    2036                 :          0 :                         spin_unlock(&transfer_from[cnt]->dq_dqb_lock);
    2037                 :            :                 }
    2038                 :          0 :                 i_dquot(inode)[cnt] = transfer_to[cnt];
    2039                 :            :         }
    2040                 :          0 :         spin_unlock(&inode->i_lock);
    2041                 :          0 :         spin_unlock(&dq_data_lock);
    2042                 :            : 
    2043                 :          0 :         mark_all_dquot_dirty(transfer_from);
    2044                 :          0 :         mark_all_dquot_dirty(transfer_to);
    2045                 :          0 :         flush_warnings(warn_to);
    2046                 :          0 :         flush_warnings(warn_from_inodes);
    2047                 :          0 :         flush_warnings(warn_from_space);
    2048                 :            :         /* Pass back references to put */
    2049         [ #  # ]:          0 :         for (cnt = 0; cnt < MAXQUOTAS; cnt++)
    2050         [ #  # ]:          0 :                 if (is_valid[cnt])
    2051                 :          0 :                         transfer_to[cnt] = transfer_from[cnt];
    2052                 :            :         return 0;
    2053                 :          0 : over_quota:
    2054                 :            :         /* Back out changes we already did */
    2055         [ #  # ]:          0 :         for (cnt--; cnt >= 0; cnt--) {
    2056         [ #  # ]:          0 :                 if (!is_valid[cnt])
    2057                 :          0 :                         continue;
    2058                 :          0 :                 spin_lock(&transfer_to[cnt]->dq_dqb_lock);
    2059                 :          0 :                 dquot_decr_inodes(transfer_to[cnt], inode_usage);
    2060                 :          0 :                 dquot_decr_space(transfer_to[cnt], cur_space);
    2061                 :          0 :                 dquot_free_reserved_space(transfer_to[cnt], rsv_space);
    2062                 :          0 :                 spin_unlock(&transfer_to[cnt]->dq_dqb_lock);
    2063                 :            :         }
    2064                 :          0 :         spin_unlock(&inode->i_lock);
    2065                 :          0 :         spin_unlock(&dq_data_lock);
    2066                 :          0 :         flush_warnings(warn_to);
    2067                 :          0 :         return ret;
    2068                 :            : }
    2069                 :            : EXPORT_SYMBOL(__dquot_transfer);
    2070                 :            : 
    2071                 :            : /* Wrapper for transferring ownership of an inode for uid/gid only
    2072                 :            :  * Called from FSXXX_setattr()
    2073                 :            :  */
    2074                 :        143 : int dquot_transfer(struct inode *inode, struct iattr *iattr)
    2075                 :            : {
    2076                 :        143 :         struct dquot *transfer_to[MAXQUOTAS] = {};
    2077                 :        143 :         struct dquot *dquot;
    2078                 :        143 :         struct super_block *sb = inode->i_sb;
    2079                 :        143 :         int ret;
    2080                 :            : 
    2081   [ +  -  -  + ]:        143 :         if (!dquot_active(inode))
    2082                 :            :                 return 0;
    2083                 :            : 
    2084   [ #  #  #  # ]:          0 :         if (iattr->ia_valid & ATTR_UID && !uid_eq(iattr->ia_uid, inode->i_uid)){
    2085                 :          0 :                 dquot = dqget(sb, make_kqid_uid(iattr->ia_uid));
    2086         [ #  # ]:          0 :                 if (IS_ERR(dquot)) {
    2087         [ #  # ]:          0 :                         if (PTR_ERR(dquot) != -ESRCH) {
    2088                 :          0 :                                 ret = PTR_ERR(dquot);
    2089                 :          0 :                                 goto out_put;
    2090                 :            :                         }
    2091                 :            :                         dquot = NULL;
    2092                 :            :                 }
    2093                 :          0 :                 transfer_to[USRQUOTA] = dquot;
    2094                 :            :         }
    2095   [ #  #  #  # ]:          0 :         if (iattr->ia_valid & ATTR_GID && !gid_eq(iattr->ia_gid, inode->i_gid)){
    2096                 :          0 :                 dquot = dqget(sb, make_kqid_gid(iattr->ia_gid));
    2097         [ #  # ]:          0 :                 if (IS_ERR(dquot)) {
    2098         [ #  # ]:          0 :                         if (PTR_ERR(dquot) != -ESRCH) {
    2099                 :          0 :                                 ret = PTR_ERR(dquot);
    2100                 :          0 :                                 goto out_put;
    2101                 :            :                         }
    2102                 :            :                         dquot = NULL;
    2103                 :            :                 }
    2104                 :          0 :                 transfer_to[GRPQUOTA] = dquot;
    2105                 :            :         }
    2106                 :          0 :         ret = __dquot_transfer(inode, transfer_to);
    2107                 :          0 : out_put:
    2108                 :          0 :         dqput_all(transfer_to);
    2109                 :            :         return ret;
    2110                 :            : }
    2111                 :            : EXPORT_SYMBOL(dquot_transfer);
    2112                 :            : 
    2113                 :            : /*
    2114                 :            :  * Write info of quota file to disk
    2115                 :            :  */
    2116                 :          0 : int dquot_commit_info(struct super_block *sb, int type)
    2117                 :            : {
    2118                 :          0 :         struct quota_info *dqopt = sb_dqopt(sb);
    2119                 :            : 
    2120                 :          0 :         return dqopt->ops[type]->write_file_info(sb, type);
    2121                 :            : }
    2122                 :            : EXPORT_SYMBOL(dquot_commit_info);
    2123                 :            : 
    2124                 :          0 : int dquot_get_next_id(struct super_block *sb, struct kqid *qid)
    2125                 :            : {
    2126         [ #  # ]:          0 :         struct quota_info *dqopt = sb_dqopt(sb);
    2127                 :            : 
    2128   [ #  #  #  # ]:          0 :         if (!sb_has_quota_active(sb, qid->type))
    2129                 :            :                 return -ESRCH;
    2130         [ #  # ]:          0 :         if (!dqopt->ops[qid->type]->get_next_id)
    2131                 :            :                 return -ENOSYS;
    2132                 :          0 :         return dqopt->ops[qid->type]->get_next_id(sb, qid);
    2133                 :            : }
    2134                 :            : EXPORT_SYMBOL(dquot_get_next_id);
    2135                 :            : 
    2136                 :            : /*
    2137                 :            :  * Definitions of diskquota operations.
    2138                 :            :  */
    2139                 :            : const struct dquot_operations dquot_operations = {
    2140                 :            :         .write_dquot    = dquot_commit,
    2141                 :            :         .acquire_dquot  = dquot_acquire,
    2142                 :            :         .release_dquot  = dquot_release,
    2143                 :            :         .mark_dirty     = dquot_mark_dquot_dirty,
    2144                 :            :         .write_info     = dquot_commit_info,
    2145                 :            :         .alloc_dquot    = dquot_alloc,
    2146                 :            :         .destroy_dquot  = dquot_destroy,
    2147                 :            :         .get_next_id    = dquot_get_next_id,
    2148                 :            : };
    2149                 :            : EXPORT_SYMBOL(dquot_operations);
    2150                 :            : 
    2151                 :            : /*
    2152                 :            :  * Generic helper for ->open on filesystems supporting disk quotas.
    2153                 :            :  */
    2154                 :     195832 : int dquot_file_open(struct inode *inode, struct file *file)
    2155                 :            : {
    2156                 :     195832 :         int error;
    2157                 :            : 
    2158                 :     195832 :         error = generic_file_open(inode, file);
    2159   [ +  -  +  + ]:     195832 :         if (!error && (file->f_mode & FMODE_WRITE))
    2160                 :       4953 :                 error = dquot_initialize(inode);
    2161                 :     195832 :         return error;
    2162                 :            : }
    2163                 :            : EXPORT_SYMBOL(dquot_file_open);
    2164                 :            : 
    2165                 :          0 : static void vfs_cleanup_quota_inode(struct super_block *sb, int type)
    2166                 :            : {
    2167         [ #  # ]:          0 :         struct quota_info *dqopt = sb_dqopt(sb);
    2168                 :          0 :         struct inode *inode = dqopt->files[type];
    2169                 :            : 
    2170         [ #  # ]:          0 :         if (!inode)
    2171                 :            :                 return;
    2172         [ #  # ]:          0 :         if (!(dqopt->flags & DQUOT_QUOTA_SYS_FILE)) {
    2173                 :          0 :                 inode_lock(inode);
    2174                 :          0 :                 inode->i_flags &= ~S_NOQUOTA;
    2175                 :          0 :                 inode_unlock(inode);
    2176                 :            :         }
    2177                 :          0 :         dqopt->files[type] = NULL;
    2178                 :          0 :         iput(inode);
    2179                 :            : }
    2180                 :            : 
    2181                 :            : /*
    2182                 :            :  * Turn quota off on a device. type == -1 ==> quotaoff for all types (umount)
    2183                 :            :  */
    2184                 :          0 : int dquot_disable(struct super_block *sb, int type, unsigned int flags)
    2185                 :            : {
    2186                 :          0 :         int cnt;
    2187                 :          0 :         struct quota_info *dqopt = sb_dqopt(sb);
    2188                 :            : 
    2189                 :            :         /* s_umount should be held in exclusive mode */
    2190   [ #  #  #  # ]:          0 :         if (WARN_ON_ONCE(down_read_trylock(&sb->s_umount)))
    2191                 :          0 :                 up_read(&sb->s_umount);
    2192                 :            : 
    2193                 :            :         /* Cannot turn off usage accounting without turning off limits, or
    2194                 :            :          * suspend quotas and simultaneously turn quotas off. */
    2195         [ #  # ]:          0 :         if ((flags & DQUOT_USAGE_ENABLED && !(flags & DQUOT_LIMITS_ENABLED))
    2196   [ #  #  #  # ]:          0 :             || (flags & DQUOT_SUSPENDED && flags & (DQUOT_LIMITS_ENABLED |
    2197                 :            :             DQUOT_USAGE_ENABLED)))
    2198                 :            :                 return -EINVAL;
    2199                 :            : 
    2200                 :            :         /*
    2201                 :            :          * Skip everything if there's nothing to do. We have to do this because
    2202                 :            :          * sometimes we are called when fill_super() failed and calling
    2203                 :            :          * sync_fs() in such cases does no good.
    2204                 :            :          */
    2205         [ #  # ]:          0 :         if (!sb_any_quota_loaded(sb))
    2206                 :            :                 return 0;
    2207                 :            : 
    2208         [ #  # ]:          0 :         for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
    2209         [ #  # ]:          0 :                 if (type != -1 && cnt != type)
    2210                 :          0 :                         continue;
    2211         [ #  # ]:          0 :                 if (!sb_has_quota_loaded(sb, cnt))
    2212                 :          0 :                         continue;
    2213                 :            : 
    2214         [ #  # ]:          0 :                 if (flags & DQUOT_SUSPENDED) {
    2215                 :          0 :                         spin_lock(&dq_state_lock);
    2216                 :          0 :                         dqopt->flags |=
    2217                 :            :                                 dquot_state_flag(DQUOT_SUSPENDED, cnt);
    2218                 :          0 :                         spin_unlock(&dq_state_lock);
    2219                 :            :                 } else {
    2220                 :          0 :                         spin_lock(&dq_state_lock);
    2221         [ #  # ]:          0 :                         dqopt->flags &= ~dquot_state_flag(flags, cnt);
    2222                 :            :                         /* Turning off suspended quotas? */
    2223   [ #  #  #  # ]:          0 :                         if (!sb_has_quota_loaded(sb, cnt) &&
    2224                 :            :                             sb_has_quota_suspended(sb, cnt)) {
    2225                 :          0 :                                 dqopt->flags &=  ~dquot_state_flag(
    2226                 :            :                                                         DQUOT_SUSPENDED, cnt);
    2227                 :          0 :                                 spin_unlock(&dq_state_lock);
    2228                 :          0 :                                 vfs_cleanup_quota_inode(sb, cnt);
    2229                 :          0 :                                 continue;
    2230                 :            :                         }
    2231                 :          0 :                         spin_unlock(&dq_state_lock);
    2232                 :            :                 }
    2233                 :            : 
    2234                 :            :                 /* We still have to keep quota loaded? */
    2235   [ #  #  #  # ]:          0 :                 if (sb_has_quota_loaded(sb, cnt) && !(flags & DQUOT_SUSPENDED))
    2236                 :          0 :                         continue;
    2237                 :            : 
    2238                 :            :                 /* Note: these are blocking operations */
    2239                 :          0 :                 drop_dquot_ref(sb, cnt);
    2240                 :          0 :                 invalidate_dquots(sb, cnt);
    2241                 :            :                 /*
    2242                 :            :                  * Now all dquots should be invalidated, all writes done so we
    2243                 :            :                  * should be only users of the info. No locks needed.
    2244                 :            :                  */
    2245         [ #  # ]:          0 :                 if (info_dirty(&dqopt->info[cnt]))
    2246                 :          0 :                         sb->dq_op->write_info(sb, cnt);
    2247         [ #  # ]:          0 :                 if (dqopt->ops[cnt]->free_file_info)
    2248                 :          0 :                         dqopt->ops[cnt]->free_file_info(sb, cnt);
    2249                 :          0 :                 put_quota_format(dqopt->info[cnt].dqi_format);
    2250                 :          0 :                 dqopt->info[cnt].dqi_flags = 0;
    2251                 :          0 :                 dqopt->info[cnt].dqi_igrace = 0;
    2252                 :          0 :                 dqopt->info[cnt].dqi_bgrace = 0;
    2253                 :          0 :                 dqopt->ops[cnt] = NULL;
    2254                 :            :         }
    2255                 :            : 
    2256                 :            :         /* Skip syncing and setting flags if quota files are hidden */
    2257         [ #  # ]:          0 :         if (dqopt->flags & DQUOT_QUOTA_SYS_FILE)
    2258                 :          0 :                 goto put_inodes;
    2259                 :            : 
    2260                 :            :         /* Sync the superblock so that buffers with quota data are written to
    2261                 :            :          * disk (and so userspace sees correct data afterwards). */
    2262         [ #  # ]:          0 :         if (sb->s_op->sync_fs)
    2263                 :          0 :                 sb->s_op->sync_fs(sb, 1);
    2264                 :          0 :         sync_blockdev(sb->s_bdev);
    2265                 :            :         /* Now the quota files are just ordinary files and we can set the
    2266                 :            :          * inode flags back. Moreover we discard the pagecache so that
    2267                 :            :          * userspace sees the writes we did bypassing the pagecache. We
    2268                 :            :          * must also discard the blockdev buffers so that we see the
    2269                 :            :          * changes done by userspace on the next quotaon() */
    2270         [ #  # ]:          0 :         for (cnt = 0; cnt < MAXQUOTAS; cnt++)
    2271   [ #  #  #  # ]:          0 :                 if (!sb_has_quota_loaded(sb, cnt) && dqopt->files[cnt]) {
    2272                 :          0 :                         inode_lock(dqopt->files[cnt]);
    2273                 :          0 :                         truncate_inode_pages(&dqopt->files[cnt]->i_data, 0);
    2274                 :          0 :                         inode_unlock(dqopt->files[cnt]);
    2275                 :            :                 }
    2276         [ #  # ]:          0 :         if (sb->s_bdev)
    2277                 :          0 :                 invalidate_bdev(sb->s_bdev);
    2278                 :          0 : put_inodes:
    2279                 :            :         /* We are done when suspending quotas */
    2280         [ #  # ]:          0 :         if (flags & DQUOT_SUSPENDED)
    2281                 :            :                 return 0;
    2282                 :            : 
    2283         [ #  # ]:          0 :         for (cnt = 0; cnt < MAXQUOTAS; cnt++)
    2284         [ #  # ]:          0 :                 if (!sb_has_quota_loaded(sb, cnt))
    2285                 :          0 :                         vfs_cleanup_quota_inode(sb, cnt);
    2286                 :            :         return 0;
    2287                 :            : }
    2288                 :            : EXPORT_SYMBOL(dquot_disable);
    2289                 :            : 
    2290                 :          0 : int dquot_quota_off(struct super_block *sb, int type)
    2291                 :            : {
    2292                 :          0 :         return dquot_disable(sb, type,
    2293                 :            :                              DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED);
    2294                 :            : }
    2295                 :            : EXPORT_SYMBOL(dquot_quota_off);
    2296                 :            : 
    2297                 :            : /*
    2298                 :            :  *      Turn quotas on on a device
    2299                 :            :  */
    2300                 :            : 
    2301                 :          0 : static int vfs_setup_quota_inode(struct inode *inode, int type)
    2302                 :            : {
    2303                 :          0 :         struct super_block *sb = inode->i_sb;
    2304         [ #  # ]:          0 :         struct quota_info *dqopt = sb_dqopt(sb);
    2305                 :            : 
    2306         [ #  # ]:          0 :         if (!S_ISREG(inode->i_mode))
    2307                 :            :                 return -EACCES;
    2308         [ #  # ]:          0 :         if (IS_RDONLY(inode))
    2309                 :            :                 return -EROFS;
    2310         [ #  # ]:          0 :         if (sb_has_quota_loaded(sb, type))
    2311                 :            :                 return -EBUSY;
    2312                 :            : 
    2313                 :          0 :         dqopt->files[type] = igrab(inode);
    2314         [ #  # ]:          0 :         if (!dqopt->files[type])
    2315                 :            :                 return -EIO;
    2316         [ #  # ]:          0 :         if (!(dqopt->flags & DQUOT_QUOTA_SYS_FILE)) {
    2317                 :            :                 /* We don't want quota and atime on quota files (deadlocks
    2318                 :            :                  * possible) Also nobody should write to the file - we use
    2319                 :            :                  * special IO operations which ignore the immutable bit. */
    2320                 :          0 :                 inode_lock(inode);
    2321                 :          0 :                 inode->i_flags |= S_NOQUOTA;
    2322                 :          0 :                 inode_unlock(inode);
    2323                 :            :                 /*
    2324                 :            :                  * When S_NOQUOTA is set, remove dquot references as no more
    2325                 :            :                  * references can be added
    2326                 :            :                  */
    2327                 :          0 :                 __dquot_drop(inode);
    2328                 :            :         }
    2329                 :            :         return 0;
    2330                 :            : }
    2331                 :            : 
    2332                 :          0 : int dquot_load_quota_sb(struct super_block *sb, int type, int format_id,
    2333                 :            :         unsigned int flags)
    2334                 :            : {
    2335                 :          0 :         struct quota_format_type *fmt = find_quota_format(format_id);
    2336         [ #  # ]:          0 :         struct quota_info *dqopt = sb_dqopt(sb);
    2337                 :          0 :         int error;
    2338                 :            : 
    2339                 :            :         /* Just unsuspend quotas? */
    2340         [ #  # ]:          0 :         BUG_ON(flags & DQUOT_SUSPENDED);
    2341                 :            :         /* s_umount should be held in exclusive mode */
    2342   [ #  #  #  # ]:          0 :         if (WARN_ON_ONCE(down_read_trylock(&sb->s_umount)))
    2343                 :          0 :                 up_read(&sb->s_umount);
    2344                 :            : 
    2345         [ #  # ]:          0 :         if (!fmt)
    2346                 :            :                 return -ESRCH;
    2347   [ #  #  #  #  :          0 :         if (!sb->s_op->quota_write || !sb->s_op->quota_read ||
                   #  # ]
    2348         [ #  # ]:          0 :             (type == PRJQUOTA && sb->dq_op->get_projid == NULL)) {
    2349                 :          0 :                 error = -EINVAL;
    2350                 :          0 :                 goto out_fmt;
    2351                 :            :         }
    2352                 :            :         /* Filesystems outside of init_user_ns not yet supported */
    2353         [ #  # ]:          0 :         if (sb->s_user_ns != &init_user_ns) {
    2354                 :          0 :                 error = -EINVAL;
    2355                 :          0 :                 goto out_fmt;
    2356                 :            :         }
    2357                 :            :         /* Usage always has to be set... */
    2358         [ #  # ]:          0 :         if (!(flags & DQUOT_USAGE_ENABLED)) {
    2359                 :          0 :                 error = -EINVAL;
    2360                 :          0 :                 goto out_fmt;
    2361                 :            :         }
    2362         [ #  # ]:          0 :         if (sb_has_quota_loaded(sb, type)) {
    2363                 :          0 :                 error = -EBUSY;
    2364                 :          0 :                 goto out_fmt;
    2365                 :            :         }
    2366                 :            : 
    2367         [ #  # ]:          0 :         if (!(dqopt->flags & DQUOT_QUOTA_SYS_FILE)) {
    2368                 :            :                 /* As we bypass the pagecache we must now flush all the
    2369                 :            :                  * dirty data and invalidate caches so that kernel sees
    2370                 :            :                  * changes from userspace. It is not enough to just flush
    2371                 :            :                  * the quota file since if blocksize < pagesize, invalidation
    2372                 :            :                  * of the cache could fail because of other unrelated dirty
    2373                 :            :                  * data */
    2374                 :          0 :                 sync_filesystem(sb);
    2375                 :          0 :                 invalidate_bdev(sb->s_bdev);
    2376                 :            :         }
    2377                 :            : 
    2378                 :          0 :         error = -EINVAL;
    2379         [ #  # ]:          0 :         if (!fmt->qf_ops->check_quota_file(sb, type))
    2380                 :          0 :                 goto out_fmt;
    2381                 :            : 
    2382                 :          0 :         dqopt->ops[type] = fmt->qf_ops;
    2383                 :          0 :         dqopt->info[type].dqi_format = fmt;
    2384                 :          0 :         dqopt->info[type].dqi_fmt_id = format_id;
    2385                 :          0 :         INIT_LIST_HEAD(&dqopt->info[type].dqi_dirty_list);
    2386                 :          0 :         error = dqopt->ops[type]->read_file_info(sb, type);
    2387         [ #  # ]:          0 :         if (error < 0)
    2388                 :          0 :                 goto out_fmt;
    2389         [ #  # ]:          0 :         if (dqopt->flags & DQUOT_QUOTA_SYS_FILE) {
    2390                 :          0 :                 spin_lock(&dq_data_lock);
    2391                 :          0 :                 dqopt->info[type].dqi_flags |= DQF_SYS_FILE;
    2392                 :          0 :                 spin_unlock(&dq_data_lock);
    2393                 :            :         }
    2394                 :          0 :         spin_lock(&dq_state_lock);
    2395                 :          0 :         dqopt->flags |= dquot_state_flag(flags, type);
    2396                 :          0 :         spin_unlock(&dq_state_lock);
    2397                 :            : 
    2398                 :          0 :         error = add_dquot_ref(sb, type);
    2399         [ #  # ]:          0 :         if (error)
    2400                 :          0 :                 dquot_disable(sb, type, flags);
    2401                 :            : 
    2402                 :            :         return error;
    2403                 :          0 : out_fmt:
    2404                 :          0 :         put_quota_format(fmt);
    2405                 :            : 
    2406                 :          0 :         return error;
    2407                 :            : }
    2408                 :            : EXPORT_SYMBOL(dquot_load_quota_sb);
    2409                 :            : 
    2410                 :            : /*
    2411                 :            :  * More powerful function for turning on quotas on given quota inode allowing
    2412                 :            :  * setting of individual quota flags
    2413                 :            :  */
    2414                 :          0 : int dquot_load_quota_inode(struct inode *inode, int type, int format_id,
    2415                 :            :         unsigned int flags)
    2416                 :            : {
    2417                 :          0 :         int err;
    2418                 :            : 
    2419                 :          0 :         err = vfs_setup_quota_inode(inode, type);
    2420         [ #  # ]:          0 :         if (err < 0)
    2421                 :            :                 return err;
    2422                 :          0 :         err = dquot_load_quota_sb(inode->i_sb, type, format_id, flags);
    2423         [ #  # ]:          0 :         if (err < 0)
    2424                 :          0 :                 vfs_cleanup_quota_inode(inode->i_sb, type);
    2425                 :            :         return err;
    2426                 :            : }
    2427                 :            : EXPORT_SYMBOL(dquot_load_quota_inode);
    2428                 :            : 
    2429                 :            : /* Reenable quotas on remount RW */
    2430                 :          0 : int dquot_resume(struct super_block *sb, int type)
    2431                 :            : {
    2432                 :          0 :         struct quota_info *dqopt = sb_dqopt(sb);
    2433                 :          0 :         int ret = 0, cnt;
    2434                 :          0 :         unsigned int flags;
    2435                 :            : 
    2436                 :            :         /* s_umount should be held in exclusive mode */
    2437   [ #  #  #  # ]:          0 :         if (WARN_ON_ONCE(down_read_trylock(&sb->s_umount)))
    2438                 :          0 :                 up_read(&sb->s_umount);
    2439                 :            : 
    2440         [ #  # ]:          0 :         for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
    2441         [ #  # ]:          0 :                 if (type != -1 && cnt != type)
    2442                 :          0 :                         continue;
    2443         [ #  # ]:          0 :                 if (!sb_has_quota_suspended(sb, cnt))
    2444                 :          0 :                         continue;
    2445                 :            : 
    2446                 :          0 :                 spin_lock(&dq_state_lock);
    2447                 :          0 :                 flags = dqopt->flags & dquot_state_flag(DQUOT_USAGE_ENABLED |
    2448                 :            :                                                         DQUOT_LIMITS_ENABLED,
    2449                 :            :                                                         cnt);
    2450                 :          0 :                 dqopt->flags &= ~dquot_state_flag(DQUOT_STATE_FLAGS, cnt);
    2451                 :          0 :                 spin_unlock(&dq_state_lock);
    2452                 :            : 
    2453                 :          0 :                 flags = dquot_generic_flag(flags, cnt);
    2454                 :          0 :                 ret = dquot_load_quota_sb(sb, cnt, dqopt->info[cnt].dqi_fmt_id,
    2455                 :            :                                           flags);
    2456         [ #  # ]:          0 :                 if (ret < 0)
    2457                 :          0 :                         vfs_cleanup_quota_inode(sb, type);
    2458                 :            :         }
    2459                 :            : 
    2460                 :          0 :         return ret;
    2461                 :            : }
    2462                 :            : EXPORT_SYMBOL(dquot_resume);
    2463                 :            : 
    2464                 :          0 : int dquot_quota_on(struct super_block *sb, int type, int format_id,
    2465                 :            :                    const struct path *path)
    2466                 :            : {
    2467                 :          0 :         int error = security_quota_on(path->dentry);
    2468         [ #  # ]:          0 :         if (error)
    2469                 :            :                 return error;
    2470                 :            :         /* Quota file not on the same filesystem? */
    2471         [ #  # ]:          0 :         if (path->dentry->d_sb != sb)
    2472                 :            :                 error = -EXDEV;
    2473                 :            :         else
    2474                 :          0 :                 error = dquot_load_quota_inode(d_inode(path->dentry), type,
    2475                 :            :                                              format_id, DQUOT_USAGE_ENABLED |
    2476                 :            :                                              DQUOT_LIMITS_ENABLED);
    2477                 :            :         return error;
    2478                 :            : }
    2479                 :            : EXPORT_SYMBOL(dquot_quota_on);
    2480                 :            : 
    2481                 :            : /*
    2482                 :            :  * This function is used when filesystem needs to initialize quotas
    2483                 :            :  * during mount time.
    2484                 :            :  */
    2485                 :          0 : int dquot_quota_on_mount(struct super_block *sb, char *qf_name,
    2486                 :            :                 int format_id, int type)
    2487                 :            : {
    2488                 :          0 :         struct dentry *dentry;
    2489                 :          0 :         int error;
    2490                 :            : 
    2491                 :          0 :         dentry = lookup_positive_unlocked(qf_name, sb->s_root, strlen(qf_name));
    2492         [ #  # ]:          0 :         if (IS_ERR(dentry))
    2493                 :          0 :                 return PTR_ERR(dentry);
    2494                 :            : 
    2495                 :          0 :         error = security_quota_on(dentry);
    2496         [ #  # ]:          0 :         if (!error)
    2497                 :          0 :                 error = dquot_load_quota_inode(d_inode(dentry), type, format_id,
    2498                 :            :                                 DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED);
    2499                 :            : 
    2500                 :          0 :         dput(dentry);
    2501                 :          0 :         return error;
    2502                 :            : }
    2503                 :            : EXPORT_SYMBOL(dquot_quota_on_mount);
    2504                 :            : 
    2505                 :          0 : static int dquot_quota_enable(struct super_block *sb, unsigned int flags)
    2506                 :            : {
    2507                 :          0 :         int ret;
    2508                 :          0 :         int type;
    2509         [ #  # ]:          0 :         struct quota_info *dqopt = sb_dqopt(sb);
    2510                 :            : 
    2511         [ #  # ]:          0 :         if (!(dqopt->flags & DQUOT_QUOTA_SYS_FILE))
    2512                 :            :                 return -ENOSYS;
    2513                 :            :         /* Accounting cannot be turned on while fs is mounted */
    2514                 :          0 :         flags &= ~(FS_QUOTA_UDQ_ACCT | FS_QUOTA_GDQ_ACCT | FS_QUOTA_PDQ_ACCT);
    2515         [ #  # ]:          0 :         if (!flags)
    2516                 :            :                 return -EINVAL;
    2517         [ #  # ]:          0 :         for (type = 0; type < MAXQUOTAS; type++) {
    2518         [ #  # ]:          0 :                 if (!(flags & qtype_enforce_flag(type)))
    2519                 :          0 :                         continue;
    2520                 :            :                 /* Can't enforce without accounting */
    2521         [ #  # ]:          0 :                 if (!sb_has_quota_usage_enabled(sb, type)) {
    2522                 :          0 :                         ret = -EINVAL;
    2523                 :          0 :                         goto out_err;
    2524                 :            :                 }
    2525         [ #  # ]:          0 :                 if (sb_has_quota_limits_enabled(sb, type)) {
    2526                 :          0 :                         ret = -EBUSY;
    2527                 :          0 :                         goto out_err;
    2528                 :            :                 }
    2529                 :          0 :                 spin_lock(&dq_state_lock);
    2530                 :          0 :                 dqopt->flags |= dquot_state_flag(DQUOT_LIMITS_ENABLED, type);
    2531                 :          0 :                 spin_unlock(&dq_state_lock);
    2532                 :            :         }
    2533                 :            :         return 0;
    2534                 :          0 : out_err:
    2535                 :            :         /* Backout enforcement enablement we already did */
    2536         [ #  # ]:          0 :         for (type--; type >= 0; type--)  {
    2537         [ #  # ]:          0 :                 if (flags & qtype_enforce_flag(type))
    2538                 :          0 :                         dquot_disable(sb, type, DQUOT_LIMITS_ENABLED);
    2539                 :            :         }
    2540                 :            :         /* Error code translation for better compatibility with XFS */
    2541         [ #  # ]:          0 :         if (ret == -EBUSY)
    2542                 :          0 :                 ret = -EEXIST;
    2543                 :            :         return ret;
    2544                 :            : }
    2545                 :            : 
    2546                 :          0 : static int dquot_quota_disable(struct super_block *sb, unsigned int flags)
    2547                 :            : {
    2548                 :          0 :         int ret;
    2549                 :          0 :         int type;
    2550         [ #  # ]:          0 :         struct quota_info *dqopt = sb_dqopt(sb);
    2551                 :            : 
    2552         [ #  # ]:          0 :         if (!(dqopt->flags & DQUOT_QUOTA_SYS_FILE))
    2553                 :            :                 return -ENOSYS;
    2554                 :            :         /*
    2555                 :            :          * We don't support turning off accounting via quotactl. In principle
    2556                 :            :          * quota infrastructure can do this but filesystems don't expect
    2557                 :            :          * userspace to be able to do it.
    2558                 :            :          */
    2559         [ #  # ]:          0 :         if (flags &
    2560                 :            :                   (FS_QUOTA_UDQ_ACCT | FS_QUOTA_GDQ_ACCT | FS_QUOTA_PDQ_ACCT))
    2561                 :            :                 return -EOPNOTSUPP;
    2562                 :            : 
    2563                 :            :         /* Filter out limits not enabled */
    2564         [ #  # ]:          0 :         for (type = 0; type < MAXQUOTAS; type++)
    2565         [ #  # ]:          0 :                 if (!sb_has_quota_limits_enabled(sb, type))
    2566                 :          0 :                         flags &= ~qtype_enforce_flag(type);
    2567                 :            :         /* Nothing left? */
    2568         [ #  # ]:          0 :         if (!flags)
    2569                 :            :                 return -EEXIST;
    2570         [ #  # ]:          0 :         for (type = 0; type < MAXQUOTAS; type++) {
    2571         [ #  # ]:          0 :                 if (flags & qtype_enforce_flag(type)) {
    2572                 :          0 :                         ret = dquot_disable(sb, type, DQUOT_LIMITS_ENABLED);
    2573         [ #  # ]:          0 :                         if (ret < 0)
    2574                 :          0 :                                 goto out_err;
    2575                 :            :                 }
    2576                 :            :         }
    2577                 :            :         return 0;
    2578                 :            : out_err:
    2579                 :            :         /* Backout enforcement disabling we already did */
    2580         [ #  # ]:          0 :         for (type--; type >= 0; type--)  {
    2581         [ #  # ]:          0 :                 if (flags & qtype_enforce_flag(type)) {
    2582                 :          0 :                         spin_lock(&dq_state_lock);
    2583                 :          0 :                         dqopt->flags |=
    2584                 :            :                                 dquot_state_flag(DQUOT_LIMITS_ENABLED, type);
    2585                 :          0 :                         spin_unlock(&dq_state_lock);
    2586                 :            :                 }
    2587                 :            :         }
    2588                 :            :         return ret;
    2589                 :            : }
    2590                 :            : 
    2591                 :            : /* Generic routine for getting common part of quota structure */
    2592                 :          0 : static void do_get_dqblk(struct dquot *dquot, struct qc_dqblk *di)
    2593                 :            : {
    2594                 :          0 :         struct mem_dqblk *dm = &dquot->dq_dqb;
    2595                 :            : 
    2596                 :          0 :         memset(di, 0, sizeof(*di));
    2597                 :          0 :         spin_lock(&dquot->dq_dqb_lock);
    2598                 :          0 :         di->d_spc_hardlimit = dm->dqb_bhardlimit;
    2599                 :          0 :         di->d_spc_softlimit = dm->dqb_bsoftlimit;
    2600                 :          0 :         di->d_ino_hardlimit = dm->dqb_ihardlimit;
    2601                 :          0 :         di->d_ino_softlimit = dm->dqb_isoftlimit;
    2602                 :          0 :         di->d_space = dm->dqb_curspace + dm->dqb_rsvspace;
    2603                 :          0 :         di->d_ino_count = dm->dqb_curinodes;
    2604                 :          0 :         di->d_spc_timer = dm->dqb_btime;
    2605                 :          0 :         di->d_ino_timer = dm->dqb_itime;
    2606                 :          0 :         spin_unlock(&dquot->dq_dqb_lock);
    2607                 :          0 : }
    2608                 :            : 
    2609                 :          0 : int dquot_get_dqblk(struct super_block *sb, struct kqid qid,
    2610                 :            :                     struct qc_dqblk *di)
    2611                 :            : {
    2612                 :          0 :         struct dquot *dquot;
    2613                 :            : 
    2614                 :          0 :         dquot = dqget(sb, qid);
    2615         [ #  # ]:          0 :         if (IS_ERR(dquot))
    2616                 :          0 :                 return PTR_ERR(dquot);
    2617                 :          0 :         do_get_dqblk(dquot, di);
    2618                 :          0 :         dqput(dquot);
    2619                 :            : 
    2620                 :          0 :         return 0;
    2621                 :            : }
    2622                 :            : EXPORT_SYMBOL(dquot_get_dqblk);
    2623                 :            : 
    2624                 :          0 : int dquot_get_next_dqblk(struct super_block *sb, struct kqid *qid,
    2625                 :            :                          struct qc_dqblk *di)
    2626                 :            : {
    2627                 :          0 :         struct dquot *dquot;
    2628                 :          0 :         int err;
    2629                 :            : 
    2630         [ #  # ]:          0 :         if (!sb->dq_op->get_next_id)
    2631                 :            :                 return -ENOSYS;
    2632                 :          0 :         err = sb->dq_op->get_next_id(sb, qid);
    2633         [ #  # ]:          0 :         if (err < 0)
    2634                 :            :                 return err;
    2635                 :          0 :         dquot = dqget(sb, *qid);
    2636         [ #  # ]:          0 :         if (IS_ERR(dquot))
    2637                 :          0 :                 return PTR_ERR(dquot);
    2638                 :          0 :         do_get_dqblk(dquot, di);
    2639                 :          0 :         dqput(dquot);
    2640                 :            : 
    2641                 :          0 :         return 0;
    2642                 :            : }
    2643                 :            : EXPORT_SYMBOL(dquot_get_next_dqblk);
    2644                 :            : 
    2645                 :            : #define VFS_QC_MASK \
    2646                 :            :         (QC_SPACE | QC_SPC_SOFT | QC_SPC_HARD | \
    2647                 :            :          QC_INO_COUNT | QC_INO_SOFT | QC_INO_HARD | \
    2648                 :            :          QC_SPC_TIMER | QC_INO_TIMER)
    2649                 :            : 
    2650                 :            : /* Generic routine for setting common part of quota structure */
    2651                 :          0 : static int do_set_dqblk(struct dquot *dquot, struct qc_dqblk *di)
    2652                 :            : {
    2653                 :          0 :         struct mem_dqblk *dm = &dquot->dq_dqb;
    2654                 :          0 :         int check_blim = 0, check_ilim = 0;
    2655         [ #  # ]:          0 :         struct mem_dqinfo *dqi = &sb_dqopt(dquot->dq_sb)->info[dquot->dq_id.type];
    2656                 :            : 
    2657         [ #  # ]:          0 :         if (di->d_fieldmask & ~VFS_QC_MASK)
    2658                 :            :                 return -EINVAL;
    2659                 :            : 
    2660         [ #  # ]:          0 :         if (((di->d_fieldmask & QC_SPC_SOFT) &&
    2661         [ #  # ]:          0 :              di->d_spc_softlimit > dqi->dqi_max_spc_limit) ||
    2662         [ #  # ]:          0 :             ((di->d_fieldmask & QC_SPC_HARD) &&
    2663         [ #  # ]:          0 :              di->d_spc_hardlimit > dqi->dqi_max_spc_limit) ||
    2664         [ #  # ]:          0 :             ((di->d_fieldmask & QC_INO_SOFT) &&
    2665         [ #  # ]:          0 :              (di->d_ino_softlimit > dqi->dqi_max_ino_limit)) ||
    2666         [ #  # ]:          0 :             ((di->d_fieldmask & QC_INO_HARD) &&
    2667         [ #  # ]:          0 :              (di->d_ino_hardlimit > dqi->dqi_max_ino_limit)))
    2668                 :            :                 return -ERANGE;
    2669                 :            : 
    2670                 :          0 :         spin_lock(&dquot->dq_dqb_lock);
    2671         [ #  # ]:          0 :         if (di->d_fieldmask & QC_SPACE) {
    2672                 :          0 :                 dm->dqb_curspace = di->d_space - dm->dqb_rsvspace;
    2673                 :          0 :                 check_blim = 1;
    2674                 :          0 :                 set_bit(DQ_LASTSET_B + QIF_SPACE_B, &dquot->dq_flags);
    2675                 :            :         }
    2676                 :            : 
    2677         [ #  # ]:          0 :         if (di->d_fieldmask & QC_SPC_SOFT)
    2678                 :          0 :                 dm->dqb_bsoftlimit = di->d_spc_softlimit;
    2679         [ #  # ]:          0 :         if (di->d_fieldmask & QC_SPC_HARD)
    2680                 :          0 :                 dm->dqb_bhardlimit = di->d_spc_hardlimit;
    2681         [ #  # ]:          0 :         if (di->d_fieldmask & (QC_SPC_SOFT | QC_SPC_HARD)) {
    2682                 :          0 :                 check_blim = 1;
    2683                 :          0 :                 set_bit(DQ_LASTSET_B + QIF_BLIMITS_B, &dquot->dq_flags);
    2684                 :            :         }
    2685                 :            : 
    2686         [ #  # ]:          0 :         if (di->d_fieldmask & QC_INO_COUNT) {
    2687                 :          0 :                 dm->dqb_curinodes = di->d_ino_count;
    2688                 :          0 :                 check_ilim = 1;
    2689                 :          0 :                 set_bit(DQ_LASTSET_B + QIF_INODES_B, &dquot->dq_flags);
    2690                 :            :         }
    2691                 :            : 
    2692         [ #  # ]:          0 :         if (di->d_fieldmask & QC_INO_SOFT)
    2693                 :          0 :                 dm->dqb_isoftlimit = di->d_ino_softlimit;
    2694         [ #  # ]:          0 :         if (di->d_fieldmask & QC_INO_HARD)
    2695                 :          0 :                 dm->dqb_ihardlimit = di->d_ino_hardlimit;
    2696         [ #  # ]:          0 :         if (di->d_fieldmask & (QC_INO_SOFT | QC_INO_HARD)) {
    2697                 :          0 :                 check_ilim = 1;
    2698                 :          0 :                 set_bit(DQ_LASTSET_B + QIF_ILIMITS_B, &dquot->dq_flags);
    2699                 :            :         }
    2700                 :            : 
    2701         [ #  # ]:          0 :         if (di->d_fieldmask & QC_SPC_TIMER) {
    2702                 :          0 :                 dm->dqb_btime = di->d_spc_timer;
    2703                 :          0 :                 check_blim = 1;
    2704                 :          0 :                 set_bit(DQ_LASTSET_B + QIF_BTIME_B, &dquot->dq_flags);
    2705                 :            :         }
    2706                 :            : 
    2707         [ #  # ]:          0 :         if (di->d_fieldmask & QC_INO_TIMER) {
    2708                 :          0 :                 dm->dqb_itime = di->d_ino_timer;
    2709                 :          0 :                 check_ilim = 1;
    2710                 :          0 :                 set_bit(DQ_LASTSET_B + QIF_ITIME_B, &dquot->dq_flags);
    2711                 :            :         }
    2712                 :            : 
    2713         [ #  # ]:          0 :         if (check_blim) {
    2714         [ #  # ]:          0 :                 if (!dm->dqb_bsoftlimit ||
    2715         [ #  # ]:          0 :                     dm->dqb_curspace + dm->dqb_rsvspace <= dm->dqb_bsoftlimit) {
    2716                 :          0 :                         dm->dqb_btime = 0;
    2717                 :          0 :                         clear_bit(DQ_BLKS_B, &dquot->dq_flags);
    2718         [ #  # ]:          0 :                 } else if (!(di->d_fieldmask & QC_SPC_TIMER))
    2719                 :            :                         /* Set grace only if user hasn't provided his own... */
    2720                 :          0 :                         dm->dqb_btime = ktime_get_real_seconds() + dqi->dqi_bgrace;
    2721                 :            :         }
    2722         [ #  # ]:          0 :         if (check_ilim) {
    2723         [ #  # ]:          0 :                 if (!dm->dqb_isoftlimit ||
    2724         [ #  # ]:          0 :                     dm->dqb_curinodes <= dm->dqb_isoftlimit) {
    2725                 :          0 :                         dm->dqb_itime = 0;
    2726                 :          0 :                         clear_bit(DQ_INODES_B, &dquot->dq_flags);
    2727         [ #  # ]:          0 :                 } else if (!(di->d_fieldmask & QC_INO_TIMER))
    2728                 :            :                         /* Set grace only if user hasn't provided his own... */
    2729                 :          0 :                         dm->dqb_itime = ktime_get_real_seconds() + dqi->dqi_igrace;
    2730                 :            :         }
    2731   [ #  #  #  #  :          0 :         if (dm->dqb_bhardlimit || dm->dqb_bsoftlimit || dm->dqb_ihardlimit ||
                   #  # ]
    2732         [ #  # ]:          0 :             dm->dqb_isoftlimit)
    2733                 :          0 :                 clear_bit(DQ_FAKE_B, &dquot->dq_flags);
    2734                 :            :         else
    2735                 :          0 :                 set_bit(DQ_FAKE_B, &dquot->dq_flags);
    2736                 :          0 :         spin_unlock(&dquot->dq_dqb_lock);
    2737                 :          0 :         mark_dquot_dirty(dquot);
    2738                 :            : 
    2739                 :          0 :         return 0;
    2740                 :            : }
    2741                 :            : 
    2742                 :          0 : int dquot_set_dqblk(struct super_block *sb, struct kqid qid,
    2743                 :            :                   struct qc_dqblk *di)
    2744                 :            : {
    2745                 :          0 :         struct dquot *dquot;
    2746                 :          0 :         int rc;
    2747                 :            : 
    2748                 :          0 :         dquot = dqget(sb, qid);
    2749         [ #  # ]:          0 :         if (IS_ERR(dquot)) {
    2750                 :          0 :                 rc = PTR_ERR(dquot);
    2751                 :          0 :                 goto out;
    2752                 :            :         }
    2753                 :          0 :         rc = do_set_dqblk(dquot, di);
    2754                 :          0 :         dqput(dquot);
    2755                 :          0 : out:
    2756                 :          0 :         return rc;
    2757                 :            : }
    2758                 :            : EXPORT_SYMBOL(dquot_set_dqblk);
    2759                 :            : 
    2760                 :            : /* Generic routine for getting common part of quota file information */
    2761                 :          0 : int dquot_get_state(struct super_block *sb, struct qc_state *state)
    2762                 :            : {
    2763                 :          0 :         struct mem_dqinfo *mi;
    2764                 :          0 :         struct qc_type_state *tstate;
    2765                 :          0 :         struct quota_info *dqopt = sb_dqopt(sb);
    2766                 :          0 :         int type;
    2767                 :            : 
    2768                 :          0 :         memset(state, 0, sizeof(*state));
    2769         [ #  # ]:          0 :         for (type = 0; type < MAXQUOTAS; type++) {
    2770   [ #  #  #  # ]:          0 :                 if (!sb_has_quota_active(sb, type))
    2771                 :          0 :                         continue;
    2772                 :          0 :                 tstate = state->s_state + type;
    2773                 :          0 :                 mi = sb_dqopt(sb)->info + type;
    2774                 :          0 :                 tstate->flags = QCI_ACCT_ENABLED;
    2775                 :          0 :                 spin_lock(&dq_data_lock);
    2776         [ #  # ]:          0 :                 if (mi->dqi_flags & DQF_SYS_FILE)
    2777                 :          0 :                         tstate->flags |= QCI_SYSFILE;
    2778         [ #  # ]:          0 :                 if (mi->dqi_flags & DQF_ROOT_SQUASH)
    2779                 :          0 :                         tstate->flags |= QCI_ROOT_SQUASH;
    2780         [ #  # ]:          0 :                 if (sb_has_quota_limits_enabled(sb, type))
    2781                 :          0 :                         tstate->flags |= QCI_LIMITS_ENFORCED;
    2782                 :          0 :                 tstate->spc_timelimit = mi->dqi_bgrace;
    2783                 :          0 :                 tstate->ino_timelimit = mi->dqi_igrace;
    2784         [ #  # ]:          0 :                 if (dqopt->files[type]) {
    2785                 :          0 :                         tstate->ino = dqopt->files[type]->i_ino;
    2786                 :          0 :                         tstate->blocks = dqopt->files[type]->i_blocks;
    2787                 :            :                 }
    2788                 :          0 :                 tstate->nextents = 1;        /* We don't know... */
    2789                 :          0 :                 spin_unlock(&dq_data_lock);
    2790                 :            :         }
    2791                 :          0 :         return 0;
    2792                 :            : }
    2793                 :            : EXPORT_SYMBOL(dquot_get_state);
    2794                 :            : 
    2795                 :            : /* Generic routine for setting common part of quota file information */
    2796                 :          0 : int dquot_set_dqinfo(struct super_block *sb, int type, struct qc_info *ii)
    2797                 :            : {
    2798                 :          0 :         struct mem_dqinfo *mi;
    2799                 :          0 :         int err = 0;
    2800                 :            : 
    2801         [ #  # ]:          0 :         if ((ii->i_fieldmask & QC_WARNS_MASK) ||
    2802                 :            :             (ii->i_fieldmask & QC_RT_SPC_TIMER))
    2803                 :            :                 return -EINVAL;
    2804   [ #  #  #  # ]:          0 :         if (!sb_has_quota_active(sb, type))
    2805                 :            :                 return -ESRCH;
    2806         [ #  # ]:          0 :         mi = sb_dqopt(sb)->info + type;
    2807         [ #  # ]:          0 :         if (ii->i_fieldmask & QC_FLAGS) {
    2808         [ #  # ]:          0 :                 if ((ii->i_flags & QCI_ROOT_SQUASH &&
    2809         [ #  # ]:          0 :                      mi->dqi_format->qf_fmt_id != QFMT_VFS_OLD))
    2810                 :            :                         return -EINVAL;
    2811                 :            :         }
    2812                 :          0 :         spin_lock(&dq_data_lock);
    2813         [ #  # ]:          0 :         if (ii->i_fieldmask & QC_SPC_TIMER)
    2814                 :          0 :                 mi->dqi_bgrace = ii->i_spc_timelimit;
    2815         [ #  # ]:          0 :         if (ii->i_fieldmask & QC_INO_TIMER)
    2816                 :          0 :                 mi->dqi_igrace = ii->i_ino_timelimit;
    2817         [ #  # ]:          0 :         if (ii->i_fieldmask & QC_FLAGS) {
    2818         [ #  # ]:          0 :                 if (ii->i_flags & QCI_ROOT_SQUASH)
    2819                 :          0 :                         mi->dqi_flags |= DQF_ROOT_SQUASH;
    2820                 :            :                 else
    2821                 :          0 :                         mi->dqi_flags &= ~DQF_ROOT_SQUASH;
    2822                 :            :         }
    2823                 :          0 :         spin_unlock(&dq_data_lock);
    2824                 :          0 :         mark_info_dirty(sb, type);
    2825                 :            :         /* Force write to disk */
    2826                 :          0 :         sb->dq_op->write_info(sb, type);
    2827                 :          0 :         return err;
    2828                 :            : }
    2829                 :            : EXPORT_SYMBOL(dquot_set_dqinfo);
    2830                 :            : 
    2831                 :            : const struct quotactl_ops dquot_quotactl_sysfile_ops = {
    2832                 :            :         .quota_enable   = dquot_quota_enable,
    2833                 :            :         .quota_disable  = dquot_quota_disable,
    2834                 :            :         .quota_sync     = dquot_quota_sync,
    2835                 :            :         .get_state      = dquot_get_state,
    2836                 :            :         .set_info       = dquot_set_dqinfo,
    2837                 :            :         .get_dqblk      = dquot_get_dqblk,
    2838                 :            :         .get_nextdqblk  = dquot_get_next_dqblk,
    2839                 :            :         .set_dqblk      = dquot_set_dqblk
    2840                 :            : };
    2841                 :            : EXPORT_SYMBOL(dquot_quotactl_sysfile_ops);
    2842                 :            : 
    2843                 :          0 : static int do_proc_dqstats(struct ctl_table *table, int write,
    2844                 :            :                      void __user *buffer, size_t *lenp, loff_t *ppos)
    2845                 :            : {
    2846                 :          0 :         unsigned int type = (unsigned long *)table->data - dqstats.stat;
    2847                 :          0 :         s64 value = percpu_counter_sum(&dqstats.counter[type]);
    2848                 :            : 
    2849                 :            :         /* Filter negative values for non-monotonic counters */
    2850   [ #  #  #  # ]:          0 :         if (value < 0 && (type == DQST_ALLOC_DQUOTS ||
    2851                 :            :                           type == DQST_FREE_DQUOTS))
    2852                 :          0 :                 value = 0;
    2853                 :            : 
    2854                 :            :         /* Update global table */
    2855                 :          0 :         dqstats.stat[type] = value;
    2856                 :          0 :         return proc_doulongvec_minmax(table, write, buffer, lenp, ppos);
    2857                 :            : }
    2858                 :            : 
    2859                 :            : static struct ctl_table fs_dqstats_table[] = {
    2860                 :            :         {
    2861                 :            :                 .procname       = "lookups",
    2862                 :            :                 .data           = &dqstats.stat[DQST_LOOKUPS],
    2863                 :            :                 .maxlen         = sizeof(unsigned long),
    2864                 :            :                 .mode           = 0444,
    2865                 :            :                 .proc_handler   = do_proc_dqstats,
    2866                 :            :         },
    2867                 :            :         {
    2868                 :            :                 .procname       = "drops",
    2869                 :            :                 .data           = &dqstats.stat[DQST_DROPS],
    2870                 :            :                 .maxlen         = sizeof(unsigned long),
    2871                 :            :                 .mode           = 0444,
    2872                 :            :                 .proc_handler   = do_proc_dqstats,
    2873                 :            :         },
    2874                 :            :         {
    2875                 :            :                 .procname       = "reads",
    2876                 :            :                 .data           = &dqstats.stat[DQST_READS],
    2877                 :            :                 .maxlen         = sizeof(unsigned long),
    2878                 :            :                 .mode           = 0444,
    2879                 :            :                 .proc_handler   = do_proc_dqstats,
    2880                 :            :         },
    2881                 :            :         {
    2882                 :            :                 .procname       = "writes",
    2883                 :            :                 .data           = &dqstats.stat[DQST_WRITES],
    2884                 :            :                 .maxlen         = sizeof(unsigned long),
    2885                 :            :                 .mode           = 0444,
    2886                 :            :                 .proc_handler   = do_proc_dqstats,
    2887                 :            :         },
    2888                 :            :         {
    2889                 :            :                 .procname       = "cache_hits",
    2890                 :            :                 .data           = &dqstats.stat[DQST_CACHE_HITS],
    2891                 :            :                 .maxlen         = sizeof(unsigned long),
    2892                 :            :                 .mode           = 0444,
    2893                 :            :                 .proc_handler   = do_proc_dqstats,
    2894                 :            :         },
    2895                 :            :         {
    2896                 :            :                 .procname       = "allocated_dquots",
    2897                 :            :                 .data           = &dqstats.stat[DQST_ALLOC_DQUOTS],
    2898                 :            :                 .maxlen         = sizeof(unsigned long),
    2899                 :            :                 .mode           = 0444,
    2900                 :            :                 .proc_handler   = do_proc_dqstats,
    2901                 :            :         },
    2902                 :            :         {
    2903                 :            :                 .procname       = "free_dquots",
    2904                 :            :                 .data           = &dqstats.stat[DQST_FREE_DQUOTS],
    2905                 :            :                 .maxlen         = sizeof(unsigned long),
    2906                 :            :                 .mode           = 0444,
    2907                 :            :                 .proc_handler   = do_proc_dqstats,
    2908                 :            :         },
    2909                 :            :         {
    2910                 :            :                 .procname       = "syncs",
    2911                 :            :                 .data           = &dqstats.stat[DQST_SYNCS],
    2912                 :            :                 .maxlen         = sizeof(unsigned long),
    2913                 :            :                 .mode           = 0444,
    2914                 :            :                 .proc_handler   = do_proc_dqstats,
    2915                 :            :         },
    2916                 :            : #ifdef CONFIG_PRINT_QUOTA_WARNING
    2917                 :            :         {
    2918                 :            :                 .procname       = "warnings",
    2919                 :            :                 .data           = &flag_print_warnings,
    2920                 :            :                 .maxlen         = sizeof(int),
    2921                 :            :                 .mode           = 0644,
    2922                 :            :                 .proc_handler   = proc_dointvec,
    2923                 :            :         },
    2924                 :            : #endif
    2925                 :            :         { },
    2926                 :            : };
    2927                 :            : 
    2928                 :            : static struct ctl_table fs_table[] = {
    2929                 :            :         {
    2930                 :            :                 .procname       = "quota",
    2931                 :            :                 .mode           = 0555,
    2932                 :            :                 .child          = fs_dqstats_table,
    2933                 :            :         },
    2934                 :            :         { },
    2935                 :            : };
    2936                 :            : 
    2937                 :            : static struct ctl_table sys_table[] = {
    2938                 :            :         {
    2939                 :            :                 .procname       = "fs",
    2940                 :            :                 .mode           = 0555,
    2941                 :            :                 .child          = fs_table,
    2942                 :            :         },
    2943                 :            :         { },
    2944                 :            : };
    2945                 :            : 
    2946                 :         13 : static int __init dquot_init(void)
    2947                 :            : {
    2948                 :         13 :         int i, ret;
    2949                 :         13 :         unsigned long nr_hash, order;
    2950                 :            : 
    2951                 :         13 :         printk(KERN_NOTICE "VFS: Disk quotas %s\n", __DQUOT_VERSION__);
    2952                 :            : 
    2953                 :         13 :         register_sysctl_table(sys_table);
    2954                 :            : 
    2955                 :         13 :         dquot_cachep = kmem_cache_create("dquot",
    2956                 :            :                         sizeof(struct dquot), sizeof(unsigned long) * 4,
    2957                 :            :                         (SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT|
    2958                 :            :                                 SLAB_MEM_SPREAD|SLAB_PANIC),
    2959                 :            :                         NULL);
    2960                 :            : 
    2961                 :         13 :         order = 0;
    2962                 :         13 :         dquot_hash = (struct hlist_head *)__get_free_pages(GFP_KERNEL, order);
    2963         [ +  - ]:         13 :         if (!dquot_hash)
    2964                 :          0 :                 panic("Cannot create dquot hash table");
    2965                 :            : 
    2966         [ +  + ]:        117 :         for (i = 0; i < _DQST_DQSTAT_LAST; i++) {
    2967                 :        104 :                 ret = percpu_counter_init(&dqstats.counter[i], 0, GFP_KERNEL);
    2968         [ -  + ]:        104 :                 if (ret)
    2969                 :          0 :                         panic("Cannot create dquot stat counters");
    2970                 :            :         }
    2971                 :            : 
    2972                 :            :         /* Find power-of-two hlist_heads which can fit into allocation */
    2973                 :         13 :         nr_hash = (1UL << order) * PAGE_SIZE / sizeof(struct hlist_head);
    2974                 :         13 :         dq_hash_bits = ilog2(nr_hash);
    2975                 :            : 
    2976                 :         13 :         nr_hash = 1UL << dq_hash_bits;
    2977                 :         13 :         dq_hash_mask = nr_hash - 1;
    2978         [ +  + ]:       6669 :         for (i = 0; i < nr_hash; i++)
    2979                 :       6656 :                 INIT_HLIST_HEAD(dquot_hash + i);
    2980                 :            : 
    2981                 :         13 :         pr_info("VFS: Dquot-cache hash table entries: %ld (order %ld,"
    2982                 :            :                 " %ld bytes)\n", nr_hash, order, (PAGE_SIZE << order));
    2983                 :            : 
    2984         [ -  + ]:         13 :         if (register_shrinker(&dqcache_shrinker))
    2985                 :          0 :                 panic("Cannot register dquot shrinker");
    2986                 :            : 
    2987                 :         13 :         return 0;
    2988                 :            : }
    2989                 :            : fs_initcall(dquot_init);

Generated by: LCOV version 1.14