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-djwx @ Mon Jul 31 20:08:22 PDT 2023 Lines: 548 592 92.6 %
Date: 2023-07-31 20:08:22 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    14575647 : xfs_qm_dqdestroy(
      52             :         struct xfs_dquot        *dqp)
      53             : {
      54    14575647 :         ASSERT(list_empty(&dqp->q_lru));
      55             : 
      56    14575647 :         kmem_free(dqp->q_logitem.qli_item.li_lv_shadow);
      57    14575610 :         mutex_destroy(&dqp->q_qlock);
      58             : 
      59    14575627 :         XFS_STATS_DEC(dqp->q_mount, xs_qm_dquot);
      60    14575660 :         kmem_cache_free(xfs_dquot_cache, dqp);
      61    14575685 : }
      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   200021656 : xfs_qm_adjust_dqlimits(
      70             :         struct xfs_dquot        *dq)
      71             : {
      72   200021656 :         struct xfs_mount        *mp = dq->q_mount;
      73   200021656 :         struct xfs_quotainfo    *q = mp->m_quotainfo;
      74   200021656 :         struct xfs_def_quota    *defq;
      75   200021656 :         int                     prealloc = 0;
      76             : 
      77   200021656 :         ASSERT(dq->q_id);
      78   200021656 :         defq = xfs_get_defquota(q, xfs_dquot_type(dq));
      79             : 
      80   200019819 :         if (!dq->q_blk.softlimit) {
      81   199737895 :                 dq->q_blk.softlimit = defq->blk.soft;
      82   199737895 :                 prealloc = 1;
      83             :         }
      84   200019819 :         if (!dq->q_blk.hardlimit) {
      85   199724914 :                 dq->q_blk.hardlimit = defq->blk.hard;
      86   199724914 :                 prealloc = 1;
      87             :         }
      88   200019819 :         if (!dq->q_ino.softlimit)
      89   199753764 :                 dq->q_ino.softlimit = defq->ino.soft;
      90   200019819 :         if (!dq->q_ino.hardlimit)
      91   199753718 :                 dq->q_ino.hardlimit = defq->ino.hard;
      92   200019819 :         if (!dq->q_rtb.softlimit)
      93   200020588 :                 dq->q_rtb.softlimit = defq->rtb.soft;
      94   200019819 :         if (!dq->q_rtb.hardlimit)
      95   200020268 :                 dq->q_rtb.hardlimit = defq->rtb.hard;
      96             : 
      97   200019819 :         if (prealloc)
      98   199737697 :                 xfs_dquot_set_prealloc_limits(dq);
      99   200017261 : }
     100             : 
     101             : /* Set the expiration time of a quota's grace period. */
     102             : time64_t
     103         222 : xfs_dquot_set_timeout(
     104             :         struct xfs_mount        *mp,
     105             :         time64_t                timeout)
     106             : {
     107         886 :         struct xfs_quotainfo    *qi = mp->m_quotainfo;
     108             : 
     109         886 :         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       16985 : xfs_dquot_set_grace_period(
     116             :         time64_t                grace)
     117             : {
     118       16985 :         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   600194866 : xfs_qm_adjust_res_timer(
     127             :         struct xfs_mount        *mp,
     128             :         struct xfs_dquot_res    *res,
     129             :         struct xfs_quota_limits *qlim)
     130             : {
     131   600194866 :         ASSERT(res->hardlimit == 0 || res->softlimit <= res->hardlimit);
     132             : 
     133   600194866 :         if ((res->softlimit && res->count > res->softlimit) ||
     134   600171409 :             (res->hardlimit && res->count > res->hardlimit)) {
     135       23519 :                 if (res->timer == 0)
     136         664 :                         res->timer = xfs_dquot_set_timeout(mp,
     137         664 :                                         ktime_get_real_seconds() + qlim->time);
     138             :         } else {
     139   600171347 :                 res->timer = 0;
     140             :         }
     141   600194866 : }
     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   200075324 : xfs_qm_adjust_dqtimers(
     158             :         struct xfs_dquot        *dq)
     159             : {
     160   200075324 :         struct xfs_mount        *mp = dq->q_mount;
     161   200075324 :         struct xfs_quotainfo    *qi = mp->m_quotainfo;
     162   200075324 :         struct xfs_def_quota    *defq;
     163             : 
     164   200075324 :         ASSERT(dq->q_id);
     165   200075324 :         defq = xfs_get_defquota(qi, xfs_dquot_type(dq));
     166             : 
     167   200069956 :         xfs_qm_adjust_res_timer(dq->q_mount, &dq->q_blk, &defq->blk);
     168   200068040 :         xfs_qm_adjust_res_timer(dq->q_mount, &dq->q_ino, &defq->ino);
     169   200068136 :         xfs_qm_adjust_res_timer(dq->q_mount, &dq->q_rtb, &defq->rtb);
     170   200068626 : }
     171             : 
     172             : /*
     173             :  * initialize a buffer full of dquots and log the whole thing
     174             :  */
     175             : STATIC void
     176     2296711 : 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     2296711 :         struct xfs_quotainfo    *q = mp->m_quotainfo;
     184     2296711 :         struct xfs_dqblk        *d;
     185     2296711 :         xfs_dqid_t              curid;
     186     2296711 :         unsigned int            qflag;
     187     2296711 :         unsigned int            blftype;
     188     2296711 :         int                     i;
     189             : 
     190     2296711 :         ASSERT(tp);
     191     2296711 :         ASSERT(xfs_buf_islocked(bp));
     192             : 
     193     2296711 :         switch (type) {
     194             :         case XFS_DQTYPE_USER:
     195             :                 qflag = XFS_UQUOTA_CHKD;
     196             :                 blftype = XFS_BLF_UDQUOT_BUF;
     197             :                 break;
     198       48474 :         case XFS_DQTYPE_PROJ:
     199       48474 :                 qflag = XFS_PQUOTA_CHKD;
     200       48474 :                 blftype = XFS_BLF_PDQUOT_BUF;
     201       48474 :                 break;
     202     1121701 :         case XFS_DQTYPE_GROUP:
     203     1121701 :                 qflag = XFS_GQUOTA_CHKD;
     204     1121701 :                 blftype = XFS_BLF_GDQUOT_BUF;
     205     1121701 :                 break;
     206           0 :         default:
     207           0 :                 ASSERT(0);
     208           0 :                 return;
     209             :         }
     210             : 
     211     2296711 :         d = bp->b_addr;
     212             : 
     213             :         /*
     214             :          * ID of the first dquot in the block - id's are zero based.
     215             :          */
     216     2296711 :         curid = id - (id % q->qi_dqperchunk);
     217     2296711 :         memset(d, 0, BBTOB(q->qi_dqchunklen));
     218    71179758 :         for (i = 0; i < q->qi_dqperchunk; i++, d++, curid++) {
     219    68883118 :                 d->dd_diskdq.d_magic = cpu_to_be16(XFS_DQUOT_MAGIC);
     220    68883118 :                 d->dd_diskdq.d_version = XFS_DQUOT_VERSION;
     221    68883118 :                 d->dd_diskdq.d_id = cpu_to_be32(curid);
     222    68883118 :                 d->dd_diskdq.d_type = type;
     223    68883118 :                 if (curid > 0 && xfs_has_bigtime(mp))
     224    68769605 :                         d->dd_diskdq.d_type |= XFS_DQTYPE_BIGTIME;
     225    68883118 :                 if (xfs_has_crc(mp)) {
     226    68880410 :                         uuid_copy(&d->dd_uuid, &mp->m_sb.sb_meta_uuid);
     227    68878539 :                         xfs_update_cksum((char *)d, sizeof(struct xfs_dqblk),
     228             :                                          XFS_DQUOT_CRC_OFF);
     229             :                 }
     230             :         }
     231             : 
     232     2296640 :         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     2296079 :         if (!(mp->m_qflags & qflag))
     251       24551 :                 xfs_trans_ordered_buf(tp, bp);
     252             :         else
     253     2271528 :                 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   214091230 : xfs_dquot_set_prealloc_limits(struct xfs_dquot *dqp)
     263             : {
     264   214091230 :         uint64_t space;
     265             : 
     266   214091230 :         dqp->q_prealloc_hi_wmark = dqp->q_blk.hardlimit;
     267   214091230 :         dqp->q_prealloc_lo_wmark = dqp->q_blk.softlimit;
     268   214091230 :         if (!dqp->q_prealloc_lo_wmark) {
     269   214057997 :                 dqp->q_prealloc_lo_wmark = dqp->q_prealloc_hi_wmark;
     270   214057997 :                 do_div(dqp->q_prealloc_lo_wmark, 100);
     271   214057997 :                 dqp->q_prealloc_lo_wmark *= 95;
     272             :         }
     273             : 
     274   214091230 :         space = dqp->q_prealloc_hi_wmark;
     275             : 
     276   214091230 :         do_div(space, 100);
     277   214091230 :         dqp->q_low_space[XFS_QLOWSP_1_PCNT] = space;
     278   214091230 :         dqp->q_low_space[XFS_QLOWSP_3_PCNT] = space * 3;
     279   214091230 :         dqp->q_low_space[XFS_QLOWSP_5_PCNT] = space * 5;
     280   214091230 : }
     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     2329693 : xfs_dquot_disk_alloc(
     289             :         struct xfs_dquot        *dqp,
     290             :         struct xfs_buf          **bpp)
     291             : {
     292     2329693 :         struct xfs_bmbt_irec    map;
     293     2329693 :         struct xfs_trans        *tp;
     294     2329693 :         struct xfs_mount        *mp = dqp->q_mount;
     295     2329693 :         struct xfs_buf          *bp;
     296     2329693 :         xfs_dqtype_t            qtype = xfs_dquot_type(dqp);
     297     2329693 :         struct xfs_inode        *quotip = xfs_quota_inode(mp, qtype);
     298     2329638 :         int                     nmaps = 1;
     299     2329638 :         int                     error;
     300             : 
     301     2329638 :         trace_xfs_dqalloc(dqp);
     302             : 
     303     2329546 :         error = xfs_trans_alloc(mp, &M_RES(mp)->tr_qm_dqalloc,
     304     2329546 :                         XFS_QM_DQALLOC_SPACE_RES(mp), 0, 0, &tp);
     305     2329360 :         if (error)
     306             :                 return error;
     307             : 
     308     2297361 :         xfs_ilock(quotip, XFS_ILOCK_EXCL);
     309     2297996 :         xfs_trans_ijoin(tp, quotip, 0);
     310             : 
     311     2298092 :         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     2298092 :         error = xfs_iext_count_may_overflow(quotip, XFS_DATA_FORK,
     321             :                         XFS_IEXT_ADD_NOSPLIT_CNT);
     322     2297968 :         if (error == -EFBIG)
     323           5 :                 error = xfs_iext_count_upgrade(tp, quotip,
     324             :                                 XFS_IEXT_ADD_NOSPLIT_CNT);
     325     2297968 :         if (error)
     326           5 :                 goto err_cancel;
     327             : 
     328             :         /* Create the block mapping. */
     329     2297963 :         error = xfs_bmapi_write(tp, quotip, dqp->q_fileoffset,
     330             :                         XFS_DQUOT_CLUSTER_SIZE_FSB, XFS_BMAPI_METADATA, 0, &map,
     331             :                         &nmaps);
     332     2297880 :         if (error)
     333        1463 :                 goto err_cancel;
     334             : 
     335     2296417 :         ASSERT(map.br_blockcount == XFS_DQUOT_CLUSTER_SIZE_FSB);
     336     2296417 :         ASSERT(nmaps == 1);
     337     2296417 :         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     2296417 :         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     2296153 :         error = xfs_trans_get_buf(tp, mp->m_ddev_targp, dqp->q_blkno,
     347     2296153 :                         mp->m_quotainfo->qi_dqchunklen, 0, &bp);
     348     2296489 :         if (error)
     349           0 :                 goto err_cancel;
     350     2296489 :         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     2296489 :         xfs_qm_init_dquot_blk(tp, mp, dqp->q_id, qtype, bp);
     357     2296083 :         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     2296132 :         xfs_trans_bhold(tp, bp);
     384     2295771 :         error = xfs_trans_commit(tp);
     385     2296552 :         xfs_iunlock(quotip, XFS_ILOCK_EXCL);
     386     2296548 :         if (error) {
     387         174 :                 xfs_buf_relse(bp);
     388         174 :                 return error;
     389             :         }
     390             : 
     391     2296374 :         *bpp = bp;
     392     2296374 :         return 0;
     393             : 
     394        1468 : err_cancel:
     395        1468 :         xfs_trans_cancel(tp);
     396        1468 :         xfs_iunlock(quotip, XFS_ILOCK_EXCL);
     397        1468 :         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    14575361 : xfs_dquot_disk_read(
     406             :         struct xfs_mount        *mp,
     407             :         struct xfs_dquot        *dqp,
     408             :         struct xfs_buf          **bpp)
     409             : {
     410    14575361 :         struct xfs_bmbt_irec    map;
     411    14575361 :         struct xfs_buf          *bp;
     412    14575361 :         xfs_dqtype_t            qtype = xfs_dquot_type(dqp);
     413    14575361 :         struct xfs_inode        *quotip = xfs_quota_inode(mp, qtype);
     414    14575191 :         uint                    lock_mode;
     415    14575191 :         int                     nmaps = 1;
     416    14575191 :         int                     error;
     417             : 
     418    14575191 :         lock_mode = xfs_ilock_data_map_shared(quotip);
     419    14575170 :         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    14575170 :         error = xfs_bmapi_read(quotip, dqp->q_fileoffset,
     432             :                         XFS_DQUOT_CLUSTER_SIZE_FSB, &map, &nmaps, 0);
     433    14575070 :         xfs_iunlock(quotip, lock_mode);
     434    14575196 :         if (error)
     435             :                 return error;
     436             : 
     437    14574668 :         ASSERT(nmaps == 1);
     438    14574668 :         ASSERT(map.br_blockcount >= 1);
     439    14574668 :         ASSERT(map.br_startblock != DELAYSTARTBLOCK);
     440    14574668 :         if (map.br_startblock == HOLESTARTBLOCK)
     441             :                 return -ENOENT;
     442             : 
     443    11999622 :         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    11999547 :         dqp->q_blkno = XFS_FSB_TO_DADDR(mp, map.br_startblock);
     450             : 
     451    11999535 :         error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp, dqp->q_blkno,
     452    11999535 :                         mp->m_quotainfo->qi_dqchunklen, 0, &bp,
     453             :                         &xfs_dquot_buf_ops);
     454    11999717 :         if (error) {
     455        5098 :                 ASSERT(bp == NULL);
     456        5098 :                 return error;
     457             :         }
     458             : 
     459    11994619 :         ASSERT(xfs_buf_islocked(bp));
     460    11994619 :         xfs_buf_set_ref(bp, XFS_DQUOT_REF);
     461    11994532 :         *bpp = bp;
     462             : 
     463    11994532 :         return 0;
     464             : }
     465             : 
     466             : /* Allocate and initialize everything we need for an incore dquot. */
     467             : STATIC struct xfs_dquot *
     468    14575680 : xfs_dquot_alloc(
     469             :         struct xfs_mount        *mp,
     470             :         xfs_dqid_t              id,
     471             :         xfs_dqtype_t            type)
     472             : {
     473    14575680 :         struct xfs_dquot        *dqp;
     474             : 
     475    14575680 :         dqp = kmem_cache_zalloc(xfs_dquot_cache, GFP_KERNEL | __GFP_NOFAIL);
     476             : 
     477    14575673 :         dqp->q_type = type;
     478    14575673 :         dqp->q_id = id;
     479    14575673 :         dqp->q_mount = mp;
     480    14575673 :         INIT_LIST_HEAD(&dqp->q_lru);
     481    14575673 :         mutex_init(&dqp->q_qlock);
     482    14575605 :         init_waitqueue_head(&dqp->q_pinwait);
     483    14575585 :         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    14575585 :         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    14575585 :         init_completion(&dqp->q_flush);
     496    14575528 :         complete(&dqp->q_flush);
     497             : 
     498             :         /*
     499             :          * Make sure group quotas have a different lock class than user
     500             :          * quotas.
     501             :          */
     502    14575456 :         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    14575456 :         xfs_qm_dquot_logitem_init(dqp);
     518             : 
     519    14575329 :         XFS_STATS_INC(mp, xs_qm_dquot);
     520    14575398 :         return dqp;
     521             : }
     522             : 
     523             : /* Check the ondisk dquot's id and type match what the incore dquot expects. */
     524             : static bool
     525    14290693 : xfs_dquot_check_type(
     526             :         struct xfs_dquot        *dqp,
     527             :         struct xfs_disk_dquot   *ddqp)
     528             : {
     529    14290693 :         uint8_t                 ddqp_type;
     530    14290693 :         uint8_t                 dqp_type;
     531             : 
     532    14290693 :         ddqp_type = ddqp->d_type & XFS_DQTYPE_REC_MASK;
     533    14290693 :         dqp_type = xfs_dquot_type(dqp);
     534             : 
     535    14290693 :         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    14290915 :         if (xfs_has_crc(dqp->q_mount) ||
     544          85 :             dqp_type == XFS_DQTYPE_USER || dqp->q_id != 0)
     545    14290830 :                 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          85 :         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    14290873 : xfs_dquot_from_disk(
     562             :         struct xfs_dquot        *dqp,
     563             :         struct xfs_buf          *bp)
     564             : {
     565    14290873 :         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    14290873 :         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    14290873 :         dqp->q_type = ddqp->d_type;
     581    14290873 :         dqp->q_blk.hardlimit = be64_to_cpu(ddqp->d_blk_hardlimit);
     582    14290873 :         dqp->q_blk.softlimit = be64_to_cpu(ddqp->d_blk_softlimit);
     583    14290873 :         dqp->q_ino.hardlimit = be64_to_cpu(ddqp->d_ino_hardlimit);
     584    14290873 :         dqp->q_ino.softlimit = be64_to_cpu(ddqp->d_ino_softlimit);
     585    14290873 :         dqp->q_rtb.hardlimit = be64_to_cpu(ddqp->d_rtb_hardlimit);
     586    14290873 :         dqp->q_rtb.softlimit = be64_to_cpu(ddqp->d_rtb_softlimit);
     587             : 
     588    14290873 :         dqp->q_blk.count = be64_to_cpu(ddqp->d_bcount);
     589    14290873 :         dqp->q_ino.count = be64_to_cpu(ddqp->d_icount);
     590    14290873 :         dqp->q_rtb.count = be64_to_cpu(ddqp->d_rtbcount);
     591             : 
     592    14290873 :         dqp->q_blk.timer = xfs_dquot_from_disk_ts(ddqp, ddqp->d_btimer);
     593    14290743 :         dqp->q_ino.timer = xfs_dquot_from_disk_ts(ddqp, ddqp->d_itimer);
     594    14290872 :         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    14290888 :         dqp->q_blk.reserved = dqp->q_blk.count;
     601    14290888 :         dqp->q_ino.reserved = dqp->q_ino.count;
     602    14290888 :         dqp->q_rtb.reserved = dqp->q_rtb.count;
     603             : 
     604             :         /* initialize the dquot speculative prealloc thresholds */
     605    14290888 :         xfs_dquot_set_prealloc_limits(dqp);
     606    14290888 :         return 0;
     607             : }
     608             : 
     609             : /* Copy the in-core quota fields into the on-disk buffer. */
     610             : void
     611  2858876580 : xfs_dquot_to_disk(
     612             :         struct xfs_disk_dquot   *ddqp,
     613             :         struct xfs_dquot        *dqp)
     614             : {
     615  2858876580 :         ddqp->d_magic = cpu_to_be16(XFS_DQUOT_MAGIC);
     616  2858876580 :         ddqp->d_version = XFS_DQUOT_VERSION;
     617  2858876580 :         ddqp->d_type = dqp->q_type;
     618  2858876580 :         ddqp->d_id = cpu_to_be32(dqp->q_id);
     619  2858876580 :         ddqp->d_pad0 = 0;
     620  2858876580 :         ddqp->d_pad = 0;
     621             : 
     622  2858876580 :         ddqp->d_blk_hardlimit = cpu_to_be64(dqp->q_blk.hardlimit);
     623  2858876580 :         ddqp->d_blk_softlimit = cpu_to_be64(dqp->q_blk.softlimit);
     624  2858876580 :         ddqp->d_ino_hardlimit = cpu_to_be64(dqp->q_ino.hardlimit);
     625  2858876580 :         ddqp->d_ino_softlimit = cpu_to_be64(dqp->q_ino.softlimit);
     626  2858876580 :         ddqp->d_rtb_hardlimit = cpu_to_be64(dqp->q_rtb.hardlimit);
     627  2858876580 :         ddqp->d_rtb_softlimit = cpu_to_be64(dqp->q_rtb.softlimit);
     628             : 
     629  2858876580 :         ddqp->d_bcount = cpu_to_be64(dqp->q_blk.count);
     630  2858876580 :         ddqp->d_icount = cpu_to_be64(dqp->q_ino.count);
     631  2858876580 :         ddqp->d_rtbcount = cpu_to_be64(dqp->q_rtb.count);
     632             : 
     633  2858876580 :         ddqp->d_bwarns = 0;
     634  2858876580 :         ddqp->d_iwarns = 0;
     635  2858876580 :         ddqp->d_rtbwarns = 0;
     636             : 
     637  2858876580 :         ddqp->d_btimer = xfs_dquot_to_disk_ts(dqp, dqp->q_blk.timer);
     638  2858868520 :         ddqp->d_itimer = xfs_dquot_to_disk_ts(dqp, dqp->q_ino.timer);
     639  2858879032 :         ddqp->d_rtbtimer = xfs_dquot_to_disk_ts(dqp, dqp->q_rtb.timer);
     640  2858880777 : }
     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    14575686 : 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    14575686 :         struct xfs_dquot        *dqp;
     656    14575686 :         struct xfs_buf          *bp;
     657    14575686 :         int                     error;
     658             : 
     659    14575686 :         dqp = xfs_dquot_alloc(mp, id, type);
     660    14575437 :         trace_xfs_dqread(dqp);
     661             : 
     662             :         /* Try to read the buffer, allocating if necessary. */
     663    14575411 :         error = xfs_dquot_disk_read(mp, dqp, &bp);
     664    14574899 :         if (error == -ENOENT && can_alloc)
     665     2329748 :                 error = xfs_dquot_disk_alloc(dqp, &bp);
     666    14575004 :         if (error)
     667      284299 :                 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    14290705 :         ASSERT(xfs_buf_islocked(bp));
     676    14290705 :         error = xfs_dquot_from_disk(dqp, bp);
     677    14290648 :         xfs_buf_relse(bp);
     678    14291211 :         if (error)
     679           0 :                 goto err;
     680             : 
     681    14291211 :         *dqpp = dqp;
     682    14291211 :         return error;
     683             : 
     684      284299 : err:
     685      284299 :         trace_xfs_dqread_fail(dqp);
     686      284288 :         xfs_qm_dqdestroy(dqp);
     687      284371 :         *dqpp = NULL;
     688      284371 :         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    12565404 : xfs_dq_get_next_id(
     698             :         struct xfs_mount        *mp,
     699             :         xfs_dqtype_t            type,
     700             :         xfs_dqid_t              *id)
     701             : {
     702    12565404 :         struct xfs_inode        *quotip = xfs_quota_inode(mp, type);
     703    12565404 :         xfs_dqid_t              next_id = *id + 1; /* simple advance */
     704    12565404 :         uint                    lock_flags;
     705    12565404 :         struct xfs_bmbt_irec    got;
     706    12565404 :         struct xfs_iext_cursor  cur;
     707    12565404 :         xfs_fsblock_t           start;
     708    12565404 :         int                     error = 0;
     709             : 
     710             :         /* If we'd wrap past the max ID, stop */
     711    12565404 :         if (next_id < *id)
     712             :                 return -ENOENT;
     713             : 
     714             :         /* If new ID is within the current chunk, advancing it sufficed */
     715    12565363 :         if (next_id % mp->m_quotainfo->qi_dqperchunk) {
     716    12146302 :                 *id = next_id;
     717    12146302 :                 return 0;
     718             :         }
     719             : 
     720             :         /* Nope, next_id is now past the current chunk, so find the next one */
     721      419061 :         start = (xfs_fsblock_t)next_id / mp->m_quotainfo->qi_dqperchunk;
     722             : 
     723      419061 :         lock_flags = xfs_ilock_data_map_shared(quotip);
     724      419061 :         error = xfs_iread_extents(NULL, quotip, XFS_DATA_FORK);
     725      419061 :         if (error)
     726             :                 return error;
     727             : 
     728      419061 :         if (xfs_iext_lookup_extent(quotip, &quotip->i_df, start, &cur, &got)) {
     729             :                 /* contiguous chunk, bump startoff for the id calculation */
     730      416238 :                 if (got.br_startoff < start)
     731         285 :                         got.br_startoff = start;
     732      416238 :                 *id = got.br_startoff * mp->m_quotainfo->qi_dqperchunk;
     733             :         } else {
     734             :                 error = -ENOENT;
     735             :         }
     736             : 
     737      419061 :         xfs_iunlock(quotip, lock_flags);
     738             : 
     739      419061 :         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    47722068 : 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    47722069 :         struct xfs_dquot        *dqp;
     754             : 
     755    47722069 : restart:
     756    47722069 :         mutex_lock(&qi->qi_tree_lock);
     757    47804434 :         dqp = radix_tree_lookup(tree, id);
     758    47804434 :         if (!dqp) {
     759    14371840 :                 mutex_unlock(&qi->qi_tree_lock);
     760    14371840 :                 XFS_STATS_INC(mp, xs_qm_dqcachemisses);
     761    14371837 :                 return NULL;
     762             :         }
     763             : 
     764    33432594 :         xfs_dqlock(dqp);
     765    33432594 :         if (dqp->q_flags & XFS_DQFLAG_FREEING) {
     766           1 :                 xfs_dqunlock(dqp);
     767           1 :                 mutex_unlock(&qi->qi_tree_lock);
     768           1 :                 trace_xfs_dqget_freeing(dqp);
     769           1 :                 delay(1);
     770           1 :                 goto restart;
     771             :         }
     772             : 
     773    33432593 :         dqp->q_nrefs++;
     774    33432593 :         mutex_unlock(&qi->qi_tree_lock);
     775             : 
     776    33432589 :         trace_xfs_dqget_hit(dqp);
     777    33432582 :         XFS_STATS_INC(mp, xs_qm_dqcachehits);
     778    33432575 :         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    14125995 : 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    14125995 :         int                     error;
     796             : 
     797    14125995 :         mutex_lock(&qi->qi_tree_lock);
     798    14126380 :         error = radix_tree_insert(tree, id, dqp);
     799    14126380 :         if (unlikely(error)) {
     800             :                 /* Duplicate found!  Caller must try again. */
     801         263 :                 mutex_unlock(&qi->qi_tree_lock);
     802         263 :                 trace_xfs_dqget_dup(dqp);
     803         263 :                 return error;
     804             :         }
     805             : 
     806             :         /* Return a locked dquot to the caller, with a reference taken. */
     807    14126117 :         xfs_dqlock(dqp);
     808    14126117 :         dqp->q_nrefs = 1;
     809             : 
     810    14126117 :         qi->qi_dquots++;
     811    14126117 :         mutex_unlock(&qi->qi_tree_lock);
     812             : 
     813    14126117 :         return 0;
     814             : }
     815             : 
     816             : /* Check our input parameters. */
     817             : static int
     818    47906034 : xfs_qm_dqget_checks(
     819             :         struct xfs_mount        *mp,
     820             :         xfs_dqtype_t            type)
     821             : {
     822    47906034 :         switch (type) {
     823    21081143 :         case XFS_DQTYPE_USER:
     824    21081143 :                 if (!XFS_IS_UQUOTA_ON(mp))
     825        1008 :                         return -ESRCH;
     826             :                 return 0;
     827    20764435 :         case XFS_DQTYPE_GROUP:
     828    20764435 :                 if (!XFS_IS_GQUOTA_ON(mp))
     829        2822 :                         return -ESRCH;
     830             :                 return 0;
     831     6060456 :         case XFS_DQTYPE_PROJ:
     832     6060456 :                 if (!XFS_IS_PQUOTA_ON(mp))
     833        1011 :                         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    31973194 : 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    31973194 :         struct xfs_quotainfo    *qi = mp->m_quotainfo;
     854    31973194 :         struct radix_tree_root  *tree = xfs_dquot_tree(qi, type);
     855    31919644 :         struct xfs_dquot        *dqp;
     856    31919644 :         int                     error;
     857             : 
     858    31919644 :         error = xfs_qm_dqget_checks(mp, type);
     859    31919644 :         if (error)
     860             :                 return error;
     861             : 
     862    31917166 : restart:
     863    31917344 :         dqp = xfs_qm_dqget_cache_lookup(mp, qi, tree, id);
     864    32042498 :         if (dqp) {
     865    18599127 :                 *O_dqpp = dqp;
     866    18599127 :                 return 0;
     867             :         }
     868             : 
     869    13443371 :         error = xfs_qm_dqread(mp, id, type, can_alloc, &dqp);
     870    13443182 :         if (error)
     871      241799 :                 return error;
     872             : 
     873    13201383 :         error = xfs_qm_dqget_cache_insert(mp, qi, tree, id, dqp);
     874    13201515 :         if (error) {
     875             :                 /*
     876             :                  * Duplicate found. Just throw away the new dquot and start
     877             :                  * over.
     878             :                  */
     879         178 :                 xfs_qm_dqdestroy(dqp);
     880         178 :                 XFS_STATS_INC(mp, xs_qm_dquot_dups);
     881         178 :                 goto restart;
     882             :         }
     883             : 
     884    13201337 :         trace_xfs_dqget_miss(dqp);
     885    13201336 :         *O_dqpp = dqp;
     886    13201336 :         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      206227 : 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      206227 :         int                     error;
     903             : 
     904      206227 :         error = xfs_qm_dqget_checks(mp, type);
     905      206227 :         if (error)
     906             :                 return error;
     907             : 
     908      203864 :         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    16110156 : xfs_qm_id_for_quotatype(
     914             :         struct xfs_inode        *ip,
     915             :         xfs_dqtype_t            type)
     916             : {
     917    16110156 :         switch (type) {
     918             :         case XFS_DQTYPE_USER:
     919     5372594 :                 return i_uid_read(VFS_I(ip));
     920             :         case XFS_DQTYPE_GROUP:
     921     5369441 :                 return i_gid_read(VFS_I(ip));
     922     5368121 :         case XFS_DQTYPE_PROJ:
     923     5368121 :                 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    15761653 : 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    15761653 :         struct xfs_mount        *mp = ip->i_mount;
     942    15761653 :         struct xfs_quotainfo    *qi = mp->m_quotainfo;
     943    15761653 :         struct radix_tree_root  *tree = xfs_dquot_tree(qi, type);
     944    15761560 :         struct xfs_dquot        *dqp;
     945    15761560 :         xfs_dqid_t              id;
     946    15761560 :         int                     error;
     947             : 
     948    15761560 :         error = xfs_qm_dqget_checks(mp, type);
     949    15761560 :         if (error)
     950             :                 return error;
     951             : 
     952    15761538 :         ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
     953    31523128 :         ASSERT(xfs_inode_dquot(ip, type) == NULL);
     954             : 
     955    15761564 :         id = xfs_qm_id_for_quotatype(ip, type);
     956             : 
     957    15761582 : restart:
     958    15761582 :         dqp = xfs_qm_dqget_cache_lookup(mp, qi, tree, id);
     959    15761886 :         if (dqp) {
     960    14833422 :                 *O_dqpp = dqp;
     961    14833422 :                 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      928464 :         xfs_iunlock(ip, XFS_ILOCK_EXCL);
     972      928454 :         error = xfs_qm_dqread(mp, id, type, can_alloc, &dqp);
     973      928453 :         xfs_ilock(ip, XFS_ILOCK_EXCL);
     974      928410 :         if (error)
     975        3601 :                 return error;
     976             : 
     977             :         /*
     978             :          * A dquot could be attached to this inode by now, since we had
     979             :          * dropped the ilock.
     980             :          */
     981      924809 :         if (xfs_this_quota_on(mp, type)) {
     982      924809 :                 struct xfs_dquot        *dqp1;
     983             : 
     984      924809 :                 dqp1 = xfs_inode_dquot(ip, type);
     985      924809 :                 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      924809 :         error = xfs_qm_dqget_cache_insert(mp, qi, tree, id, dqp);
     998      924864 :         if (error) {
     999             :                 /*
    1000             :                  * Duplicate found. Just throw away the new dquot and start
    1001             :                  * over.
    1002             :                  */
    1003          85 :                 xfs_qm_dqdestroy(dqp);
    1004          85 :                 XFS_STATS_INC(mp, xs_qm_dquot_dups);
    1005          85 :                 goto restart;
    1006             :         }
    1007             : 
    1008      924779 : dqret:
    1009      924779 :         ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
    1010      924779 :         trace_xfs_dqget_miss(dqp);
    1011      924779 :         *O_dqpp = dqp;
    1012      924779 :         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      654916 : 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      654916 :         struct xfs_dquot        *dqp;
    1027      654916 :         int                     error = 0;
    1028             : 
    1029      654916 :         *dqpp = NULL;
    1030    13220320 :         for (; !error; error = xfs_dq_get_next_id(mp, type, &id)) {
    1031    13217456 :                 error = xfs_qm_dqget(mp, id, type, false, &dqp);
    1032    13217456 :                 if (error == -ENOENT)
    1033      181938 :                         continue;
    1034    13035518 :                 else if (error != 0)
    1035             :                         break;
    1036             : 
    1037    13035458 :                 if (!XFS_IS_DQUOT_UNINITIALIZED(dqp)) {
    1038      651992 :                         *dqpp = dqp;
    1039      651992 :                         return 0;
    1040             :                 }
    1041             : 
    1042    12383466 :                 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   311789063 : xfs_qm_dqput(
    1056             :         struct xfs_dquot        *dqp)
    1057             : {
    1058   311789063 :         ASSERT(dqp->q_nrefs > 0);
    1059   311789063 :         ASSERT(XFS_DQ_IS_LOCKED(dqp));
    1060             : 
    1061   311841369 :         trace_xfs_dqput(dqp);
    1062             : 
    1063   311822241 :         if (--dqp->q_nrefs == 0) {
    1064    19376013 :                 struct xfs_quotainfo    *qi = dqp->q_mount->m_quotainfo;
    1065    19376013 :                 trace_xfs_dqput_free(dqp);
    1066             : 
    1067    19375995 :                 if (list_lru_add(&qi->qi_lru, &dqp->q_lru))
    1068    14163446 :                         XFS_STATS_INC(dqp->q_mount, xs_qm_dquot_unused);
    1069             :         }
    1070   311822413 :         xfs_dqunlock(dqp);
    1071   312040456 : }
    1072             : 
    1073             : /*
    1074             :  * Release a dquot. Flush it if dirty, then dqput() it.
    1075             :  * dquot must not be locked.
    1076             :  */
    1077             : void
    1078   521646697 : xfs_qm_dqrele(
    1079             :         struct xfs_dquot        *dqp)
    1080             : {
    1081   521646697 :         if (!dqp)
    1082             :                 return;
    1083             : 
    1084   298473232 :         trace_xfs_dqrele(dqp);
    1085             : 
    1086   298386200 :         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   298485238 :         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    11533268 : xfs_qm_dqflush_done(
    1105             :         struct xfs_log_item     *lip)
    1106             : {
    1107    11533268 :         struct xfs_dq_logitem   *qip = (struct xfs_dq_logitem *)lip;
    1108    11533268 :         struct xfs_dquot        *dqp = qip->qli_dquot;
    1109    11533268 :         struct xfs_ail          *ailp = lip->li_ailp;
    1110    11533268 :         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    23071494 :         if (test_bit(XFS_LI_IN_AIL, &lip->li_flags) &&
    1121    11511005 :             ((lip->li_lsn == qip->qli_flush_lsn) ||
    1122           0 :              test_bit(XFS_LI_FAILED, &lip->li_flags))) {
    1123             : 
    1124    11501089 :                 spin_lock(&ailp->ail_lock);
    1125    11501089 :                 xfs_clear_li_failed(lip);
    1126    11501089 :                 if (lip->li_lsn == qip->qli_flush_lsn) {
    1127             :                         /* xfs_ail_update_finish() drops the AIL lock */
    1128    11501089 :                         tail_lsn = xfs_ail_delete_one(ailp, lip);
    1129    11501089 :                         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    11533268 :         xfs_dqfunlock(dqp);
    1139    11533268 : }
    1140             : 
    1141             : void
    1142    10263687 : xfs_buf_dquot_iodone(
    1143             :         struct xfs_buf          *bp)
    1144             : {
    1145    10263687 :         struct xfs_log_item     *lip, *n;
    1146             : 
    1147    21796955 :         list_for_each_entry_safe(lip, n, &bp->b_li_list, li_bio_list) {
    1148    11533268 :                 list_del_init(&lip->li_bio_list);
    1149    11533268 :                 xfs_qm_dqflush_done(lip);
    1150             :         }
    1151    10263687 : }
    1152             : 
    1153             : void
    1154         108 : xfs_buf_dquot_io_fail(
    1155             :         struct xfs_buf          *bp)
    1156             : {
    1157         108 :         struct xfs_log_item     *lip;
    1158             : 
    1159         108 :         spin_lock(&bp->b_mount->m_ail->ail_lock);
    1160         216 :         list_for_each_entry(lip, &bp->b_li_list, li_bio_list)
    1161         108 :                 xfs_set_li_failed(lip, bp);
    1162         108 :         spin_unlock(&bp->b_mount->m_ail->ail_lock);
    1163         108 : }
    1164             : 
    1165             : /* Check incore dquot for errors before we flush. */
    1166             : static xfs_failaddr_t
    1167    11533267 : xfs_qm_dqflush_check(
    1168             :         struct xfs_dquot        *dqp)
    1169             : {
    1170    11533267 :         xfs_dqtype_t            type = xfs_dquot_type(dqp);
    1171             : 
    1172    11533267 :         if (type != XFS_DQTYPE_USER &&
    1173    11533267 :             type != XFS_DQTYPE_GROUP &&
    1174             :             type != XFS_DQTYPE_PROJ)
    1175           0 :                 return __this_address;
    1176             : 
    1177    11533267 :         if (dqp->q_id == 0)
    1178             :                 return NULL;
    1179             : 
    1180    11386108 :         if (dqp->q_blk.softlimit && dqp->q_blk.count > dqp->q_blk.softlimit &&
    1181         339 :             !dqp->q_blk.timer)
    1182           0 :                 return __this_address;
    1183             : 
    1184    11386108 :         if (dqp->q_ino.softlimit && dqp->q_ino.count > dqp->q_ino.softlimit &&
    1185         406 :             !dqp->q_ino.timer)
    1186           0 :                 return __this_address;
    1187             : 
    1188    11386108 :         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    11386108 :         if (dqp->q_type & XFS_DQTYPE_BIGTIME) {
    1194    11382274 :                 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    13112524 : xfs_qm_dqflush(
    1213             :         struct xfs_dquot        *dqp,
    1214             :         struct xfs_buf          **bpp)
    1215             : {
    1216    13112524 :         struct xfs_mount        *mp = dqp->q_mount;
    1217    13112524 :         struct xfs_log_item     *lip = &dqp->q_logitem.qli_item;
    1218    13112524 :         struct xfs_buf          *bp;
    1219    13112524 :         struct xfs_dqblk        *dqblk;
    1220    13112524 :         xfs_failaddr_t          fa;
    1221    13112524 :         int                     error;
    1222             : 
    1223    13112524 :         ASSERT(XFS_DQ_IS_LOCKED(dqp));
    1224    13112524 :         ASSERT(!completion_done(&dqp->q_flush));
    1225             : 
    1226    13112524 :         trace_xfs_dqflush(dqp);
    1227             : 
    1228    13112524 :         *bpp = NULL;
    1229             : 
    1230    13112524 :         xfs_qm_dqunpin_wait(dqp);
    1231             : 
    1232             :         /*
    1233             :          * Get the buffer containing the on-disk dquot
    1234             :          */
    1235    13112524 :         error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp, dqp->q_blkno,
    1236    13112524 :                                    mp->m_quotainfo->qi_dqchunklen, XBF_TRYLOCK,
    1237             :                                    &bp, &xfs_dquot_buf_ops);
    1238    13112524 :         if (error == -EAGAIN)
    1239        2410 :                 goto out_unlock;
    1240    13110114 :         if (error)
    1241     1576846 :                 goto out_abort;
    1242             : 
    1243    11533268 :         fa = xfs_qm_dqflush_check(dqp);
    1244    11533267 :         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    11533267 :         dqblk = bp->b_addr + dqp->q_bufoffset;
    1254    11533267 :         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    11533267 :         dqp->q_flags &= ~XFS_DQFLAG_DIRTY;
    1260             : 
    1261    11533267 :         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    11533267 :         if (xfs_has_crc(mp)) {
    1274    11533185 :                 dqblk->dd_lsn = cpu_to_be64(dqp->q_logitem.qli_item.li_lsn);
    1275    11533185 :                 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    11533268 :         bp->b_flags |= _XBF_DQUOTS;
    1284    11533268 :         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    11533268 :         if (xfs_buf_ispinned(bp)) {
    1291       22481 :                 trace_xfs_dqflush_force(dqp);
    1292       22481 :                 xfs_log_force(mp, 0);
    1293             :         }
    1294             : 
    1295    11533268 :         trace_xfs_dqflush_done(dqp);
    1296    11533268 :         *bpp = bp;
    1297    11533268 :         return 0;
    1298             : 
    1299     1576846 : out_abort:
    1300     1576846 :         dqp->q_flags &= ~XFS_DQFLAG_DIRTY;
    1301     1576846 :         xfs_trans_ail_delete(lip, 0);
    1302     1576846 :         xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
    1303     1579256 : out_unlock:
    1304     1579256 :         xfs_dqfunlock(dqp);
    1305     1579256 :         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    14711920 : xfs_dqlock2(
    1316             :         struct xfs_dquot        *d1,
    1317             :         struct xfs_dquot        *d2)
    1318             : {
    1319    14711920 :         if (d1 && d2) {
    1320    14711920 :                 ASSERT(d1 != d2);
    1321    14711920 :                 if (d1->q_id > d2->q_id) {
    1322    13532105 :                         mutex_lock(&d2->q_qlock);
    1323    13574248 :                         mutex_lock_nested(&d1->q_qlock, XFS_QLOCK_NESTED);
    1324             :                 } else {
    1325     1179815 :                         mutex_lock(&d1->q_qlock);
    1326     1179821 :                         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    14754081 : }
    1334             : 
    1335             : int __init
    1336          50 : xfs_qm_init(void)
    1337             : {
    1338          50 :         xfs_dquot_cache = kmem_cache_create("xfs_dquot",
    1339             :                                           sizeof(struct xfs_dquot),
    1340             :                                           0, 0, NULL);
    1341          50 :         if (!xfs_dquot_cache)
    1342           0 :                 goto out;
    1343             : 
    1344          50 :         xfs_dqtrx_cache = kmem_cache_create("xfs_dqtrx",
    1345             :                                              sizeof(struct xfs_dquot_acct),
    1346             :                                              0, 0, NULL);
    1347          50 :         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          49 : xfs_qm_exit(void)
    1360             : {
    1361          49 :         kmem_cache_destroy(xfs_dqtrx_cache);
    1362          49 :         kmem_cache_destroy(xfs_dquot_cache);
    1363          49 : }
    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      349155 : 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      349155 :         struct xfs_dquot        *dq;
    1378      349155 :         xfs_dqid_t              id = 0;
    1379      349155 :         int                     error;
    1380             : 
    1381      349155 :         do {
    1382      349155 :                 error = xfs_qm_dqget_next(mp, id, type, &dq);
    1383      349155 :                 if (error == -ENOENT)
    1384             :                         return 0;
    1385      349155 :                 if (error)
    1386           0 :                         return error;
    1387             : 
    1388      349155 :                 error = iter_fn(dq, type, priv);
    1389      349155 :                 id = dq->q_id;
    1390      349155 :                 xfs_qm_dqput(dq);
    1391      349155 :         } while (error == 0 && id != 0);
    1392             : 
    1393             :         return error;
    1394             : }

Generated by: LCOV version 1.14