LCOV - code coverage report
Current view: top level - fs/xfs - xfs_dquot.c (source / functions) Hit Total Coverage
Test: fstests of 6.5.0-rc3-djwa @ Mon Jul 31 20:08:17 PDT 2023 Lines: 548 592 92.6 %
Date: 2023-07-31 20:08:17 Functions: 35 35 100.0 %

          Line data    Source code
       1             : // SPDX-License-Identifier: GPL-2.0
       2             : /*
       3             :  * Copyright (c) 2000-2003 Silicon Graphics, Inc.
       4             :  * All Rights Reserved.
       5             :  */
       6             : #include "xfs.h"
       7             : #include "xfs_fs.h"
       8             : #include "xfs_format.h"
       9             : #include "xfs_log_format.h"
      10             : #include "xfs_shared.h"
      11             : #include "xfs_trans_resv.h"
      12             : #include "xfs_bit.h"
      13             : #include "xfs_mount.h"
      14             : #include "xfs_defer.h"
      15             : #include "xfs_inode.h"
      16             : #include "xfs_bmap.h"
      17             : #include "xfs_quota.h"
      18             : #include "xfs_trans.h"
      19             : #include "xfs_buf_item.h"
      20             : #include "xfs_trans_space.h"
      21             : #include "xfs_trans_priv.h"
      22             : #include "xfs_qm.h"
      23             : #include "xfs_trace.h"
      24             : #include "xfs_log.h"
      25             : #include "xfs_bmap_btree.h"
      26             : #include "xfs_error.h"
      27             : 
      28             : /*
      29             :  * Lock order:
      30             :  *
      31             :  * ip->i_lock
      32             :  *   qi->qi_tree_lock
      33             :  *     dquot->q_qlock (xfs_dqlock() and friends)
      34             :  *       dquot->q_flush (xfs_dqflock() and friends)
      35             :  *       qi->qi_lru_lock
      36             :  *
      37             :  * If two dquots need to be locked the order is user before group/project,
      38             :  * otherwise by the lowest id first, see xfs_dqlock2.
      39             :  */
      40             : 
      41             : struct kmem_cache               *xfs_dqtrx_cache;
      42             : static struct kmem_cache        *xfs_dquot_cache;
      43             : 
      44             : static struct lock_class_key xfs_dquot_group_class;
      45             : static struct lock_class_key xfs_dquot_project_class;
      46             : 
      47             : /*
      48             :  * This is called to free all the memory associated with a dquot
      49             :  */
      50             : void
      51     9806113 : xfs_qm_dqdestroy(
      52             :         struct xfs_dquot        *dqp)
      53             : {
      54     9806113 :         ASSERT(list_empty(&dqp->q_lru));
      55             : 
      56     9806113 :         kmem_free(dqp->q_logitem.qli_item.li_lv_shadow);
      57     9806114 :         mutex_destroy(&dqp->q_qlock);
      58             : 
      59     9806113 :         XFS_STATS_DEC(dqp->q_mount, xs_qm_dquot);
      60     9806113 :         kmem_cache_free(xfs_dquot_cache, dqp);
      61     9806114 : }
      62             : 
      63             : /*
      64             :  * If default limits are in force, push them into the dquot now.
      65             :  * We overwrite the dquot limits only if they are zero and this
      66             :  * is not the root dquot.
      67             :  */
      68             : void
      69   117834973 : xfs_qm_adjust_dqlimits(
      70             :         struct xfs_dquot        *dq)
      71             : {
      72   117834973 :         struct xfs_mount        *mp = dq->q_mount;
      73   117834973 :         struct xfs_quotainfo    *q = mp->m_quotainfo;
      74   117834973 :         struct xfs_def_quota    *defq;
      75   117834973 :         int                     prealloc = 0;
      76             : 
      77   117834973 :         ASSERT(dq->q_id);
      78   117834973 :         defq = xfs_get_defquota(q, xfs_dquot_type(dq));
      79             : 
      80   117835017 :         if (!dq->q_blk.softlimit) {
      81   117716907 :                 dq->q_blk.softlimit = defq->blk.soft;
      82   117716907 :                 prealloc = 1;
      83             :         }
      84   117835017 :         if (!dq->q_blk.hardlimit) {
      85   117714504 :                 dq->q_blk.hardlimit = defq->blk.hard;
      86   117714504 :                 prealloc = 1;
      87             :         }
      88   117835017 :         if (!dq->q_ino.softlimit)
      89   117723394 :                 dq->q_ino.softlimit = defq->ino.soft;
      90   117835017 :         if (!dq->q_ino.hardlimit)
      91   117722459 :                 dq->q_ino.hardlimit = defq->ino.hard;
      92   117835017 :         if (!dq->q_rtb.softlimit)
      93   117835495 :                 dq->q_rtb.softlimit = defq->rtb.soft;
      94   117835017 :         if (!dq->q_rtb.hardlimit)
      95   117835653 :                 dq->q_rtb.hardlimit = defq->rtb.hard;
      96             : 
      97   117835017 :         if (prealloc)
      98   117717588 :                 xfs_dquot_set_prealloc_limits(dq);
      99   117835319 : }
     100             : 
     101             : /* Set the expiration time of a quota's grace period. */
     102             : time64_t
     103          74 : xfs_dquot_set_timeout(
     104             :         struct xfs_mount        *mp,
     105             :         time64_t                timeout)
     106             : {
     107         297 :         struct xfs_quotainfo    *qi = mp->m_quotainfo;
     108             : 
     109         297 :         return clamp_t(time64_t, timeout, qi->qi_expiry_min,
     110             :                                           qi->qi_expiry_max);
     111             : }
     112             : 
     113             : /* Set the length of the default grace period. */
     114             : time64_t
     115        5585 : xfs_dquot_set_grace_period(
     116             :         time64_t                grace)
     117             : {
     118        5585 :         return clamp_t(time64_t, grace, XFS_DQ_GRACE_MIN, XFS_DQ_GRACE_MAX);
     119             : }
     120             : 
     121             : /*
     122             :  * Determine if this quota counter is over either limit and set the quota
     123             :  * timers as appropriate.
     124             :  */
     125             : static inline void
     126   353562876 : xfs_qm_adjust_res_timer(
     127             :         struct xfs_mount        *mp,
     128             :         struct xfs_dquot_res    *res,
     129             :         struct xfs_quota_limits *qlim)
     130             : {
     131   353562876 :         ASSERT(res->hardlimit == 0 || res->softlimit <= res->hardlimit);
     132             : 
     133   353562876 :         if ((res->softlimit && res->count > res->softlimit) ||
     134   353554817 :             (res->hardlimit && res->count > res->hardlimit)) {
     135        8081 :                 if (res->timer == 0)
     136         223 :                         res->timer = xfs_dquot_set_timeout(mp,
     137         223 :                                         ktime_get_real_seconds() + qlim->time);
     138             :         } else {
     139   353554795 :                 res->timer = 0;
     140             :         }
     141   353562876 : }
     142             : 
     143             : /*
     144             :  * Check the limits and timers of a dquot and start or reset timers
     145             :  * if necessary.
     146             :  * This gets called even when quota enforcement is OFF, which makes our
     147             :  * life a little less complicated. (We just don't reject any quota
     148             :  * reservations in that case, when enforcement is off).
     149             :  * We also return 0 as the values of the timers in Q_GETQUOTA calls, when
     150             :  * enforcement's off.
     151             :  * In contrast, warnings are a little different in that they don't
     152             :  * 'automatically' get started when limits get exceeded.  They do
     153             :  * get reset to zero, however, when we find the count to be under
     154             :  * the soft limit (they are only ever set non-zero via userspace).
     155             :  */
     156             : void
     157   117853124 : xfs_qm_adjust_dqtimers(
     158             :         struct xfs_dquot        *dq)
     159             : {
     160   117853124 :         struct xfs_mount        *mp = dq->q_mount;
     161   117853124 :         struct xfs_quotainfo    *qi = mp->m_quotainfo;
     162   117853124 :         struct xfs_def_quota    *defq;
     163             : 
     164   117853124 :         ASSERT(dq->q_id);
     165   117853124 :         defq = xfs_get_defquota(qi, xfs_dquot_type(dq));
     166             : 
     167   117854405 :         xfs_qm_adjust_res_timer(dq->q_mount, &dq->q_blk, &defq->blk);
     168   117855112 :         xfs_qm_adjust_res_timer(dq->q_mount, &dq->q_ino, &defq->ino);
     169   117854871 :         xfs_qm_adjust_res_timer(dq->q_mount, &dq->q_rtb, &defq->rtb);
     170   117854843 : }
     171             : 
     172             : /*
     173             :  * initialize a buffer full of dquots and log the whole thing
     174             :  */
     175             : STATIC void
     176     1648437 : xfs_qm_init_dquot_blk(
     177             :         struct xfs_trans        *tp,
     178             :         struct xfs_mount        *mp,
     179             :         xfs_dqid_t              id,
     180             :         xfs_dqtype_t            type,
     181             :         struct xfs_buf          *bp)
     182             : {
     183     1648437 :         struct xfs_quotainfo    *q = mp->m_quotainfo;
     184     1648437 :         struct xfs_dqblk        *d;
     185     1648437 :         xfs_dqid_t              curid;
     186     1648437 :         unsigned int            qflag;
     187     1648437 :         unsigned int            blftype;
     188     1648437 :         int                     i;
     189             : 
     190     1648437 :         ASSERT(tp);
     191     1648437 :         ASSERT(xfs_buf_islocked(bp));
     192             : 
     193     1648437 :         switch (type) {
     194             :         case XFS_DQTYPE_USER:
     195             :                 qflag = XFS_UQUOTA_CHKD;
     196             :                 blftype = XFS_BLF_UDQUOT_BUF;
     197             :                 break;
     198       28880 :         case XFS_DQTYPE_PROJ:
     199       28880 :                 qflag = XFS_PQUOTA_CHKD;
     200       28880 :                 blftype = XFS_BLF_PDQUOT_BUF;
     201       28880 :                 break;
     202      807733 :         case XFS_DQTYPE_GROUP:
     203      807733 :                 qflag = XFS_GQUOTA_CHKD;
     204      807733 :                 blftype = XFS_BLF_GDQUOT_BUF;
     205      807733 :                 break;
     206           0 :         default:
     207           0 :                 ASSERT(0);
     208           0 :                 return;
     209             :         }
     210             : 
     211     1648437 :         d = bp->b_addr;
     212             : 
     213             :         /*
     214             :          * ID of the first dquot in the block - id's are zero based.
     215             :          */
     216     1648437 :         curid = id - (id % q->qi_dqperchunk);
     217     1648437 :         memset(d, 0, BBTOB(q->qi_dqchunklen));
     218    56568230 :         for (i = 0; i < q->qi_dqperchunk; i++, d++, curid++) {
     219    54919796 :                 d->dd_diskdq.d_magic = cpu_to_be16(XFS_DQUOT_MAGIC);
     220    54919796 :                 d->dd_diskdq.d_version = XFS_DQUOT_VERSION;
     221    54919796 :                 d->dd_diskdq.d_id = cpu_to_be32(curid);
     222    54919796 :                 d->dd_diskdq.d_type = type;
     223    54919796 :                 if (curid > 0 && xfs_has_bigtime(mp))
     224    54859169 :                         d->dd_diskdq.d_type |= XFS_DQTYPE_BIGTIME;
     225    54919796 :                 if (xfs_has_crc(mp)) {
     226    54918469 :                         uuid_copy(&d->dd_uuid, &mp->m_sb.sb_meta_uuid);
     227    54918469 :                         xfs_update_cksum((char *)d, sizeof(struct xfs_dqblk),
     228             :                                          XFS_DQUOT_CRC_OFF);
     229             :                 }
     230             :         }
     231             : 
     232     1648434 :         xfs_trans_dquot_buf(tp, bp, blftype);
     233             : 
     234             :         /*
     235             :          * quotacheck uses delayed writes to update all the dquots on disk in an
     236             :          * efficient manner instead of logging the individual dquot changes as
     237             :          * they are made. However if we log the buffer allocated here and crash
     238             :          * after quotacheck while the logged initialisation is still in the
     239             :          * active region of the log, log recovery can replay the dquot buffer
     240             :          * initialisation over the top of the checked dquots and corrupt quota
     241             :          * accounting.
     242             :          *
     243             :          * To avoid this problem, quotacheck cannot log the initialised buffer.
     244             :          * We must still dirty the buffer and write it back before the
     245             :          * allocation transaction clears the log. Therefore, mark the buffer as
     246             :          * ordered instead of logging it directly. This is safe for quotacheck
     247             :          * because it detects and repairs allocated but initialized dquot blocks
     248             :          * in the quota inodes.
     249             :          */
     250     1648433 :         if (!(mp->m_qflags & qflag))
     251       10009 :                 xfs_trans_ordered_buf(tp, bp);
     252             :         else
     253     1638424 :                 xfs_trans_log_buf(tp, bp, 0, BBTOB(q->qi_dqchunklen) - 1);
     254             : }
     255             : 
     256             : /*
     257             :  * Initialize the dynamic speculative preallocation thresholds. The lo/hi
     258             :  * watermarks correspond to the soft and hard limits by default. If a soft limit
     259             :  * is not specified, we use 95% of the hard limit.
     260             :  */
     261             : void
     262   127437915 : xfs_dquot_set_prealloc_limits(struct xfs_dquot *dqp)
     263             : {
     264   127437915 :         uint64_t space;
     265             : 
     266   127437915 :         dqp->q_prealloc_hi_wmark = dqp->q_blk.hardlimit;
     267   127437915 :         dqp->q_prealloc_lo_wmark = dqp->q_blk.softlimit;
     268   127437915 :         if (!dqp->q_prealloc_lo_wmark) {
     269   127428168 :                 dqp->q_prealloc_lo_wmark = dqp->q_prealloc_hi_wmark;
     270   127428168 :                 do_div(dqp->q_prealloc_lo_wmark, 100);
     271   127428168 :                 dqp->q_prealloc_lo_wmark *= 95;
     272             :         }
     273             : 
     274   127437915 :         space = dqp->q_prealloc_hi_wmark;
     275             : 
     276   127437915 :         do_div(space, 100);
     277   127437915 :         dqp->q_low_space[XFS_QLOWSP_1_PCNT] = space;
     278   127437915 :         dqp->q_low_space[XFS_QLOWSP_3_PCNT] = space * 3;
     279   127437915 :         dqp->q_low_space[XFS_QLOWSP_5_PCNT] = space * 5;
     280   127437915 : }
     281             : 
     282             : /*
     283             :  * Ensure that the given in-core dquot has a buffer on disk backing it, and
     284             :  * return the buffer locked and held. This is called when the bmapi finds a
     285             :  * hole.
     286             :  */
     287             : STATIC int
     288     1677790 : xfs_dquot_disk_alloc(
     289             :         struct xfs_dquot        *dqp,
     290             :         struct xfs_buf          **bpp)
     291             : {
     292     1677790 :         struct xfs_bmbt_irec    map;
     293     1677790 :         struct xfs_trans        *tp;
     294     1677790 :         struct xfs_mount        *mp = dqp->q_mount;
     295     1677790 :         struct xfs_buf          *bp;
     296     1677790 :         xfs_dqtype_t            qtype = xfs_dquot_type(dqp);
     297     1677790 :         struct xfs_inode        *quotip = xfs_quota_inode(mp, qtype);
     298     1677788 :         int                     nmaps = 1;
     299     1677788 :         int                     error;
     300             : 
     301     1677788 :         trace_xfs_dqalloc(dqp);
     302             : 
     303     1677791 :         error = xfs_trans_alloc(mp, &M_RES(mp)->tr_qm_dqalloc,
     304     1677791 :                         XFS_QM_DQALLOC_SPACE_RES(mp), 0, 0, &tp);
     305     1677812 :         if (error)
     306             :                 return error;
     307             : 
     308     1650052 :         xfs_ilock(quotip, XFS_ILOCK_EXCL);
     309     1650057 :         xfs_trans_ijoin(tp, quotip, 0);
     310             : 
     311     1650041 :         if (!xfs_this_quota_on(dqp->q_mount, qtype)) {
     312             :                 /*
     313             :                  * Return if this type of quotas is turned off while we didn't
     314             :                  * have an inode lock
     315             :                  */
     316           0 :                 error = -ESRCH;
     317           0 :                 goto err_cancel;
     318             :         }
     319             : 
     320     1650041 :         error = xfs_iext_count_may_overflow(quotip, XFS_DATA_FORK,
     321             :                         XFS_IEXT_ADD_NOSPLIT_CNT);
     322     1650044 :         if (error == -EFBIG)
     323           2 :                 error = xfs_iext_count_upgrade(tp, quotip,
     324             :                                 XFS_IEXT_ADD_NOSPLIT_CNT);
     325     1650044 :         if (error)
     326           2 :                 goto err_cancel;
     327             : 
     328             :         /* Create the block mapping. */
     329     1650042 :         error = xfs_bmapi_write(tp, quotip, dqp->q_fileoffset,
     330             :                         XFS_DQUOT_CLUSTER_SIZE_FSB, XFS_BMAPI_METADATA, 0, &map,
     331             :                         &nmaps);
     332     1650058 :         if (error)
     333        1623 :                 goto err_cancel;
     334             : 
     335     1648435 :         ASSERT(map.br_blockcount == XFS_DQUOT_CLUSTER_SIZE_FSB);
     336     1648435 :         ASSERT(nmaps == 1);
     337     1648435 :         ASSERT((map.br_startblock != DELAYSTARTBLOCK) &&
     338             :                (map.br_startblock != HOLESTARTBLOCK));
     339             : 
     340             :         /*
     341             :          * Keep track of the blkno to save a lookup later
     342             :          */
     343     1648435 :         dqp->q_blkno = XFS_FSB_TO_DADDR(mp, map.br_startblock);
     344             : 
     345             :         /* now we can just get the buffer (there's nothing to read yet) */
     346     1648436 :         error = xfs_trans_get_buf(tp, mp->m_ddev_targp, dqp->q_blkno,
     347     1648436 :                         mp->m_quotainfo->qi_dqchunklen, 0, &bp);
     348     1648433 :         if (error)
     349           0 :                 goto err_cancel;
     350     1648433 :         bp->b_ops = &xfs_dquot_buf_ops;
     351             : 
     352             :         /*
     353             :          * Make a chunk of dquots out of this buffer and log
     354             :          * the entire thing.
     355             :          */
     356     1648433 :         xfs_qm_init_dquot_blk(tp, mp, dqp->q_id, qtype, bp);
     357     1648434 :         xfs_buf_set_ref(bp, XFS_DQUOT_REF);
     358             : 
     359             :         /*
     360             :          * Hold the buffer and join it to the dfops so that we'll still own
     361             :          * the buffer when we return to the caller.  The buffer disposal on
     362             :          * error must be paid attention to very carefully, as it has been
     363             :          * broken since commit efa092f3d4c6 "[XFS] Fixes a bug in the quota
     364             :          * code when allocating a new dquot record" in 2005, and the later
     365             :          * conversion to xfs_defer_ops in commit 310a75a3c6c747 failed to keep
     366             :          * the buffer locked across the _defer_finish call.  We can now do
     367             :          * this correctly with xfs_defer_bjoin.
     368             :          *
     369             :          * Above, we allocated a disk block for the dquot information and used
     370             :          * get_buf to initialize the dquot. If the _defer_finish fails, the old
     371             :          * transaction is gone but the new buffer is not joined or held to any
     372             :          * transaction, so we must _buf_relse it.
     373             :          *
     374             :          * If everything succeeds, the caller of this function is returned a
     375             :          * buffer that is locked and held to the transaction.  The caller
     376             :          * is responsible for unlocking any buffer passed back, either
     377             :          * manually or by committing the transaction.  On error, the buffer is
     378             :          * released and not passed back.
     379             :          *
     380             :          * Keep the quota inode ILOCKed until after the transaction commit to
     381             :          * maintain the atomicity of bmap/rmap updates.
     382             :          */
     383     1648437 :         xfs_trans_bhold(tp, bp);
     384     1648434 :         error = xfs_trans_commit(tp);
     385     1648436 :         xfs_iunlock(quotip, XFS_ILOCK_EXCL);
     386     1648437 :         if (error) {
     387         143 :                 xfs_buf_relse(bp);
     388         143 :                 return error;
     389             :         }
     390             : 
     391     1648294 :         *bpp = bp;
     392     1648294 :         return 0;
     393             : 
     394        1625 : err_cancel:
     395        1625 :         xfs_trans_cancel(tp);
     396        1625 :         xfs_iunlock(quotip, XFS_ILOCK_EXCL);
     397        1625 :         return error;
     398             : }
     399             : 
     400             : /*
     401             :  * Read in the in-core dquot's on-disk metadata and return the buffer.
     402             :  * Returns ENOENT to signal a hole.
     403             :  */
     404             : STATIC int
     405     9806051 : xfs_dquot_disk_read(
     406             :         struct xfs_mount        *mp,
     407             :         struct xfs_dquot        *dqp,
     408             :         struct xfs_buf          **bpp)
     409             : {
     410     9806051 :         struct xfs_bmbt_irec    map;
     411     9806051 :         struct xfs_buf          *bp;
     412     9806051 :         xfs_dqtype_t            qtype = xfs_dquot_type(dqp);
     413     9806051 :         struct xfs_inode        *quotip = xfs_quota_inode(mp, qtype);
     414     9806013 :         uint                    lock_mode;
     415     9806013 :         int                     nmaps = 1;
     416     9806013 :         int                     error;
     417             : 
     418     9806013 :         lock_mode = xfs_ilock_data_map_shared(quotip);
     419     9805890 :         if (!xfs_this_quota_on(mp, qtype)) {
     420             :                 /*
     421             :                  * Return if this type of quotas is turned off while we
     422             :                  * didn't have the quota inode lock.
     423             :                  */
     424           0 :                 xfs_iunlock(quotip, lock_mode);
     425           0 :                 return -ESRCH;
     426             :         }
     427             : 
     428             :         /*
     429             :          * Find the block map; no allocations yet
     430             :          */
     431     9805890 :         error = xfs_bmapi_read(quotip, dqp->q_fileoffset,
     432             :                         XFS_DQUOT_CLUSTER_SIZE_FSB, &map, &nmaps, 0);
     433     9805894 :         xfs_iunlock(quotip, lock_mode);
     434     9806038 :         if (error)
     435             :                 return error;
     436             : 
     437     9805265 :         ASSERT(nmaps == 1);
     438     9805265 :         ASSERT(map.br_blockcount >= 1);
     439     9805265 :         ASSERT(map.br_startblock != DELAYSTARTBLOCK);
     440     9805265 :         if (map.br_startblock == HOLESTARTBLOCK)
     441             :                 return -ENOENT;
     442             : 
     443     8060871 :         trace_xfs_dqtobp_read(dqp);
     444             : 
     445             :         /*
     446             :          * store the blkno etc so that we don't have to do the
     447             :          * mapping all the time
     448             :          */
     449     8060873 :         dqp->q_blkno = XFS_FSB_TO_DADDR(mp, map.br_startblock);
     450             : 
     451     8060871 :         error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp, dqp->q_blkno,
     452     8060871 :                         mp->m_quotainfo->qi_dqchunklen, 0, &bp,
     453             :                         &xfs_dquot_buf_ops);
     454     8060863 :         if (error) {
     455        7702 :                 ASSERT(bp == NULL);
     456        7702 :                 return error;
     457             :         }
     458             : 
     459     8053161 :         ASSERT(xfs_buf_islocked(bp));
     460     8053161 :         xfs_buf_set_ref(bp, XFS_DQUOT_REF);
     461     8053087 :         *bpp = bp;
     462             : 
     463     8053087 :         return 0;
     464             : }
     465             : 
     466             : /* Allocate and initialize everything we need for an incore dquot. */
     467             : STATIC struct xfs_dquot *
     468     9806082 : xfs_dquot_alloc(
     469             :         struct xfs_mount        *mp,
     470             :         xfs_dqid_t              id,
     471             :         xfs_dqtype_t            type)
     472             : {
     473     9806082 :         struct xfs_dquot        *dqp;
     474             : 
     475     9806082 :         dqp = kmem_cache_zalloc(xfs_dquot_cache, GFP_KERNEL | __GFP_NOFAIL);
     476             : 
     477     9806069 :         dqp->q_type = type;
     478     9806069 :         dqp->q_id = id;
     479     9806069 :         dqp->q_mount = mp;
     480     9806069 :         INIT_LIST_HEAD(&dqp->q_lru);
     481     9806069 :         mutex_init(&dqp->q_qlock);
     482     9806076 :         init_waitqueue_head(&dqp->q_pinwait);
     483     9806078 :         dqp->q_fileoffset = (xfs_fileoff_t)id / mp->m_quotainfo->qi_dqperchunk;
     484             :         /*
     485             :          * Offset of dquot in the (fixed sized) dquot chunk.
     486             :          */
     487     9806078 :         dqp->q_bufoffset = (id % mp->m_quotainfo->qi_dqperchunk) *
     488             :                         sizeof(struct xfs_dqblk);
     489             : 
     490             :         /*
     491             :          * Because we want to use a counting completion, complete
     492             :          * the flush completion once to allow a single access to
     493             :          * the flush completion without blocking.
     494             :          */
     495     9806078 :         init_completion(&dqp->q_flush);
     496     9806075 :         complete(&dqp->q_flush);
     497             : 
     498             :         /*
     499             :          * Make sure group quotas have a different lock class than user
     500             :          * quotas.
     501             :          */
     502     9806082 :         switch (type) {
     503             :         case XFS_DQTYPE_USER:
     504             :                 /* uses the default lock class */
     505             :                 break;
     506             :         case XFS_DQTYPE_GROUP:
     507             :                 lockdep_set_class(&dqp->q_qlock, &xfs_dquot_group_class);
     508             :                 break;
     509             :         case XFS_DQTYPE_PROJ:
     510             :                 lockdep_set_class(&dqp->q_qlock, &xfs_dquot_project_class);
     511             :                 break;
     512           0 :         default:
     513           0 :                 ASSERT(0);
     514           0 :                 break;
     515             :         }
     516             : 
     517     9806082 :         xfs_qm_dquot_logitem_init(dqp);
     518             : 
     519     9806056 :         XFS_STATS_INC(mp, xs_qm_dquot);
     520     9806067 :         return dqp;
     521             : }
     522             : 
     523             : /* Check the ondisk dquot's id and type match what the incore dquot expects. */
     524             : static bool
     525     9701305 : xfs_dquot_check_type(
     526             :         struct xfs_dquot        *dqp,
     527             :         struct xfs_disk_dquot   *ddqp)
     528             : {
     529     9701305 :         uint8_t                 ddqp_type;
     530     9701305 :         uint8_t                 dqp_type;
     531             : 
     532     9701305 :         ddqp_type = ddqp->d_type & XFS_DQTYPE_REC_MASK;
     533     9701305 :         dqp_type = xfs_dquot_type(dqp);
     534             : 
     535    19402610 :         if (be32_to_cpu(ddqp->d_id) != dqp->q_id)
     536             :                 return false;
     537             : 
     538             :         /*
     539             :          * V5 filesystems always expect an exact type match.  V4 filesystems
     540             :          * expect an exact match for user dquots and for non-root group and
     541             :          * project dquots.
     542             :          */
     543     9701432 :         if (xfs_has_crc(dqp->q_mount) ||
     544          30 :             dqp_type == XFS_DQTYPE_USER || dqp->q_id != 0)
     545     9701402 :                 return ddqp_type == dqp_type;
     546             : 
     547             :         /*
     548             :          * V4 filesystems support either group or project quotas, but not both
     549             :          * at the same time.  The non-user quota file can be switched between
     550             :          * group and project quota uses depending on the mount options, which
     551             :          * means that we can encounter the other type when we try to load quota
     552             :          * defaults.  Quotacheck will soon reset the entire quota file
     553             :          * (including the root dquot) anyway, but don't log scary corruption
     554             :          * reports to dmesg.
     555             :          */
     556          30 :         return ddqp_type == XFS_DQTYPE_GROUP || ddqp_type == XFS_DQTYPE_PROJ;
     557             : }
     558             : 
     559             : /* Copy the in-core quota fields in from the on-disk buffer. */
     560             : STATIC int
     561     9701441 : xfs_dquot_from_disk(
     562             :         struct xfs_dquot        *dqp,
     563             :         struct xfs_buf          *bp)
     564             : {
     565     9701441 :         struct xfs_disk_dquot   *ddqp = bp->b_addr + dqp->q_bufoffset;
     566             : 
     567             :         /*
     568             :          * Ensure that we got the type and ID we were looking for.
     569             :          * Everything else was checked by the dquot buffer verifier.
     570             :          */
     571     9701441 :         if (!xfs_dquot_check_type(dqp, ddqp)) {
     572           0 :                 xfs_alert_tag(bp->b_mount, XFS_PTAG_VERIFIER_ERROR,
     573             :                           "Metadata corruption detected at %pS, quota %u",
     574             :                           __this_address, dqp->q_id);
     575           0 :                 xfs_alert(bp->b_mount, "Unmount and run xfs_repair");
     576           0 :                 return -EFSCORRUPTED;
     577             :         }
     578             : 
     579             :         /* copy everything from disk dquot to the incore dquot */
     580     9701441 :         dqp->q_type = ddqp->d_type;
     581     9701441 :         dqp->q_blk.hardlimit = be64_to_cpu(ddqp->d_blk_hardlimit);
     582     9701441 :         dqp->q_blk.softlimit = be64_to_cpu(ddqp->d_blk_softlimit);
     583     9701441 :         dqp->q_ino.hardlimit = be64_to_cpu(ddqp->d_ino_hardlimit);
     584     9701441 :         dqp->q_ino.softlimit = be64_to_cpu(ddqp->d_ino_softlimit);
     585     9701441 :         dqp->q_rtb.hardlimit = be64_to_cpu(ddqp->d_rtb_hardlimit);
     586     9701441 :         dqp->q_rtb.softlimit = be64_to_cpu(ddqp->d_rtb_softlimit);
     587             : 
     588     9701441 :         dqp->q_blk.count = be64_to_cpu(ddqp->d_bcount);
     589     9701441 :         dqp->q_ino.count = be64_to_cpu(ddqp->d_icount);
     590     9701441 :         dqp->q_rtb.count = be64_to_cpu(ddqp->d_rtbcount);
     591             : 
     592     9701441 :         dqp->q_blk.timer = xfs_dquot_from_disk_ts(ddqp, ddqp->d_btimer);
     593     9701425 :         dqp->q_ino.timer = xfs_dquot_from_disk_ts(ddqp, ddqp->d_itimer);
     594     9701429 :         dqp->q_rtb.timer = xfs_dquot_from_disk_ts(ddqp, ddqp->d_rtbtimer);
     595             : 
     596             :         /*
     597             :          * Reservation counters are defined as reservation plus current usage
     598             :          * to avoid having to add every time.
     599             :          */
     600     9701423 :         dqp->q_blk.reserved = dqp->q_blk.count;
     601     9701423 :         dqp->q_ino.reserved = dqp->q_ino.count;
     602     9701423 :         dqp->q_rtb.reserved = dqp->q_rtb.count;
     603             : 
     604             :         /* initialize the dquot speculative prealloc thresholds */
     605     9701423 :         xfs_dquot_set_prealloc_limits(dqp);
     606     9701423 :         return 0;
     607             : }
     608             : 
     609             : /* Copy the in-core quota fields into the on-disk buffer. */
     610             : void
     611  1910343540 : xfs_dquot_to_disk(
     612             :         struct xfs_disk_dquot   *ddqp,
     613             :         struct xfs_dquot        *dqp)
     614             : {
     615  1910343540 :         ddqp->d_magic = cpu_to_be16(XFS_DQUOT_MAGIC);
     616  1910343540 :         ddqp->d_version = XFS_DQUOT_VERSION;
     617  1910343540 :         ddqp->d_type = dqp->q_type;
     618  1910343540 :         ddqp->d_id = cpu_to_be32(dqp->q_id);
     619  1910343540 :         ddqp->d_pad0 = 0;
     620  1910343540 :         ddqp->d_pad = 0;
     621             : 
     622  1910343540 :         ddqp->d_blk_hardlimit = cpu_to_be64(dqp->q_blk.hardlimit);
     623  1910343540 :         ddqp->d_blk_softlimit = cpu_to_be64(dqp->q_blk.softlimit);
     624  1910343540 :         ddqp->d_ino_hardlimit = cpu_to_be64(dqp->q_ino.hardlimit);
     625  1910343540 :         ddqp->d_ino_softlimit = cpu_to_be64(dqp->q_ino.softlimit);
     626  1910343540 :         ddqp->d_rtb_hardlimit = cpu_to_be64(dqp->q_rtb.hardlimit);
     627  1910343540 :         ddqp->d_rtb_softlimit = cpu_to_be64(dqp->q_rtb.softlimit);
     628             : 
     629  1910343540 :         ddqp->d_bcount = cpu_to_be64(dqp->q_blk.count);
     630  1910343540 :         ddqp->d_icount = cpu_to_be64(dqp->q_ino.count);
     631  1910343540 :         ddqp->d_rtbcount = cpu_to_be64(dqp->q_rtb.count);
     632             : 
     633  1910343540 :         ddqp->d_bwarns = 0;
     634  1910343540 :         ddqp->d_iwarns = 0;
     635  1910343540 :         ddqp->d_rtbwarns = 0;
     636             : 
     637  1910343540 :         ddqp->d_btimer = xfs_dquot_to_disk_ts(dqp, dqp->q_blk.timer);
     638  1910343029 :         ddqp->d_itimer = xfs_dquot_to_disk_ts(dqp, dqp->q_ino.timer);
     639  1910345487 :         ddqp->d_rtbtimer = xfs_dquot_to_disk_ts(dqp, dqp->q_rtb.timer);
     640  1910346923 : }
     641             : 
     642             : /*
     643             :  * Read in the ondisk dquot using dqtobp() then copy it to an incore version,
     644             :  * and release the buffer immediately.  If @can_alloc is true, fill any
     645             :  * holes in the on-disk metadata.
     646             :  */
     647             : static int
     648     9806077 : xfs_qm_dqread(
     649             :         struct xfs_mount        *mp,
     650             :         xfs_dqid_t              id,
     651             :         xfs_dqtype_t            type,
     652             :         bool                    can_alloc,
     653             :         struct xfs_dquot        **dqpp)
     654             : {
     655     9806077 :         struct xfs_dquot        *dqp;
     656     9806077 :         struct xfs_buf          *bp;
     657     9806077 :         int                     error;
     658             : 
     659     9806077 :         dqp = xfs_dquot_alloc(mp, id, type);
     660     9806063 :         trace_xfs_dqread(dqp);
     661             : 
     662             :         /* Try to read the buffer, allocating if necessary. */
     663     9806058 :         error = xfs_dquot_disk_read(mp, dqp, &bp);
     664     9805989 :         if (error == -ENOENT && can_alloc)
     665     1677799 :                 error = xfs_dquot_disk_alloc(dqp, &bp);
     666     9806008 :         if (error)
     667      104598 :                 goto err;
     668             : 
     669             :         /*
     670             :          * At this point we should have a clean locked buffer.  Copy the data
     671             :          * to the incore dquot and release the buffer since the incore dquot
     672             :          * has its own locking protocol so we needn't tie up the buffer any
     673             :          * further.
     674             :          */
     675     9701410 :         ASSERT(xfs_buf_islocked(bp));
     676     9701410 :         error = xfs_dquot_from_disk(dqp, bp);
     677     9701386 :         xfs_buf_relse(bp);
     678     9701480 :         if (error)
     679           0 :                 goto err;
     680             : 
     681     9701480 :         *dqpp = dqp;
     682     9701480 :         return error;
     683             : 
     684      104598 : err:
     685      104598 :         trace_xfs_dqread_fail(dqp);
     686      104597 :         xfs_qm_dqdestroy(dqp);
     687      104596 :         *dqpp = NULL;
     688      104596 :         return error;
     689             : }
     690             : 
     691             : /*
     692             :  * Advance to the next id in the current chunk, or if at the
     693             :  * end of the chunk, skip ahead to first id in next allocated chunk
     694             :  * using the SEEK_DATA interface.
     695             :  */
     696             : static int
     697     5885050 : xfs_dq_get_next_id(
     698             :         struct xfs_mount        *mp,
     699             :         xfs_dqtype_t            type,
     700             :         xfs_dqid_t              *id)
     701             : {
     702     5885050 :         struct xfs_inode        *quotip = xfs_quota_inode(mp, type);
     703     5885050 :         xfs_dqid_t              next_id = *id + 1; /* simple advance */
     704     5885050 :         uint                    lock_flags;
     705     5885050 :         struct xfs_bmbt_irec    got;
     706     5885050 :         struct xfs_iext_cursor  cur;
     707     5885050 :         xfs_fsblock_t           start;
     708     5885050 :         int                     error = 0;
     709             : 
     710             :         /* If we'd wrap past the max ID, stop */
     711     5885050 :         if (next_id < *id)
     712             :                 return -ENOENT;
     713             : 
     714             :         /* If new ID is within the current chunk, advancing it sufficed */
     715     5885042 :         if (next_id % mp->m_quotainfo->qi_dqperchunk) {
     716     5753462 :                 *id = next_id;
     717     5753462 :                 return 0;
     718             :         }
     719             : 
     720             :         /* Nope, next_id is now past the current chunk, so find the next one */
     721      131580 :         start = (xfs_fsblock_t)next_id / mp->m_quotainfo->qi_dqperchunk;
     722             : 
     723      131580 :         lock_flags = xfs_ilock_data_map_shared(quotip);
     724      131580 :         error = xfs_iread_extents(NULL, quotip, XFS_DATA_FORK);
     725      131580 :         if (error)
     726             :                 return error;
     727             : 
     728      131580 :         if (xfs_iext_lookup_extent(quotip, &quotip->i_df, start, &cur, &got)) {
     729             :                 /* contiguous chunk, bump startoff for the id calculation */
     730      130564 :                 if (got.br_startoff < start)
     731         394 :                         got.br_startoff = start;
     732      130564 :                 *id = got.br_startoff * mp->m_quotainfo->qi_dqperchunk;
     733             :         } else {
     734             :                 error = -ENOENT;
     735             :         }
     736             : 
     737      131580 :         xfs_iunlock(quotip, lock_flags);
     738             : 
     739      131580 :         return error;
     740             : }
     741             : 
     742             : /*
     743             :  * Look up the dquot in the in-core cache.  If found, the dquot is returned
     744             :  * locked and ready to go.
     745             :  */
     746             : static struct xfs_dquot *
     747    61503604 : xfs_qm_dqget_cache_lookup(
     748             :         struct xfs_mount        *mp,
     749             :         struct xfs_quotainfo    *qi,
     750             :         struct radix_tree_root  *tree,
     751             :         xfs_dqid_t              id)
     752             : {
     753    61504176 :         struct xfs_dquot        *dqp;
     754             : 
     755    61504176 : restart:
     756    61504176 :         mutex_lock(&qi->qi_tree_lock);
     757    61505391 :         dqp = radix_tree_lookup(tree, id);
     758    61505391 :         if (!dqp) {
     759     9685676 :                 mutex_unlock(&qi->qi_tree_lock);
     760     9685675 :                 XFS_STATS_INC(mp, xs_qm_dqcachemisses);
     761     9685674 :                 return NULL;
     762             :         }
     763             : 
     764    51819715 :         xfs_dqlock(dqp);
     765    51819715 :         if (dqp->q_flags & XFS_DQFLAG_FREEING) {
     766         572 :                 xfs_dqunlock(dqp);
     767         572 :                 mutex_unlock(&qi->qi_tree_lock);
     768         572 :                 trace_xfs_dqget_freeing(dqp);
     769         572 :                 delay(1);
     770         572 :                 goto restart;
     771             :         }
     772             : 
     773    51819143 :         dqp->q_nrefs++;
     774    51819143 :         mutex_unlock(&qi->qi_tree_lock);
     775             : 
     776    51819130 :         trace_xfs_dqget_hit(dqp);
     777    51819141 :         XFS_STATS_INC(mp, xs_qm_dqcachehits);
     778    51819142 :         return dqp;
     779             : }
     780             : 
     781             : /*
     782             :  * Try to insert a new dquot into the in-core cache.  If an error occurs the
     783             :  * caller should throw away the dquot and start over.  Otherwise, the dquot
     784             :  * is returned locked (and held by the cache) as if there had been a cache
     785             :  * hit.
     786             :  */
     787             : static int
     788     9597247 : xfs_qm_dqget_cache_insert(
     789             :         struct xfs_mount        *mp,
     790             :         struct xfs_quotainfo    *qi,
     791             :         struct radix_tree_root  *tree,
     792             :         xfs_dqid_t              id,
     793             :         struct xfs_dquot        *dqp)
     794             : {
     795     9597247 :         int                     error;
     796             : 
     797     9597247 :         mutex_lock(&qi->qi_tree_lock);
     798     9597294 :         error = radix_tree_insert(tree, id, dqp);
     799     9597294 :         if (unlikely(error)) {
     800             :                 /* Duplicate found!  Caller must try again. */
     801         108 :                 mutex_unlock(&qi->qi_tree_lock);
     802         108 :                 trace_xfs_dqget_dup(dqp);
     803         108 :                 return error;
     804             :         }
     805             : 
     806             :         /* Return a locked dquot to the caller, with a reference taken. */
     807     9597186 :         xfs_dqlock(dqp);
     808     9597186 :         dqp->q_nrefs = 1;
     809             : 
     810     9597186 :         qi->qi_dquots++;
     811     9597186 :         mutex_unlock(&qi->qi_tree_lock);
     812             : 
     813     9597186 :         return 0;
     814             : }
     815             : 
     816             : /* Check our input parameters. */
     817             : static int
     818    61626433 : xfs_qm_dqget_checks(
     819             :         struct xfs_mount        *mp,
     820             :         xfs_dqtype_t            type)
     821             : {
     822    61626433 :         switch (type) {
     823    23297672 :         case XFS_DQTYPE_USER:
     824    23297672 :                 if (!XFS_IS_UQUOTA_ON(mp))
     825         328 :                         return -ESRCH;
     826             :                 return 0;
     827    22936672 :         case XFS_DQTYPE_GROUP:
     828    22936672 :                 if (!XFS_IS_GQUOTA_ON(mp))
     829         934 :                         return -ESRCH;
     830             :                 return 0;
     831    15392089 :         case XFS_DQTYPE_PROJ:
     832    15392089 :                 if (!XFS_IS_PQUOTA_ON(mp))
     833         312 :                         return -ESRCH;
     834             :                 return 0;
     835             :         default:
     836             :                 WARN_ON_ONCE(0);
     837             :                 return -EINVAL;
     838             :         }
     839             : }
     840             : 
     841             : /*
     842             :  * Given the file system, id, and type (UDQUOT/GDQUOT/PDQUOT), return a
     843             :  * locked dquot, doing an allocation (if requested) as needed.
     844             :  */
     845             : int
     846    17011360 : xfs_qm_dqget(
     847             :         struct xfs_mount        *mp,
     848             :         xfs_dqid_t              id,
     849             :         xfs_dqtype_t            type,
     850             :         bool                    can_alloc,
     851             :         struct xfs_dquot        **O_dqpp)
     852             : {
     853    17011360 :         struct xfs_quotainfo    *qi = mp->m_quotainfo;
     854    17011360 :         struct radix_tree_root  *tree = xfs_dquot_tree(qi, type);
     855    17011630 :         struct xfs_dquot        *dqp;
     856    17011630 :         int                     error;
     857             : 
     858    17011630 :         error = xfs_qm_dqget_checks(mp, type);
     859    17011630 :         if (error)
     860             :                 return error;
     861             : 
     862    17010804 : restart:
     863    17010870 :         dqp = xfs_qm_dqget_cache_lookup(mp, qi, tree, id);
     864    17011025 :         if (dqp) {
     865     9749346 :                 *O_dqpp = dqp;
     866     9749346 :                 return 0;
     867             :         }
     868             : 
     869     7261679 :         error = xfs_qm_dqread(mp, id, type, can_alloc, &dqp);
     870     7261664 :         if (error)
     871       81939 :                 return error;
     872             : 
     873     7179725 :         error = xfs_qm_dqget_cache_insert(mp, qi, tree, id, dqp);
     874     7179740 :         if (error) {
     875             :                 /*
     876             :                  * Duplicate found. Just throw away the new dquot and start
     877             :                  * over.
     878             :                  */
     879          66 :                 xfs_qm_dqdestroy(dqp);
     880          66 :                 XFS_STATS_INC(mp, xs_qm_dquot_dups);
     881          66 :                 goto restart;
     882             :         }
     883             : 
     884     7179674 :         trace_xfs_dqget_miss(dqp);
     885     7179674 :         *O_dqpp = dqp;
     886     7179674 :         return 0;
     887             : }
     888             : 
     889             : /*
     890             :  * Given a dquot id and type, read and initialize a dquot from the on-disk
     891             :  * metadata.  This function is only for use during quota initialization so
     892             :  * it ignores the dquot cache assuming that the dquot shrinker isn't set up.
     893             :  * The caller is responsible for _qm_dqdestroy'ing the returned dquot.
     894             :  */
     895             : int
     896      121172 : xfs_qm_dqget_uncached(
     897             :         struct xfs_mount        *mp,
     898             :         xfs_dqid_t              id,
     899             :         xfs_dqtype_t            type,
     900             :         struct xfs_dquot        **dqpp)
     901             : {
     902      121172 :         int                     error;
     903             : 
     904      121172 :         error = xfs_qm_dqget_checks(mp, type);
     905      121172 :         if (error)
     906             :                 return error;
     907             : 
     908      120424 :         return xfs_qm_dqread(mp, id, type, 0, dqpp);
     909             : }
     910             : 
     911             : /* Return the quota id for a given inode and type. */
     912             : xfs_dqid_t
     913    44677315 : xfs_qm_id_for_quotatype(
     914             :         struct xfs_inode        *ip,
     915             :         xfs_dqtype_t            type)
     916             : {
     917    44677315 :         switch (type) {
     918             :         case XFS_DQTYPE_USER:
     919    14895952 :                 return i_uid_read(VFS_I(ip));
     920             :         case XFS_DQTYPE_GROUP:
     921    14891337 :                 return i_gid_read(VFS_I(ip));
     922    14890026 :         case XFS_DQTYPE_PROJ:
     923    14890026 :                 return ip->i_projid;
     924             :         }
     925           0 :         ASSERT(0);
     926           0 :         return 0;
     927             : }
     928             : 
     929             : /*
     930             :  * Return the dquot for a given inode and type.  If @can_alloc is true, then
     931             :  * allocate blocks if needed.  The inode's ILOCK must be held and it must not
     932             :  * have already had an inode attached.
     933             :  */
     934             : int
     935    44492837 : xfs_qm_dqget_inode(
     936             :         struct xfs_inode        *ip,
     937             :         xfs_dqtype_t            type,
     938             :         bool                    can_alloc,
     939             :         struct xfs_dquot        **O_dqpp)
     940             : {
     941    44492837 :         struct xfs_mount        *mp = ip->i_mount;
     942    44492837 :         struct xfs_quotainfo    *qi = mp->m_quotainfo;
     943    44492837 :         struct radix_tree_root  *tree = xfs_dquot_tree(qi, type);
     944    44493102 :         struct xfs_dquot        *dqp;
     945    44493102 :         xfs_dqid_t              id;
     946    44493102 :         int                     error;
     947             : 
     948    44493102 :         error = xfs_qm_dqget_checks(mp, type);
     949    44493102 :         if (error)
     950             :                 return error;
     951             : 
     952    44493281 :         ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
     953    88987140 :         ASSERT(xfs_inode_dquot(ip, type) == NULL);
     954             : 
     955    44493570 :         id = xfs_qm_id_for_quotatype(ip, type);
     956             : 
     957    44493134 : restart:
     958    44493134 :         dqp = xfs_qm_dqget_cache_lookup(mp, qi, tree, id);
     959    44493786 :         if (dqp) {
     960    42069791 :                 *O_dqpp = dqp;
     961    42069791 :                 return 0;
     962             :         }
     963             : 
     964             :         /*
     965             :          * Dquot cache miss. We don't want to keep the inode lock across
     966             :          * a (potential) disk read. Also we don't want to deal with the lock
     967             :          * ordering between quotainode and this inode. OTOH, dropping the inode
     968             :          * lock here means dealing with a chown that can happen before
     969             :          * we re-acquire the lock.
     970             :          */
     971     2423995 :         xfs_iunlock(ip, XFS_ILOCK_EXCL);
     972     2423995 :         error = xfs_qm_dqread(mp, id, type, can_alloc, &dqp);
     973     2423984 :         xfs_ilock(ip, XFS_ILOCK_EXCL);
     974     2423983 :         if (error)
     975        6442 :                 return error;
     976             : 
     977             :         /*
     978             :          * A dquot could be attached to this inode by now, since we had
     979             :          * dropped the ilock.
     980             :          */
     981     2417541 :         if (xfs_this_quota_on(mp, type)) {
     982     2417541 :                 struct xfs_dquot        *dqp1;
     983             : 
     984     2417541 :                 dqp1 = xfs_inode_dquot(ip, type);
     985     2417541 :                 if (dqp1) {
     986           0 :                         xfs_qm_dqdestroy(dqp);
     987           0 :                         dqp = dqp1;
     988           0 :                         xfs_dqlock(dqp);
     989           0 :                         goto dqret;
     990             :                 }
     991             :         } else {
     992             :                 /* inode stays locked on return */
     993           0 :                 xfs_qm_dqdestroy(dqp);
     994           0 :                 return -ESRCH;
     995             :         }
     996             : 
     997     2417541 :         error = xfs_qm_dqget_cache_insert(mp, qi, tree, id, dqp);
     998     2417553 :         if (error) {
     999             :                 /*
    1000             :                  * Duplicate found. Just throw away the new dquot and start
    1001             :                  * over.
    1002             :                  */
    1003          42 :                 xfs_qm_dqdestroy(dqp);
    1004          42 :                 XFS_STATS_INC(mp, xs_qm_dquot_dups);
    1005          42 :                 goto restart;
    1006             :         }
    1007             : 
    1008     2417511 : dqret:
    1009     2417511 :         ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
    1010     2417512 :         trace_xfs_dqget_miss(dqp);
    1011     2417511 :         *O_dqpp = dqp;
    1012     2417511 :         return 0;
    1013             : }
    1014             : 
    1015             : /*
    1016             :  * Starting at @id and progressing upwards, look for an initialized incore
    1017             :  * dquot, lock it, and return it.
    1018             :  */
    1019             : int
    1020      461512 : xfs_qm_dqget_next(
    1021             :         struct xfs_mount        *mp,
    1022             :         xfs_dqid_t              id,
    1023             :         xfs_dqtype_t            type,
    1024             :         struct xfs_dquot        **dqpp)
    1025             : {
    1026      461512 :         struct xfs_dquot        *dqp;
    1027      461512 :         int                     error = 0;
    1028             : 
    1029      461512 :         *dqpp = NULL;
    1030     6346562 :         for (; !error; error = xfs_dq_get_next_id(mp, type, &id)) {
    1031     6345538 :                 error = xfs_qm_dqget(mp, id, type, false, &dqp);
    1032     6345538 :                 if (error == -ENOENT)
    1033       42906 :                         continue;
    1034     6302632 :                 else if (error != 0)
    1035             :                         break;
    1036             : 
    1037     6302612 :                 if (!XFS_IS_DQUOT_UNINITIALIZED(dqp)) {
    1038      460468 :                         *dqpp = dqp;
    1039      460468 :                         return 0;
    1040             :                 }
    1041             : 
    1042     5842144 :                 xfs_qm_dqput(dqp);
    1043             :         }
    1044             : 
    1045             :         return error;
    1046             : }
    1047             : 
    1048             : /*
    1049             :  * Release a reference to the dquot (decrement ref-count) and unlock it.
    1050             :  *
    1051             :  * If there is a group quota attached to this dquot, carefully release that
    1052             :  * too without tripping over deadlocks'n'stuff.
    1053             :  */
    1054             : void
    1055   247583184 : xfs_qm_dqput(
    1056             :         struct xfs_dquot        *dqp)
    1057             : {
    1058   247583184 :         ASSERT(dqp->q_nrefs > 0);
    1059   247583184 :         ASSERT(XFS_DQ_IS_LOCKED(dqp));
    1060             : 
    1061   247583387 :         trace_xfs_dqput(dqp);
    1062             : 
    1063   247584047 :         if (--dqp->q_nrefs == 0) {
    1064    13725058 :                 struct xfs_quotainfo    *qi = dqp->q_mount->m_quotainfo;
    1065    13725058 :                 trace_xfs_dqput_free(dqp);
    1066             : 
    1067    13725059 :                 if (list_lru_add(&qi->qi_lru, &dqp->q_lru))
    1068    10774023 :                         XFS_STATS_INC(dqp->q_mount, xs_qm_dquot_unused);
    1069             :         }
    1070   247584065 :         xfs_dqunlock(dqp);
    1071   247514242 : }
    1072             : 
    1073             : /*
    1074             :  * Release a dquot. Flush it if dirty, then dqput() it.
    1075             :  * dquot must not be locked.
    1076             :  */
    1077             : void
    1078   311586459 : xfs_qm_dqrele(
    1079             :         struct xfs_dquot        *dqp)
    1080             : {
    1081   311586459 :         if (!dqp)
    1082             :                 return;
    1083             : 
    1084   241130062 :         trace_xfs_dqrele(dqp);
    1085             : 
    1086   241134362 :         xfs_dqlock(dqp);
    1087             :         /*
    1088             :          * We don't care to flush it if the dquot is dirty here.
    1089             :          * That will create stutters that we want to avoid.
    1090             :          * Instead we do a delayed write when we try to reclaim
    1091             :          * a dirty dquot. Also xfs_sync will take part of the burden...
    1092             :          */
    1093   241058889 :         xfs_qm_dqput(dqp);
    1094             : }
    1095             : 
    1096             : /*
    1097             :  * This is the dquot flushing I/O completion routine.  It is called
    1098             :  * from interrupt level when the buffer containing the dquot is
    1099             :  * flushed to disk.  It is responsible for removing the dquot logitem
    1100             :  * from the AIL if it has not been re-logged, and unlocking the dquot's
    1101             :  * flush lock. This behavior is very similar to that of inodes..
    1102             :  */
    1103             : static void
    1104     8114595 : xfs_qm_dqflush_done(
    1105             :         struct xfs_log_item     *lip)
    1106             : {
    1107     8114595 :         struct xfs_dq_logitem   *qip = (struct xfs_dq_logitem *)lip;
    1108     8114595 :         struct xfs_dquot        *dqp = qip->qli_dquot;
    1109     8114595 :         struct xfs_ail          *ailp = lip->li_ailp;
    1110     8114595 :         xfs_lsn_t               tail_lsn;
    1111             : 
    1112             :         /*
    1113             :          * We only want to pull the item from the AIL if its
    1114             :          * location in the log has not changed since we started the flush.
    1115             :          * Thus, we only bother if the dquot's lsn has
    1116             :          * not changed. First we check the lsn outside the lock
    1117             :          * since it's cheaper, and then we recheck while
    1118             :          * holding the lock before removing the dquot from the AIL.
    1119             :          */
    1120    16238642 :         if (test_bit(XFS_LI_IN_AIL, &lip->li_flags) &&
    1121     8113023 :             ((lip->li_lsn == qip->qli_flush_lsn) ||
    1122           0 :              test_bit(XFS_LI_FAILED, &lip->li_flags))) {
    1123             : 
    1124     8094119 :                 spin_lock(&ailp->ail_lock);
    1125     8094119 :                 xfs_clear_li_failed(lip);
    1126     8094119 :                 if (lip->li_lsn == qip->qli_flush_lsn) {
    1127             :                         /* xfs_ail_update_finish() drops the AIL lock */
    1128     8094119 :                         tail_lsn = xfs_ail_delete_one(ailp, lip);
    1129     8094119 :                         xfs_ail_update_finish(ailp, tail_lsn);
    1130             :                 } else {
    1131           0 :                         spin_unlock(&ailp->ail_lock);
    1132             :                 }
    1133             :         }
    1134             : 
    1135             :         /*
    1136             :          * Release the dq's flush lock since we're done with it.
    1137             :          */
    1138     8114595 :         xfs_dqfunlock(dqp);
    1139     8114595 : }
    1140             : 
    1141             : void
    1142     6914937 : xfs_buf_dquot_iodone(
    1143             :         struct xfs_buf          *bp)
    1144             : {
    1145     6914937 :         struct xfs_log_item     *lip, *n;
    1146             : 
    1147    15029532 :         list_for_each_entry_safe(lip, n, &bp->b_li_list, li_bio_list) {
    1148     8114595 :                 list_del_init(&lip->li_bio_list);
    1149     8114595 :                 xfs_qm_dqflush_done(lip);
    1150             :         }
    1151     6914937 : }
    1152             : 
    1153             : void
    1154          42 : xfs_buf_dquot_io_fail(
    1155             :         struct xfs_buf          *bp)
    1156             : {
    1157          42 :         struct xfs_log_item     *lip;
    1158             : 
    1159          42 :         spin_lock(&bp->b_mount->m_ail->ail_lock);
    1160          84 :         list_for_each_entry(lip, &bp->b_li_list, li_bio_list)
    1161          42 :                 xfs_set_li_failed(lip, bp);
    1162          42 :         spin_unlock(&bp->b_mount->m_ail->ail_lock);
    1163          42 : }
    1164             : 
    1165             : /* Check incore dquot for errors before we flush. */
    1166             : static xfs_failaddr_t
    1167     8114559 : xfs_qm_dqflush_check(
    1168             :         struct xfs_dquot        *dqp)
    1169             : {
    1170     8114559 :         xfs_dqtype_t            type = xfs_dquot_type(dqp);
    1171             : 
    1172     8114559 :         if (type != XFS_DQTYPE_USER &&
    1173     8114559 :             type != XFS_DQTYPE_GROUP &&
    1174             :             type != XFS_DQTYPE_PROJ)
    1175           0 :                 return __this_address;
    1176             : 
    1177     8114559 :         if (dqp->q_id == 0)
    1178             :                 return NULL;
    1179             : 
    1180     8006404 :         if (dqp->q_blk.softlimit && dqp->q_blk.count > dqp->q_blk.softlimit &&
    1181         115 :             !dqp->q_blk.timer)
    1182           0 :                 return __this_address;
    1183             : 
    1184     8006404 :         if (dqp->q_ino.softlimit && dqp->q_ino.count > dqp->q_ino.softlimit &&
    1185         136 :             !dqp->q_ino.timer)
    1186           0 :                 return __this_address;
    1187             : 
    1188     8006404 :         if (dqp->q_rtb.softlimit && dqp->q_rtb.count > dqp->q_rtb.softlimit &&
    1189           0 :             !dqp->q_rtb.timer)
    1190           0 :                 return __this_address;
    1191             : 
    1192             :         /* bigtime flag should never be set on root dquots */
    1193     8006404 :         if (dqp->q_type & XFS_DQTYPE_BIGTIME) {
    1194     8004905 :                 if (!xfs_has_bigtime(dqp->q_mount))
    1195           0 :                         return __this_address;
    1196             :                 if (dqp->q_id == 0)
    1197           0 :                         return __this_address;
    1198             :         }
    1199             : 
    1200             :         return NULL;
    1201             : }
    1202             : 
    1203             : /*
    1204             :  * Write a modified dquot to disk.
    1205             :  * The dquot must be locked and the flush lock too taken by caller.
    1206             :  * The flush lock will not be unlocked until the dquot reaches the disk,
    1207             :  * but the dquot is free to be unlocked and modified by the caller
    1208             :  * in the interim. Dquot is still locked on return. This behavior is
    1209             :  * identical to that of inodes.
    1210             :  */
    1211             : int
    1212     9408748 : xfs_qm_dqflush(
    1213             :         struct xfs_dquot        *dqp,
    1214             :         struct xfs_buf          **bpp)
    1215             : {
    1216     9408748 :         struct xfs_mount        *mp = dqp->q_mount;
    1217     9408748 :         struct xfs_log_item     *lip = &dqp->q_logitem.qli_item;
    1218     9408748 :         struct xfs_buf          *bp;
    1219     9408748 :         struct xfs_dqblk        *dqblk;
    1220     9408748 :         xfs_failaddr_t          fa;
    1221     9408748 :         int                     error;
    1222             : 
    1223     9408748 :         ASSERT(XFS_DQ_IS_LOCKED(dqp));
    1224     9408743 :         ASSERT(!completion_done(&dqp->q_flush));
    1225             : 
    1226     9408745 :         trace_xfs_dqflush(dqp);
    1227             : 
    1228     9408741 :         *bpp = NULL;
    1229             : 
    1230     9408741 :         xfs_qm_dqunpin_wait(dqp);
    1231             : 
    1232             :         /*
    1233             :          * Get the buffer containing the on-disk dquot
    1234             :          */
    1235     9408734 :         error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp, dqp->q_blkno,
    1236     9408734 :                                    mp->m_quotainfo->qi_dqchunklen, XBF_TRYLOCK,
    1237             :                                    &bp, &xfs_dquot_buf_ops);
    1238     9408667 :         if (error == -EAGAIN)
    1239       18780 :                 goto out_unlock;
    1240     9389887 :         if (error)
    1241     1275395 :                 goto out_abort;
    1242             : 
    1243     8114492 :         fa = xfs_qm_dqflush_check(dqp);
    1244     8114541 :         if (fa) {
    1245           0 :                 xfs_alert(mp, "corrupt dquot ID 0x%x in memory at %pS",
    1246             :                                 dqp->q_id, fa);
    1247           0 :                 xfs_buf_relse(bp);
    1248           0 :                 error = -EFSCORRUPTED;
    1249           0 :                 goto out_abort;
    1250             :         }
    1251             : 
    1252             :         /* Flush the incore dquot to the ondisk buffer. */
    1253     8114541 :         dqblk = bp->b_addr + dqp->q_bufoffset;
    1254     8114541 :         xfs_dquot_to_disk(&dqblk->dd_diskdq, dqp);
    1255             : 
    1256             :         /*
    1257             :          * Clear the dirty field and remember the flush lsn for later use.
    1258             :          */
    1259     8114535 :         dqp->q_flags &= ~XFS_DQFLAG_DIRTY;
    1260             : 
    1261     8114535 :         xfs_trans_ail_copy_lsn(mp->m_ail, &dqp->q_logitem.qli_flush_lsn,
    1262             :                                         &dqp->q_logitem.qli_item.li_lsn);
    1263             : 
    1264             :         /*
    1265             :          * copy the lsn into the on-disk dquot now while we have the in memory
    1266             :          * dquot here. This can't be done later in the write verifier as we
    1267             :          * can't get access to the log item at that point in time.
    1268             :          *
    1269             :          * We also calculate the CRC here so that the on-disk dquot in the
    1270             :          * buffer always has a valid CRC. This ensures there is no possibility
    1271             :          * of a dquot without an up-to-date CRC getting to disk.
    1272             :          */
    1273     8114535 :         if (xfs_has_crc(mp)) {
    1274     8114487 :                 dqblk->dd_lsn = cpu_to_be64(dqp->q_logitem.qli_item.li_lsn);
    1275     8114487 :                 xfs_update_cksum((char *)dqblk, sizeof(struct xfs_dqblk),
    1276             :                                  XFS_DQUOT_CRC_OFF);
    1277             :         }
    1278             : 
    1279             :         /*
    1280             :          * Attach the dquot to the buffer so that we can remove this dquot from
    1281             :          * the AIL and release the flush lock once the dquot is synced to disk.
    1282             :          */
    1283     8114592 :         bp->b_flags |= _XBF_DQUOTS;
    1284     8114592 :         list_add_tail(&dqp->q_logitem.qli_item.li_bio_list, &bp->b_li_list);
    1285             : 
    1286             :         /*
    1287             :          * If the buffer is pinned then push on the log so we won't
    1288             :          * get stuck waiting in the write for too long.
    1289             :          */
    1290     8114560 :         if (xfs_buf_ispinned(bp)) {
    1291        9262 :                 trace_xfs_dqflush_force(dqp);
    1292        9262 :                 xfs_log_force(mp, 0);
    1293             :         }
    1294             : 
    1295     8114560 :         trace_xfs_dqflush_done(dqp);
    1296     8114542 :         *bpp = bp;
    1297     8114542 :         return 0;
    1298             : 
    1299     1275395 : out_abort:
    1300     1275395 :         dqp->q_flags &= ~XFS_DQFLAG_DIRTY;
    1301     1275395 :         xfs_trans_ail_delete(lip, 0);
    1302     1275395 :         xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
    1303     1294175 : out_unlock:
    1304     1294175 :         xfs_dqfunlock(dqp);
    1305     1294175 :         return error;
    1306             : }
    1307             : 
    1308             : /*
    1309             :  * Lock two xfs_dquot structures.
    1310             :  *
    1311             :  * To avoid deadlocks we always lock the quota structure with
    1312             :  * the lowerd id first.
    1313             :  */
    1314             : void
    1315     7699469 : xfs_dqlock2(
    1316             :         struct xfs_dquot        *d1,
    1317             :         struct xfs_dquot        *d2)
    1318             : {
    1319     7699469 :         if (d1 && d2) {
    1320     7699469 :                 ASSERT(d1 != d2);
    1321     7699469 :                 if (d1->q_id > d2->q_id) {
    1322     6900267 :                         mutex_lock(&d2->q_qlock);
    1323     6900319 :                         mutex_lock_nested(&d1->q_qlock, XFS_QLOCK_NESTED);
    1324             :                 } else {
    1325      799202 :                         mutex_lock(&d1->q_qlock);
    1326      799204 :                         mutex_lock_nested(&d2->q_qlock, XFS_QLOCK_NESTED);
    1327             :                 }
    1328           0 :         } else if (d1) {
    1329           0 :                 mutex_lock(&d1->q_qlock);
    1330           0 :         } else if (d2) {
    1331           0 :                 mutex_lock(&d2->q_qlock);
    1332             :         }
    1333     7699516 : }
    1334             : 
    1335             : int __init
    1336          12 : xfs_qm_init(void)
    1337             : {
    1338          12 :         xfs_dquot_cache = kmem_cache_create("xfs_dquot",
    1339             :                                           sizeof(struct xfs_dquot),
    1340             :                                           0, 0, NULL);
    1341          12 :         if (!xfs_dquot_cache)
    1342           0 :                 goto out;
    1343             : 
    1344          12 :         xfs_dqtrx_cache = kmem_cache_create("xfs_dqtrx",
    1345             :                                              sizeof(struct xfs_dquot_acct),
    1346             :                                              0, 0, NULL);
    1347          12 :         if (!xfs_dqtrx_cache)
    1348           0 :                 goto out_free_dquot_cache;
    1349             : 
    1350             :         return 0;
    1351             : 
    1352             : out_free_dquot_cache:
    1353           0 :         kmem_cache_destroy(xfs_dquot_cache);
    1354             : out:
    1355             :         return -ENOMEM;
    1356             : }
    1357             : 
    1358             : void
    1359          12 : xfs_qm_exit(void)
    1360             : {
    1361          12 :         kmem_cache_destroy(xfs_dqtrx_cache);
    1362          12 :         kmem_cache_destroy(xfs_dquot_cache);
    1363          12 : }
    1364             : 
    1365             : /*
    1366             :  * Iterate every dquot of a particular type.  The caller must ensure that the
    1367             :  * particular quota type is active.  iter_fn can return negative error codes,
    1368             :  * or -ECANCELED to indicate that it wants to stop iterating.
    1369             :  */
    1370             : int
    1371      377914 : xfs_qm_dqiterate(
    1372             :         struct xfs_mount        *mp,
    1373             :         xfs_dqtype_t            type,
    1374             :         xfs_qm_dqiterate_fn     iter_fn,
    1375             :         void                    *priv)
    1376             : {
    1377      377914 :         struct xfs_dquot        *dq;
    1378      377914 :         xfs_dqid_t              id = 0;
    1379      377914 :         int                     error;
    1380             : 
    1381      377914 :         do {
    1382      377914 :                 error = xfs_qm_dqget_next(mp, id, type, &dq);
    1383      377914 :                 if (error == -ENOENT)
    1384             :                         return 0;
    1385      377914 :                 if (error)
    1386           0 :                         return error;
    1387             : 
    1388      377914 :                 error = iter_fn(dq, type, priv);
    1389      377914 :                 id = dq->q_id;
    1390      377914 :                 xfs_qm_dqput(dq);
    1391      377914 :         } while (error == 0 && id != 0);
    1392             : 
    1393             :         return error;
    1394             : }

Generated by: LCOV version 1.14