LCOV - code coverage report
Current view: top level - fs/xfs - xfs_dquot.c (source / functions) Hit Total Coverage
Test: fstests of 6.5.0-rc4-xfsx @ Mon Jul 31 20:08:34 PDT 2023 Lines: 585 631 92.7 %
Date: 2023-07-31 20:08:34 Functions: 38 38 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             : #include "xfs_health.h"
      28             : 
      29             : /*
      30             :  * Lock order:
      31             :  *
      32             :  * ip->i_lock
      33             :  *   qi->qi_tree_lock
      34             :  *     dquot->q_qlock (xfs_dqlock() and friends)
      35             :  *       dquot->q_flush (xfs_dqflock() and friends)
      36             :  *       qi->qi_lru_lock
      37             :  *
      38             :  * If two dquots need to be locked the order is user before group/project,
      39             :  * otherwise by the lowest id first, see xfs_dqlock2.
      40             :  */
      41             : 
      42             : struct kmem_cache               *xfs_dqtrx_cache;
      43             : static struct kmem_cache        *xfs_dquot_cache;
      44             : 
      45             : static struct lock_class_key xfs_dquot_group_class;
      46             : static struct lock_class_key xfs_dquot_project_class;
      47             : 
      48             : /* Record observations of quota corruption with the health tracking system. */
      49             : static void
      50           6 : xfs_dquot_mark_sick(
      51             :         struct xfs_dquot        *dqp)
      52             : {
      53           6 :         struct xfs_mount        *mp = dqp->q_mount;
      54             : 
      55           6 :         switch (dqp->q_type) {
      56           2 :         case XFS_DQTYPE_USER:
      57           2 :                 xfs_fs_mark_sick(mp, XFS_SICK_FS_UQUOTA);
      58           2 :                 break;
      59           2 :         case XFS_DQTYPE_GROUP:
      60           2 :                 xfs_fs_mark_sick(mp, XFS_SICK_FS_GQUOTA);
      61           2 :                 break;
      62           2 :         case XFS_DQTYPE_PROJ:
      63           2 :                 xfs_fs_mark_sick(mp, XFS_SICK_FS_PQUOTA);
      64           2 :                 break;
      65           0 :         default:
      66           0 :                 ASSERT(0);
      67           0 :                 break;
      68             :         }
      69           6 : }
      70             : 
      71             : /*
      72             :  * This is called to free all the memory associated with a dquot
      73             :  */
      74             : void
      75    32787870 : xfs_qm_dqdestroy(
      76             :         struct xfs_dquot        *dqp)
      77             : {
      78    32787870 :         ASSERT(list_empty(&dqp->q_lru));
      79             : 
      80    32787870 :         kmem_free(dqp->q_logitem.qli_item.li_lv_shadow);
      81    32787802 :         mutex_destroy(&dqp->q_qlock);
      82             : 
      83    32787831 :         XFS_STATS_DEC(dqp->q_mount, xs_qm_dquot);
      84    32787891 :         kmem_cache_free(xfs_dquot_cache, dqp);
      85    32787974 : }
      86             : 
      87             : /*
      88             :  * If default limits are in force, push them into the dquot now.
      89             :  * We overwrite the dquot limits only if they are zero and this
      90             :  * is not the root dquot.
      91             :  */
      92             : void
      93   571985930 : xfs_qm_adjust_dqlimits(
      94             :         struct xfs_dquot        *dq)
      95             : {
      96   571985930 :         struct xfs_mount        *mp = dq->q_mount;
      97   571985930 :         struct xfs_quotainfo    *q = mp->m_quotainfo;
      98   571985930 :         struct xfs_def_quota    *defq;
      99   571985930 :         int                     prealloc = 0;
     100             : 
     101   571985930 :         ASSERT(dq->q_id);
     102   571985930 :         defq = xfs_get_defquota(q, xfs_dquot_type(dq));
     103             : 
     104   571979445 :         if (!dq->q_blk.softlimit) {
     105   571002819 :                 dq->q_blk.softlimit = defq->blk.soft;
     106   571002819 :                 prealloc = 1;
     107             :         }
     108   571979445 :         if (!dq->q_blk.hardlimit) {
     109   570965964 :                 dq->q_blk.hardlimit = defq->blk.hard;
     110   570965964 :                 prealloc = 1;
     111             :         }
     112   571979445 :         if (!dq->q_ino.softlimit)
     113   571043770 :                 dq->q_ino.softlimit = defq->ino.soft;
     114   571979445 :         if (!dq->q_ino.hardlimit)
     115   571043951 :                 dq->q_ino.hardlimit = defq->ino.hard;
     116   571979445 :         if (!dq->q_rtb.softlimit)
     117   571964130 :                 dq->q_rtb.softlimit = defq->rtb.soft;
     118   571979445 :         if (!dq->q_rtb.hardlimit)
     119   571964409 :                 dq->q_rtb.hardlimit = defq->rtb.hard;
     120             : 
     121   571979445 :         if (prealloc)
     122   571002806 :                 xfs_dquot_set_prealloc_limits(dq);
     123   571967555 : }
     124             : 
     125             : /* Set the expiration time of a quota's grace period. */
     126             : time64_t
     127         412 : xfs_dquot_set_timeout(
     128             :         struct xfs_mount        *mp,
     129             :         time64_t                timeout)
     130             : {
     131        1678 :         struct xfs_quotainfo    *qi = mp->m_quotainfo;
     132             : 
     133        1678 :         return clamp_t(time64_t, timeout, qi->qi_expiry_min,
     134             :                                           qi->qi_expiry_max);
     135             : }
     136             : 
     137             : /* Set the length of the default grace period. */
     138             : time64_t
     139       30127 : xfs_dquot_set_grace_period(
     140             :         time64_t                grace)
     141             : {
     142       30127 :         return clamp_t(time64_t, grace, XFS_DQ_GRACE_MIN, XFS_DQ_GRACE_MAX);
     143             : }
     144             : 
     145             : /*
     146             :  * Determine if this quota counter is over either limit and set the quota
     147             :  * timers as appropriate.
     148             :  */
     149             : static inline void
     150  1716145399 : xfs_qm_adjust_res_timer(
     151             :         struct xfs_mount        *mp,
     152             :         struct xfs_dquot_res    *res,
     153             :         struct xfs_quota_limits *qlim)
     154             : {
     155  1716145399 :         ASSERT(res->hardlimit == 0 || res->softlimit <= res->hardlimit);
     156             : 
     157  1716145399 :         if ((res->softlimit && res->count > res->softlimit) ||
     158  1716091959 :             (res->hardlimit && res->count > res->hardlimit)) {
     159       55388 :                 if (res->timer == 0)
     160        1266 :                         res->timer = xfs_dquot_set_timeout(mp,
     161        1266 :                                         ktime_get_real_seconds() + qlim->time);
     162             :         } else {
     163  1716090011 :                 res->timer = 0;
     164             :         }
     165  1716145399 : }
     166             : 
     167             : /*
     168             :  * Check the limits and timers of a dquot and start or reset timers
     169             :  * if necessary.
     170             :  * This gets called even when quota enforcement is OFF, which makes our
     171             :  * life a little less complicated. (We just don't reject any quota
     172             :  * reservations in that case, when enforcement is off).
     173             :  * We also return 0 as the values of the timers in Q_GETQUOTA calls, when
     174             :  * enforcement's off.
     175             :  * In contrast, warnings are a little different in that they don't
     176             :  * 'automatically' get started when limits get exceeded.  They do
     177             :  * get reset to zero, however, when we find the count to be under
     178             :  * the soft limit (they are only ever set non-zero via userspace).
     179             :  */
     180             : void
     181   572079491 : xfs_qm_adjust_dqtimers(
     182             :         struct xfs_dquot        *dq)
     183             : {
     184   572079491 :         struct xfs_mount        *mp = dq->q_mount;
     185   572079491 :         struct xfs_quotainfo    *qi = mp->m_quotainfo;
     186   572079491 :         struct xfs_def_quota    *defq;
     187             : 
     188   572079491 :         ASSERT(dq->q_id);
     189   572079491 :         defq = xfs_get_defquota(qi, xfs_dquot_type(dq));
     190             : 
     191   572062627 :         xfs_qm_adjust_res_timer(dq->q_mount, &dq->q_blk, &defq->blk);
     192   572057381 :         xfs_qm_adjust_res_timer(dq->q_mount, &dq->q_ino, &defq->ino);
     193   572059083 :         xfs_qm_adjust_res_timer(dq->q_mount, &dq->q_rtb, &defq->rtb);
     194   572061568 : }
     195             : 
     196             : /*
     197             :  * initialize a buffer full of dquots and log the whole thing
     198             :  */
     199             : STATIC void
     200     6018971 : xfs_qm_init_dquot_blk(
     201             :         struct xfs_trans        *tp,
     202             :         struct xfs_mount        *mp,
     203             :         xfs_dqid_t              id,
     204             :         xfs_dqtype_t            type,
     205             :         struct xfs_buf          *bp)
     206             : {
     207     6018971 :         struct xfs_quotainfo    *q = mp->m_quotainfo;
     208     6018971 :         struct xfs_dqblk        *d;
     209     6018971 :         xfs_dqid_t              curid;
     210     6018971 :         unsigned int            qflag;
     211     6018971 :         unsigned int            blftype;
     212     6018971 :         int                     i;
     213             : 
     214     6018971 :         ASSERT(tp);
     215     6018971 :         ASSERT(xfs_buf_islocked(bp));
     216             : 
     217     6018971 :         switch (type) {
     218             :         case XFS_DQTYPE_USER:
     219             :                 qflag = XFS_UQUOTA_CHKD;
     220             :                 blftype = XFS_BLF_UDQUOT_BUF;
     221             :                 break;
     222      133746 :         case XFS_DQTYPE_PROJ:
     223      133746 :                 qflag = XFS_PQUOTA_CHKD;
     224      133746 :                 blftype = XFS_BLF_PDQUOT_BUF;
     225      133746 :                 break;
     226     2938610 :         case XFS_DQTYPE_GROUP:
     227     2938610 :                 qflag = XFS_GQUOTA_CHKD;
     228     2938610 :                 blftype = XFS_BLF_GDQUOT_BUF;
     229     2938610 :                 break;
     230           0 :         default:
     231           0 :                 ASSERT(0);
     232           0 :                 return;
     233             :         }
     234             : 
     235     6018971 :         d = bp->b_addr;
     236             : 
     237             :         /*
     238             :          * ID of the first dquot in the block - id's are zero based.
     239             :          */
     240     6018971 :         curid = id - (id % q->qi_dqperchunk);
     241     6018971 :         memset(d, 0, BBTOB(q->qi_dqchunklen));
     242   186555429 :         for (i = 0; i < q->qi_dqperchunk; i++, d++, curid++) {
     243   180536592 :                 d->dd_diskdq.d_magic = cpu_to_be16(XFS_DQUOT_MAGIC);
     244   180536592 :                 d->dd_diskdq.d_version = XFS_DQUOT_VERSION;
     245   180536592 :                 d->dd_diskdq.d_id = cpu_to_be32(curid);
     246   180536592 :                 d->dd_diskdq.d_type = type;
     247   180536592 :                 if (curid > 0 && xfs_has_bigtime(mp))
     248   180085011 :                         d->dd_diskdq.d_type |= XFS_DQTYPE_BIGTIME;
     249   180536592 :                 if (xfs_has_crc(mp)) {
     250   180530418 :                         uuid_copy(&d->dd_uuid, &mp->m_sb.sb_meta_uuid);
     251   180526539 :                         xfs_update_cksum((char *)d, sizeof(struct xfs_dqblk),
     252             :                                          XFS_DQUOT_CRC_OFF);
     253             :                 }
     254             :         }
     255             : 
     256     6018837 :         xfs_trans_dquot_buf(tp, bp, blftype);
     257             : 
     258             :         /*
     259             :          * quotacheck uses delayed writes to update all the dquots on disk in an
     260             :          * efficient manner instead of logging the individual dquot changes as
     261             :          * they are made. However if we log the buffer allocated here and crash
     262             :          * after quotacheck while the logged initialisation is still in the
     263             :          * active region of the log, log recovery can replay the dquot buffer
     264             :          * initialisation over the top of the checked dquots and corrupt quota
     265             :          * accounting.
     266             :          *
     267             :          * To avoid this problem, quotacheck cannot log the initialised buffer.
     268             :          * We must still dirty the buffer and write it back before the
     269             :          * allocation transaction clears the log. Therefore, mark the buffer as
     270             :          * ordered instead of logging it directly. This is safe for quotacheck
     271             :          * because it detects and repairs allocated but initialized dquot blocks
     272             :          * in the quota inodes.
     273             :          */
     274     6017858 :         if (!(mp->m_qflags & qflag))
     275       76127 :                 xfs_trans_ordered_buf(tp, bp);
     276             :         else
     277     5941731 :                 xfs_trans_log_buf(tp, bp, 0, BBTOB(q->qi_dqchunklen) - 1);
     278             : }
     279             : 
     280             : /*
     281             :  * Initialize the dynamic speculative preallocation thresholds. The lo/hi
     282             :  * watermarks correspond to the soft and hard limits by default. If a soft limit
     283             :  * is not specified, we use 95% of the hard limit.
     284             :  */
     285             : void
     286   603355936 : xfs_dquot_set_prealloc_limits(struct xfs_dquot *dqp)
     287             : {
     288   603355936 :         uint64_t space;
     289             : 
     290   603355936 :         dqp->q_prealloc_hi_wmark = dqp->q_blk.hardlimit;
     291   603355936 :         dqp->q_prealloc_lo_wmark = dqp->q_blk.softlimit;
     292   603355936 :         if (!dqp->q_prealloc_lo_wmark) {
     293   603291536 :                 dqp->q_prealloc_lo_wmark = dqp->q_prealloc_hi_wmark;
     294   603291536 :                 do_div(dqp->q_prealloc_lo_wmark, 100);
     295   603291536 :                 dqp->q_prealloc_lo_wmark *= 95;
     296             :         }
     297             : 
     298   603355936 :         space = dqp->q_prealloc_hi_wmark;
     299             : 
     300   603355936 :         do_div(space, 100);
     301   603355936 :         dqp->q_low_space[XFS_QLOWSP_1_PCNT] = space;
     302   603355936 :         dqp->q_low_space[XFS_QLOWSP_3_PCNT] = space * 3;
     303   603355936 :         dqp->q_low_space[XFS_QLOWSP_5_PCNT] = space * 5;
     304   603355936 : }
     305             : 
     306             : /*
     307             :  * Ensure that the given in-core dquot has a buffer on disk backing it, and
     308             :  * return the buffer locked and held. This is called when the bmapi finds a
     309             :  * hole.
     310             :  */
     311             : STATIC int
     312     6066146 : xfs_dquot_disk_alloc(
     313             :         struct xfs_dquot        *dqp,
     314             :         struct xfs_buf          **bpp)
     315             : {
     316     6066146 :         struct xfs_bmbt_irec    map;
     317     6066146 :         struct xfs_trans        *tp;
     318     6066146 :         struct xfs_mount        *mp = dqp->q_mount;
     319     6066146 :         struct xfs_buf          *bp;
     320     6066146 :         xfs_dqtype_t            qtype = xfs_dquot_type(dqp);
     321     6066146 :         struct xfs_inode        *quotip = xfs_quota_inode(mp, qtype);
     322     6066065 :         int                     nmaps = 1;
     323     6066065 :         int                     error;
     324             : 
     325     6066065 :         trace_xfs_dqalloc(dqp);
     326             : 
     327     6065959 :         error = xfs_trans_alloc(mp, &M_RES(mp)->tr_qm_dqalloc,
     328     6065959 :                         XFS_QM_DQALLOC_SPACE_RES(mp), 0, 0, &tp);
     329     6065292 :         if (error)
     330             :                 return error;
     331             : 
     332     6018407 :         xfs_ilock(quotip, XFS_ILOCK_EXCL);
     333     6020079 :         xfs_trans_ijoin(tp, quotip, 0);
     334             : 
     335     6020281 :         if (!xfs_this_quota_on(dqp->q_mount, qtype)) {
     336             :                 /*
     337             :                  * Return if this type of quotas is turned off while we didn't
     338             :                  * have an inode lock
     339             :                  */
     340           0 :                 error = -ESRCH;
     341           0 :                 goto err_cancel;
     342             :         }
     343             : 
     344     6020281 :         error = xfs_iext_count_may_overflow(quotip, XFS_DATA_FORK,
     345             :                         XFS_IEXT_ADD_NOSPLIT_CNT);
     346     6020126 :         if (error == -EFBIG)
     347          10 :                 error = xfs_iext_count_upgrade(tp, quotip,
     348             :                                 XFS_IEXT_ADD_NOSPLIT_CNT);
     349     6020126 :         if (error)
     350          10 :                 goto err_cancel;
     351             : 
     352             :         /* Create the block mapping. */
     353     6020116 :         error = xfs_bmapi_write(tp, quotip, dqp->q_fileoffset,
     354             :                         XFS_DQUOT_CLUSTER_SIZE_FSB, XFS_BMAPI_METADATA, 0, &map,
     355             :                         &nmaps);
     356     6020016 :         if (error)
     357        1471 :                 goto err_cancel;
     358             : 
     359     6018545 :         ASSERT(map.br_blockcount == XFS_DQUOT_CLUSTER_SIZE_FSB);
     360     6018545 :         ASSERT(nmaps == 1);
     361     6018545 :         ASSERT((map.br_startblock != DELAYSTARTBLOCK) &&
     362             :                (map.br_startblock != HOLESTARTBLOCK));
     363             : 
     364             :         /*
     365             :          * Keep track of the blkno to save a lookup later
     366             :          */
     367     6018545 :         dqp->q_blkno = XFS_FSB_TO_DADDR(mp, map.br_startblock);
     368             : 
     369             :         /* now we can just get the buffer (there's nothing to read yet) */
     370     6017948 :         error = xfs_trans_get_buf(tp, mp->m_ddev_targp, dqp->q_blkno,
     371     6017948 :                         mp->m_quotainfo->qi_dqchunklen, 0, &bp);
     372     6018171 :         if (error)
     373           0 :                 goto err_cancel;
     374     6018171 :         bp->b_ops = &xfs_dquot_buf_ops;
     375             : 
     376             :         /*
     377             :          * Make a chunk of dquots out of this buffer and log
     378             :          * the entire thing.
     379             :          */
     380     6018171 :         xfs_qm_init_dquot_blk(tp, mp, dqp->q_id, qtype, bp);
     381     6017797 :         xfs_buf_set_ref(bp, XFS_DQUOT_REF);
     382             : 
     383             :         /*
     384             :          * Hold the buffer and join it to the dfops so that we'll still own
     385             :          * the buffer when we return to the caller.  The buffer disposal on
     386             :          * error must be paid attention to very carefully, as it has been
     387             :          * broken since commit efa092f3d4c6 "[XFS] Fixes a bug in the quota
     388             :          * code when allocating a new dquot record" in 2005, and the later
     389             :          * conversion to xfs_defer_ops in commit 310a75a3c6c747 failed to keep
     390             :          * the buffer locked across the _defer_finish call.  We can now do
     391             :          * this correctly with xfs_defer_bjoin.
     392             :          *
     393             :          * Above, we allocated a disk block for the dquot information and used
     394             :          * get_buf to initialize the dquot. If the _defer_finish fails, the old
     395             :          * transaction is gone but the new buffer is not joined or held to any
     396             :          * transaction, so we must _buf_relse it.
     397             :          *
     398             :          * If everything succeeds, the caller of this function is returned a
     399             :          * buffer that is locked and held to the transaction.  The caller
     400             :          * is responsible for unlocking any buffer passed back, either
     401             :          * manually or by committing the transaction.  On error, the buffer is
     402             :          * released and not passed back.
     403             :          *
     404             :          * Keep the quota inode ILOCKed until after the transaction commit to
     405             :          * maintain the atomicity of bmap/rmap updates.
     406             :          */
     407     6017760 :         xfs_trans_bhold(tp, bp);
     408     6017264 :         error = xfs_trans_commit(tp);
     409     6018580 :         xfs_iunlock(quotip, XFS_ILOCK_EXCL);
     410     6018548 :         if (error) {
     411         268 :                 xfs_buf_relse(bp);
     412         268 :                 return error;
     413             :         }
     414             : 
     415     6018280 :         *bpp = bp;
     416     6018280 :         return 0;
     417             : 
     418        1481 : err_cancel:
     419        1481 :         xfs_trans_cancel(tp);
     420        1481 :         xfs_iunlock(quotip, XFS_ILOCK_EXCL);
     421        1481 :         return error;
     422             : }
     423             : 
     424             : /*
     425             :  * Read in the in-core dquot's on-disk metadata and return the buffer.
     426             :  * Returns ENOENT to signal a hole.
     427             :  */
     428             : STATIC int
     429    32787309 : xfs_dquot_disk_read(
     430             :         struct xfs_mount        *mp,
     431             :         struct xfs_dquot        *dqp,
     432             :         struct xfs_buf          **bpp)
     433             : {
     434    32787309 :         struct xfs_bmbt_irec    map;
     435    32787309 :         struct xfs_buf          *bp;
     436    32787309 :         xfs_dqtype_t            qtype = xfs_dquot_type(dqp);
     437    32787309 :         struct xfs_inode        *quotip = xfs_quota_inode(mp, qtype);
     438    32786909 :         uint                    lock_mode;
     439    32786909 :         int                     nmaps = 1;
     440    32786909 :         int                     error;
     441             : 
     442    32786909 :         lock_mode = xfs_ilock_data_map_shared(quotip);
     443    32787056 :         if (!xfs_this_quota_on(mp, qtype)) {
     444             :                 /*
     445             :                  * Return if this type of quotas is turned off while we
     446             :                  * didn't have the quota inode lock.
     447             :                  */
     448           0 :                 xfs_iunlock(quotip, lock_mode);
     449           0 :                 return -ESRCH;
     450             :         }
     451             : 
     452             :         /*
     453             :          * Find the block map; no allocations yet
     454             :          */
     455    32787056 :         error = xfs_bmapi_read(quotip, dqp->q_fileoffset,
     456             :                         XFS_DQUOT_CLUSTER_SIZE_FSB, &map, &nmaps, 0);
     457    32786730 :         xfs_iunlock(quotip, lock_mode);
     458    32786851 :         if (error)
     459             :                 return error;
     460             : 
     461    32786155 :         ASSERT(nmaps == 1);
     462    32786155 :         ASSERT(map.br_blockcount >= 1);
     463    32786155 :         ASSERT(map.br_startblock != DELAYSTARTBLOCK);
     464    32786155 :         if (map.br_startblock == HOLESTARTBLOCK)
     465             :                 return -ENOENT;
     466             : 
     467    26224294 :         trace_xfs_dqtobp_read(dqp);
     468             : 
     469             :         /*
     470             :          * store the blkno etc so that we don't have to do the
     471             :          * mapping all the time
     472             :          */
     473    26224125 :         dqp->q_blkno = XFS_FSB_TO_DADDR(mp, map.br_startblock);
     474             : 
     475    26224120 :         error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp, dqp->q_blkno,
     476    26224120 :                         mp->m_quotainfo->qi_dqchunklen, 0, &bp,
     477             :                         &xfs_dquot_buf_ops);
     478    26224303 :         if (xfs_metadata_is_sick(error))
     479           6 :                 xfs_dquot_mark_sick(dqp);
     480    26224303 :         if (error) {
     481        4998 :                 ASSERT(bp == NULL);
     482        4998 :                 return error;
     483             :         }
     484             : 
     485    26219305 :         ASSERT(xfs_buf_islocked(bp));
     486    26219305 :         xfs_buf_set_ref(bp, XFS_DQUOT_REF);
     487    26219202 :         *bpp = bp;
     488             : 
     489    26219202 :         return 0;
     490             : }
     491             : 
     492             : /* Allocate and initialize everything we need for an incore dquot. */
     493             : STATIC struct xfs_dquot *
     494    32787959 : xfs_dquot_alloc(
     495             :         struct xfs_mount        *mp,
     496             :         xfs_dqid_t              id,
     497             :         xfs_dqtype_t            type)
     498             : {
     499    32787959 :         struct xfs_dquot        *dqp;
     500             : 
     501    32787959 :         dqp = kmem_cache_zalloc(xfs_dquot_cache, GFP_KERNEL | __GFP_NOFAIL);
     502             : 
     503    32787910 :         dqp->q_type = type;
     504    32787910 :         dqp->q_id = id;
     505    32787910 :         dqp->q_mount = mp;
     506    32787910 :         INIT_LIST_HEAD(&dqp->q_lru);
     507    32787910 :         mutex_init(&dqp->q_qlock);
     508    32787775 :         init_waitqueue_head(&dqp->q_pinwait);
     509    32787782 :         dqp->q_fileoffset = (xfs_fileoff_t)id / mp->m_quotainfo->qi_dqperchunk;
     510             :         /*
     511             :          * Offset of dquot in the (fixed sized) dquot chunk.
     512             :          */
     513    32787782 :         dqp->q_bufoffset = (id % mp->m_quotainfo->qi_dqperchunk) *
     514             :                         sizeof(struct xfs_dqblk);
     515             : 
     516             :         /*
     517             :          * Because we want to use a counting completion, complete
     518             :          * the flush completion once to allow a single access to
     519             :          * the flush completion without blocking.
     520             :          */
     521    32787782 :         init_completion(&dqp->q_flush);
     522    32787623 :         complete(&dqp->q_flush);
     523             : 
     524             :         /*
     525             :          * Make sure group quotas have a different lock class than user
     526             :          * quotas.
     527             :          */
     528    32787538 :         switch (type) {
     529             :         case XFS_DQTYPE_USER:
     530             :                 /* uses the default lock class */
     531             :                 break;
     532             :         case XFS_DQTYPE_GROUP:
     533             :                 lockdep_set_class(&dqp->q_qlock, &xfs_dquot_group_class);
     534             :                 break;
     535             :         case XFS_DQTYPE_PROJ:
     536             :                 lockdep_set_class(&dqp->q_qlock, &xfs_dquot_project_class);
     537             :                 break;
     538           0 :         default:
     539           0 :                 ASSERT(0);
     540           0 :                 break;
     541             :         }
     542             : 
     543    32787538 :         xfs_qm_dquot_logitem_init(dqp);
     544             : 
     545    32787278 :         XFS_STATS_INC(mp, xs_qm_dquot);
     546    32787426 :         return dqp;
     547             : }
     548             : 
     549             : /* Check the ondisk dquot's id and type match what the incore dquot expects. */
     550             : static bool
     551    32237219 : xfs_dquot_check_type(
     552             :         struct xfs_dquot        *dqp,
     553             :         struct xfs_disk_dquot   *ddqp)
     554             : {
     555    32237219 :         uint8_t                 ddqp_type;
     556    32237219 :         uint8_t                 dqp_type;
     557             : 
     558    32237219 :         ddqp_type = ddqp->d_type & XFS_DQTYPE_REC_MASK;
     559    32237219 :         dqp_type = xfs_dquot_type(dqp);
     560             : 
     561    32237219 :         if (be32_to_cpu(ddqp->d_id) != dqp->q_id)
     562             :                 return false;
     563             : 
     564             :         /*
     565             :          * V5 filesystems always expect an exact type match.  V4 filesystems
     566             :          * expect an exact match for user dquots and for non-root group and
     567             :          * project dquots.
     568             :          */
     569    32237503 :         if (xfs_has_crc(dqp->q_mount) ||
     570         170 :             dqp_type == XFS_DQTYPE_USER || dqp->q_id != 0)
     571    32237333 :                 return ddqp_type == dqp_type;
     572             : 
     573             :         /*
     574             :          * V4 filesystems support either group or project quotas, but not both
     575             :          * at the same time.  The non-user quota file can be switched between
     576             :          * group and project quota uses depending on the mount options, which
     577             :          * means that we can encounter the other type when we try to load quota
     578             :          * defaults.  Quotacheck will soon reset the entire quota file
     579             :          * (including the root dquot) anyway, but don't log scary corruption
     580             :          * reports to dmesg.
     581             :          */
     582         170 :         return ddqp_type == XFS_DQTYPE_GROUP || ddqp_type == XFS_DQTYPE_PROJ;
     583             : }
     584             : 
     585             : /* Copy the in-core quota fields in from the on-disk buffer. */
     586             : STATIC int
     587    32237400 : xfs_dquot_from_disk(
     588             :         struct xfs_dquot        *dqp,
     589             :         struct xfs_buf          *bp)
     590             : {
     591    32237400 :         struct xfs_disk_dquot   *ddqp = bp->b_addr + dqp->q_bufoffset;
     592             : 
     593             :         /*
     594             :          * Ensure that we got the type and ID we were looking for.
     595             :          * Everything else was checked by the dquot buffer verifier.
     596             :          */
     597    32237400 :         if (!xfs_dquot_check_type(dqp, ddqp)) {
     598           0 :                 xfs_alert_tag(bp->b_mount, XFS_PTAG_VERIFIER_ERROR,
     599             :                           "Metadata corruption detected at %pS, quota %u",
     600             :                           __this_address, dqp->q_id);
     601           0 :                 xfs_alert(bp->b_mount, "Unmount and run xfs_repair");
     602           0 :                 xfs_dquot_mark_sick(dqp);
     603           0 :                 return -EFSCORRUPTED;
     604             :         }
     605             : 
     606             :         /* copy everything from disk dquot to the incore dquot */
     607    32237400 :         dqp->q_type = ddqp->d_type;
     608    32237400 :         dqp->q_blk.hardlimit = be64_to_cpu(ddqp->d_blk_hardlimit);
     609    32237400 :         dqp->q_blk.softlimit = be64_to_cpu(ddqp->d_blk_softlimit);
     610    32237400 :         dqp->q_ino.hardlimit = be64_to_cpu(ddqp->d_ino_hardlimit);
     611    32237400 :         dqp->q_ino.softlimit = be64_to_cpu(ddqp->d_ino_softlimit);
     612    32237400 :         dqp->q_rtb.hardlimit = be64_to_cpu(ddqp->d_rtb_hardlimit);
     613    32237400 :         dqp->q_rtb.softlimit = be64_to_cpu(ddqp->d_rtb_softlimit);
     614             : 
     615    32237400 :         dqp->q_blk.count = be64_to_cpu(ddqp->d_bcount);
     616    32237400 :         dqp->q_ino.count = be64_to_cpu(ddqp->d_icount);
     617    32237400 :         dqp->q_rtb.count = be64_to_cpu(ddqp->d_rtbcount);
     618             : 
     619    32237400 :         dqp->q_blk.timer = xfs_dquot_from_disk_ts(ddqp, ddqp->d_btimer);
     620    32237306 :         dqp->q_ino.timer = xfs_dquot_from_disk_ts(ddqp, ddqp->d_itimer);
     621    32237445 :         dqp->q_rtb.timer = xfs_dquot_from_disk_ts(ddqp, ddqp->d_rtbtimer);
     622             : 
     623             :         /*
     624             :          * Reservation counters are defined as reservation plus current usage
     625             :          * to avoid having to add every time.
     626             :          */
     627    32237511 :         dqp->q_blk.reserved = dqp->q_blk.count;
     628    32237511 :         dqp->q_ino.reserved = dqp->q_ino.count;
     629    32237511 :         dqp->q_rtb.reserved = dqp->q_rtb.count;
     630             : 
     631             :         /* initialize the dquot speculative prealloc thresholds */
     632    32237511 :         xfs_dquot_set_prealloc_limits(dqp);
     633    32237511 :         return 0;
     634             : }
     635             : 
     636             : /* Copy the in-core quota fields into the on-disk buffer. */
     637             : void
     638  7785643693 : xfs_dquot_to_disk(
     639             :         struct xfs_disk_dquot   *ddqp,
     640             :         struct xfs_dquot        *dqp)
     641             : {
     642  7785643693 :         ddqp->d_magic = cpu_to_be16(XFS_DQUOT_MAGIC);
     643  7785643693 :         ddqp->d_version = XFS_DQUOT_VERSION;
     644  7785643693 :         ddqp->d_type = dqp->q_type;
     645  7785643693 :         ddqp->d_id = cpu_to_be32(dqp->q_id);
     646  7785643693 :         ddqp->d_pad0 = 0;
     647  7785643693 :         ddqp->d_pad = 0;
     648             : 
     649  7785643693 :         ddqp->d_blk_hardlimit = cpu_to_be64(dqp->q_blk.hardlimit);
     650  7785643693 :         ddqp->d_blk_softlimit = cpu_to_be64(dqp->q_blk.softlimit);
     651  7785643693 :         ddqp->d_ino_hardlimit = cpu_to_be64(dqp->q_ino.hardlimit);
     652  7785643693 :         ddqp->d_ino_softlimit = cpu_to_be64(dqp->q_ino.softlimit);
     653  7785643693 :         ddqp->d_rtb_hardlimit = cpu_to_be64(dqp->q_rtb.hardlimit);
     654  7785643693 :         ddqp->d_rtb_softlimit = cpu_to_be64(dqp->q_rtb.softlimit);
     655             : 
     656  7785643693 :         ddqp->d_bcount = cpu_to_be64(dqp->q_blk.count);
     657  7785643693 :         ddqp->d_icount = cpu_to_be64(dqp->q_ino.count);
     658  7785643693 :         ddqp->d_rtbcount = cpu_to_be64(dqp->q_rtb.count);
     659             : 
     660  7785643693 :         ddqp->d_bwarns = 0;
     661  7785643693 :         ddqp->d_iwarns = 0;
     662  7785643693 :         ddqp->d_rtbwarns = 0;
     663             : 
     664  7785643693 :         ddqp->d_btimer = xfs_dquot_to_disk_ts(dqp, dqp->q_blk.timer);
     665  7785626555 :         ddqp->d_itimer = xfs_dquot_to_disk_ts(dqp, dqp->q_ino.timer);
     666  7785658769 :         ddqp->d_rtbtimer = xfs_dquot_to_disk_ts(dqp, dqp->q_rtb.timer);
     667  7785665176 : }
     668             : 
     669             : /*
     670             :  * Read in the ondisk dquot using dqtobp() then copy it to an incore version,
     671             :  * and release the buffer immediately.  If @can_alloc is true, fill any
     672             :  * holes in the on-disk metadata.
     673             :  */
     674             : static int
     675    32787961 : xfs_qm_dqread(
     676             :         struct xfs_mount        *mp,
     677             :         xfs_dqid_t              id,
     678             :         xfs_dqtype_t            type,
     679             :         bool                    can_alloc,
     680             :         struct xfs_dquot        **dqpp)
     681             : {
     682    32787961 :         struct xfs_dquot        *dqp;
     683    32787961 :         struct xfs_buf          *bp;
     684    32787961 :         int                     error;
     685             : 
     686    32787961 :         dqp = xfs_dquot_alloc(mp, id, type);
     687    32787500 :         trace_xfs_dqread(dqp);
     688             : 
     689             :         /* Try to read the buffer, allocating if necessary. */
     690    32787385 :         error = xfs_dquot_disk_read(mp, dqp, &bp);
     691    32786285 :         if (error == -ENOENT && can_alloc)
     692     6066433 :                 error = xfs_dquot_disk_alloc(dqp, &bp);
     693    32786805 :         if (error)
     694      549541 :                 goto err;
     695             : 
     696             :         /*
     697             :          * At this point we should have a clean locked buffer.  Copy the data
     698             :          * to the incore dquot and release the buffer since the incore dquot
     699             :          * has its own locking protocol so we needn't tie up the buffer any
     700             :          * further.
     701             :          */
     702    32237264 :         ASSERT(xfs_buf_islocked(bp));
     703    32237264 :         error = xfs_dquot_from_disk(dqp, bp);
     704    32237214 :         xfs_buf_relse(bp);
     705    32238119 :         if (error)
     706           0 :                 goto err;
     707             : 
     708    32238119 :         *dqpp = dqp;
     709    32238119 :         return error;
     710             : 
     711      549541 : err:
     712      549541 :         trace_xfs_dqread_fail(dqp);
     713      549473 :         xfs_qm_dqdestroy(dqp);
     714      549637 :         *dqpp = NULL;
     715      549637 :         return error;
     716             : }
     717             : 
     718             : /*
     719             :  * Advance to the next id in the current chunk, or if at the
     720             :  * end of the chunk, skip ahead to first id in next allocated chunk
     721             :  * using the SEEK_DATA interface.
     722             :  */
     723             : static int
     724    27232391 : xfs_dq_get_next_id(
     725             :         struct xfs_mount        *mp,
     726             :         xfs_dqtype_t            type,
     727             :         xfs_dqid_t              *id)
     728             : {
     729    27232391 :         struct xfs_inode        *quotip = xfs_quota_inode(mp, type);
     730    27232391 :         xfs_dqid_t              next_id = *id + 1; /* simple advance */
     731    27232391 :         uint                    lock_flags;
     732    27232391 :         struct xfs_bmbt_irec    got;
     733    27232391 :         struct xfs_iext_cursor  cur;
     734    27232391 :         xfs_fsblock_t           start;
     735    27232391 :         int                     error = 0;
     736             : 
     737             :         /* If we'd wrap past the max ID, stop */
     738    27232391 :         if (next_id < *id)
     739             :                 return -ENOENT;
     740             : 
     741             :         /* If new ID is within the current chunk, advancing it sufficed */
     742    27232318 :         if (next_id % mp->m_quotainfo->qi_dqperchunk) {
     743    26324320 :                 *id = next_id;
     744    26324320 :                 return 0;
     745             :         }
     746             : 
     747             :         /* Nope, next_id is now past the current chunk, so find the next one */
     748      907998 :         start = (xfs_fsblock_t)next_id / mp->m_quotainfo->qi_dqperchunk;
     749             : 
     750      907998 :         lock_flags = xfs_ilock_data_map_shared(quotip);
     751      907998 :         error = xfs_iread_extents(NULL, quotip, XFS_DATA_FORK);
     752      907998 :         if (error)
     753             :                 return error;
     754             : 
     755      907998 :         if (xfs_iext_lookup_extent(quotip, &quotip->i_df, start, &cur, &got)) {
     756             :                 /* contiguous chunk, bump startoff for the id calculation */
     757      902488 :                 if (got.br_startoff < start)
     758        1635 :                         got.br_startoff = start;
     759      902488 :                 *id = got.br_startoff * mp->m_quotainfo->qi_dqperchunk;
     760             :         } else {
     761             :                 error = -ENOENT;
     762             :         }
     763             : 
     764      907998 :         xfs_iunlock(quotip, lock_flags);
     765             : 
     766      907998 :         return error;
     767             : }
     768             : 
     769             : /*
     770             :  * Look up the dquot in the in-core cache.  If found, the dquot is returned
     771             :  * locked and ready to go.
     772             :  */
     773             : static struct xfs_dquot *
     774   244396457 : xfs_qm_dqget_cache_lookup(
     775             :         struct xfs_mount        *mp,
     776             :         struct xfs_quotainfo    *qi,
     777             :         struct radix_tree_root  *tree,
     778             :         xfs_dqid_t              id)
     779             : {
     780   244396490 :         struct xfs_dquot        *dqp;
     781             : 
     782   244396490 : restart:
     783   244396490 :         mutex_lock(&qi->qi_tree_lock);
     784   244525048 :         dqp = radix_tree_lookup(tree, id);
     785   244525048 :         if (!dqp) {
     786    32451052 :                 mutex_unlock(&qi->qi_tree_lock);
     787    32451052 :                 XFS_STATS_INC(mp, xs_qm_dqcachemisses);
     788    32451049 :                 return NULL;
     789             :         }
     790             : 
     791   212073996 :         xfs_dqlock(dqp);
     792   212073996 :         if (dqp->q_flags & XFS_DQFLAG_FREEING) {
     793          33 :                 xfs_dqunlock(dqp);
     794          33 :                 mutex_unlock(&qi->qi_tree_lock);
     795          33 :                 trace_xfs_dqget_freeing(dqp);
     796          33 :                 delay(1);
     797          33 :                 goto restart;
     798             :         }
     799             : 
     800   212073963 :         dqp->q_nrefs++;
     801   212073963 :         mutex_unlock(&qi->qi_tree_lock);
     802             : 
     803   212073943 :         trace_xfs_dqget_hit(dqp);
     804   212073915 :         XFS_STATS_INC(mp, xs_qm_dqcachehits);
     805   212073889 :         return dqp;
     806             : }
     807             : 
     808             : /*
     809             :  * Try to insert a new dquot into the in-core cache.  If an error occurs the
     810             :  * caller should throw away the dquot and start over.  Otherwise, the dquot
     811             :  * is returned locked (and held by the cache) as if there had been a cache
     812             :  * hit.
     813             :  */
     814             : static int
     815    31979280 : xfs_qm_dqget_cache_insert(
     816             :         struct xfs_mount        *mp,
     817             :         struct xfs_quotainfo    *qi,
     818             :         struct radix_tree_root  *tree,
     819             :         xfs_dqid_t              id,
     820             :         struct xfs_dquot        *dqp)
     821             : {
     822    31979280 :         int                     error;
     823             : 
     824    31979280 :         mutex_lock(&qi->qi_tree_lock);
     825    31980072 :         error = radix_tree_insert(tree, id, dqp);
     826    31980072 :         if (unlikely(error)) {
     827             :                 /* Duplicate found!  Caller must try again. */
     828         615 :                 mutex_unlock(&qi->qi_tree_lock);
     829         615 :                 trace_xfs_dqget_dup(dqp);
     830         615 :                 return error;
     831             :         }
     832             : 
     833             :         /* Return a locked dquot to the caller, with a reference taken. */
     834    31979457 :         xfs_dqlock(dqp);
     835    31979457 :         dqp->q_nrefs = 1;
     836             : 
     837    31979457 :         qi->qi_dquots++;
     838    31979457 :         mutex_unlock(&qi->qi_tree_lock);
     839             : 
     840    31979457 :         return 0;
     841             : }
     842             : 
     843             : /* Check our input parameters. */
     844             : static int
     845   244744814 : xfs_qm_dqget_checks(
     846             :         struct xfs_mount        *mp,
     847             :         xfs_dqtype_t            type)
     848             : {
     849   244744814 :         switch (type) {
     850   109302272 :         case XFS_DQTYPE_USER:
     851   109302272 :                 if (!XFS_IS_UQUOTA_ON(mp))
     852        1798 :                         return -ESRCH;
     853             :                 return 0;
     854   108745734 :         case XFS_DQTYPE_GROUP:
     855   108745734 :                 if (!XFS_IS_GQUOTA_ON(mp))
     856        5117 :                         return -ESRCH;
     857             :                 return 0;
     858    26696808 :         case XFS_DQTYPE_PROJ:
     859    26696808 :                 if (!XFS_IS_PQUOTA_ON(mp))
     860        1905 :                         return -ESRCH;
     861             :                 return 0;
     862             :         default:
     863             :                 WARN_ON_ONCE(0);
     864             :                 return -EINVAL;
     865             :         }
     866             : }
     867             : 
     868             : /*
     869             :  * Given the file system, id, and type (UDQUOT/GDQUOT/PDQUOT), return a
     870             :  * locked dquot, doing an allocation (if requested) as needed.
     871             :  */
     872             : int
     873   185523614 : xfs_qm_dqget(
     874             :         struct xfs_mount        *mp,
     875             :         xfs_dqid_t              id,
     876             :         xfs_dqtype_t            type,
     877             :         bool                    can_alloc,
     878             :         struct xfs_dquot        **O_dqpp)
     879             : {
     880   185523614 :         struct xfs_quotainfo    *qi = mp->m_quotainfo;
     881   185523614 :         struct radix_tree_root  *tree = xfs_dquot_tree(qi, type);
     882   185467952 :         struct xfs_dquot        *dqp;
     883   185467952 :         int                     error;
     884             : 
     885   185467952 :         error = xfs_qm_dqget_checks(mp, type);
     886   185467952 :         if (error)
     887             :                 return error;
     888             : 
     889   185463321 : restart:
     890   185463652 :         dqp = xfs_qm_dqget_cache_lookup(mp, qi, tree, id);
     891   185600898 :         if (dqp) {
     892   154290717 :                 *O_dqpp = dqp;
     893   154290717 :                 return 0;
     894             :         }
     895             : 
     896    31310181 :         error = xfs_qm_dqread(mp, id, type, can_alloc, &dqp);
     897    31309736 :         if (error)
     898      467373 :                 return error;
     899             : 
     900    30842363 :         error = xfs_qm_dqget_cache_insert(mp, qi, tree, id, dqp);
     901    30842717 :         if (error) {
     902             :                 /*
     903             :                  * Duplicate found. Just throw away the new dquot and start
     904             :                  * over.
     905             :                  */
     906         331 :                 xfs_qm_dqdestroy(dqp);
     907         331 :                 XFS_STATS_INC(mp, xs_qm_dquot_dups);
     908         331 :                 goto restart;
     909             :         }
     910             : 
     911    30842386 :         trace_xfs_dqget_miss(dqp);
     912    30842369 :         *O_dqpp = dqp;
     913    30842369 :         return 0;
     914             : }
     915             : 
     916             : /*
     917             :  * Given a dquot id and type, read and initialize a dquot from the on-disk
     918             :  * metadata.  This function is only for use during quota initialization so
     919             :  * it ignores the dquot cache assuming that the dquot shrinker isn't set up.
     920             :  * The caller is responsible for _qm_dqdestroy'ing the returned dquot.
     921             :  */
     922             : int
     923      341123 : xfs_qm_dqget_uncached(
     924             :         struct xfs_mount        *mp,
     925             :         xfs_dqid_t              id,
     926             :         xfs_dqtype_t            type,
     927             :         struct xfs_dquot        **dqpp)
     928             : {
     929      341123 :         int                     error;
     930             : 
     931      341123 :         error = xfs_qm_dqget_checks(mp, type);
     932      341123 :         if (error)
     933             :                 return error;
     934             : 
     935      336934 :         return xfs_qm_dqread(mp, id, type, 0, dqpp);
     936             : }
     937             : 
     938             : /* Return the quota id for a given inode and type. */
     939             : xfs_dqid_t
     940  1206972906 : xfs_qm_id_for_quotatype(
     941             :         struct xfs_inode        *ip,
     942             :         xfs_dqtype_t            type)
     943             : {
     944  1206972906 :         switch (type) {
     945             :         case XFS_DQTYPE_USER:
     946   402327402 :                 return i_uid_read(VFS_I(ip));
     947             :         case XFS_DQTYPE_GROUP:
     948   402322631 :                 return i_gid_read(VFS_I(ip));
     949   402322873 :         case XFS_DQTYPE_PROJ:
     950   402322873 :                 return ip->i_projid;
     951             :         }
     952           0 :         ASSERT(0);
     953           0 :         return 0;
     954             : }
     955             : 
     956             : /*
     957             :  * Return the dquot for a given inode and type.  If @can_alloc is true, then
     958             :  * allocate blocks if needed.  The inode's ILOCK must be held and it must not
     959             :  * have already had an inode attached.
     960             :  */
     961             : int
     962    58922831 : xfs_qm_dqget_inode(
     963             :         struct xfs_inode        *ip,
     964             :         xfs_dqtype_t            type,
     965             :         bool                    can_alloc,
     966             :         struct xfs_dquot        **O_dqpp)
     967             : {
     968    58922831 :         struct xfs_mount        *mp = ip->i_mount;
     969    58922831 :         struct xfs_quotainfo    *qi = mp->m_quotainfo;
     970    58922831 :         struct radix_tree_root  *tree = xfs_dquot_tree(qi, type);
     971    58922402 :         struct xfs_dquot        *dqp;
     972    58922402 :         xfs_dqid_t              id;
     973    58922402 :         int                     error;
     974             : 
     975    58922402 :         error = xfs_qm_dqget_checks(mp, type);
     976    58922402 :         if (error)
     977             :                 return error;
     978             : 
     979    58921732 :         ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
     980   117843458 :         ASSERT(xfs_inode_dquot(ip, type) == NULL);
     981    58921729 :         ASSERT(!xfs_is_metadir_inode(ip));
     982             : 
     983    58921729 :         id = xfs_qm_id_for_quotatype(ip, type);
     984             : 
     985    58921115 : restart:
     986    58921115 :         dqp = xfs_qm_dqget_cache_lookup(mp, qi, tree, id);
     987    58923942 :         if (dqp) {
     988    57783074 :                 *O_dqpp = dqp;
     989    57783074 :                 return 0;
     990             :         }
     991             : 
     992             :         /*
     993             :          * Dquot cache miss. We don't want to keep the inode lock across
     994             :          * a (potential) disk read. Also we don't want to deal with the lock
     995             :          * ordering between quotainode and this inode. OTOH, dropping the inode
     996             :          * lock here means dealing with a chown that can happen before
     997             :          * we re-acquire the lock.
     998             :          */
     999     1140868 :         xfs_iunlock(ip, XFS_ILOCK_EXCL);
    1000     1140857 :         error = xfs_qm_dqread(mp, id, type, can_alloc, &dqp);
    1001     1140856 :         xfs_ilock(ip, XFS_ILOCK_EXCL);
    1002     1140815 :         if (error)
    1003        3511 :                 return error;
    1004             : 
    1005             :         /*
    1006             :          * A dquot could be attached to this inode by now, since we had
    1007             :          * dropped the ilock.
    1008             :          */
    1009     1137304 :         if (xfs_this_quota_on(mp, type)) {
    1010     1137304 :                 struct xfs_dquot        *dqp1;
    1011             : 
    1012     1137304 :                 dqp1 = xfs_inode_dquot(ip, type);
    1013     1137304 :                 if (dqp1) {
    1014           3 :                         xfs_qm_dqdestroy(dqp);
    1015           3 :                         dqp = dqp1;
    1016           3 :                         xfs_dqlock(dqp);
    1017           3 :                         goto dqret;
    1018             :                 }
    1019             :         } else {
    1020             :                 /* inode stays locked on return */
    1021           0 :                 xfs_qm_dqdestroy(dqp);
    1022           0 :                 return -ESRCH;
    1023             :         }
    1024             : 
    1025     1137301 :         error = xfs_qm_dqget_cache_insert(mp, qi, tree, id, dqp);
    1026     1137355 :         if (error) {
    1027             :                 /*
    1028             :                  * Duplicate found. Just throw away the new dquot and start
    1029             :                  * over.
    1030             :                  */
    1031         284 :                 xfs_qm_dqdestroy(dqp);
    1032         284 :                 XFS_STATS_INC(mp, xs_qm_dquot_dups);
    1033         284 :                 goto restart;
    1034             :         }
    1035             : 
    1036     1137071 : dqret:
    1037     1137074 :         ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
    1038     1137074 :         trace_xfs_dqget_miss(dqp);
    1039     1137074 :         *O_dqpp = dqp;
    1040     1137074 :         return 0;
    1041             : }
    1042             : 
    1043             : /*
    1044             :  * Starting at @id and progressing upwards, look for an initialized incore
    1045             :  * dquot, lock it, and return it.
    1046             :  */
    1047             : int
    1048     1013991 : xfs_qm_dqget_next(
    1049             :         struct xfs_mount        *mp,
    1050             :         xfs_dqid_t              id,
    1051             :         xfs_dqtype_t            type,
    1052             :         struct xfs_dquot        **dqpp)
    1053             : {
    1054     1013991 :         struct xfs_dquot        *dqp;
    1055     1013991 :         int                     error = 0;
    1056             : 
    1057     1013991 :         *dqpp = NULL;
    1058    28246382 :         for (; !error; error = xfs_dq_get_next_id(mp, type, &id)) {
    1059    28240799 :                 error = xfs_qm_dqget(mp, id, type, false, &dqp);
    1060    28240789 :                 if (error == -ENOENT)
    1061      371793 :                         continue;
    1062    27868996 :                 else if (error != 0)
    1063             :                         break;
    1064             : 
    1065    27868842 :                 if (!XFS_IS_DQUOT_UNINITIALIZED(dqp)) {
    1066     1008244 :                         *dqpp = dqp;
    1067     1008244 :                         return 0;
    1068             :                 }
    1069             : 
    1070    26860598 :                 xfs_qm_dqput(dqp);
    1071             :         }
    1072             : 
    1073             :         return error;
    1074             : }
    1075             : 
    1076             : /*
    1077             :  * Release a reference to the dquot (decrement ref-count) and unlock it.
    1078             :  *
    1079             :  * If there is a group quota attached to this dquot, carefully release that
    1080             :  * too without tripping over deadlocks'n'stuff.
    1081             :  */
    1082             : void
    1083  1012987604 : xfs_qm_dqput(
    1084             :         struct xfs_dquot        *dqp)
    1085             : {
    1086  1012987604 :         ASSERT(dqp->q_nrefs > 0);
    1087  1012987604 :         ASSERT(XFS_DQ_IS_LOCKED(dqp));
    1088             : 
    1089  1013074771 :         trace_xfs_dqput(dqp);
    1090             : 
    1091  1013047830 :         if (--dqp->q_nrefs == 0) {
    1092    49512356 :                 struct xfs_quotainfo    *qi = dqp->q_mount->m_quotainfo;
    1093    49512356 :                 trace_xfs_dqput_free(dqp);
    1094             : 
    1095    49512331 :                 if (list_lru_add(&qi->qi_lru, &dqp->q_lru))
    1096    32020727 :                         XFS_STATS_INC(dqp->q_mount, xs_qm_dquot_unused);
    1097             :         }
    1098  1013048123 :         xfs_dqunlock(dqp);
    1099  1013611396 : }
    1100             : 
    1101             : /*
    1102             :  * Release a dquot. Flush it if dirty, then dqput() it.
    1103             :  * dquot must not be locked.
    1104             :  */
    1105             : void
    1106   984890949 : xfs_qm_dqrele(
    1107             :         struct xfs_dquot        *dqp)
    1108             : {
    1109   984890949 :         if (!dqp)
    1110             :                 return;
    1111             : 
    1112   869490422 :         trace_xfs_dqrele(dqp);
    1113             : 
    1114   869105668 :         xfs_dqlock(dqp);
    1115             :         /*
    1116             :          * We don't care to flush it if the dquot is dirty here.
    1117             :          * That will create stutters that we want to avoid.
    1118             :          * Instead we do a delayed write when we try to reclaim
    1119             :          * a dirty dquot. Also xfs_sync will take part of the burden...
    1120             :          */
    1121   869403947 :         xfs_qm_dqput(dqp);
    1122             : }
    1123             : 
    1124             : /*
    1125             :  * This is the dquot flushing I/O completion routine.  It is called
    1126             :  * from interrupt level when the buffer containing the dquot is
    1127             :  * flushed to disk.  It is responsible for removing the dquot logitem
    1128             :  * from the AIL if it has not been re-logged, and unlocking the dquot's
    1129             :  * flush lock. This behavior is very similar to that of inodes..
    1130             :  */
    1131             : static void
    1132    34113447 : xfs_qm_dqflush_done(
    1133             :         struct xfs_log_item     *lip)
    1134             : {
    1135    34113447 :         struct xfs_dq_logitem   *qip = (struct xfs_dq_logitem *)lip;
    1136    34113447 :         struct xfs_dquot        *dqp = qip->qli_dquot;
    1137    34113447 :         struct xfs_ail          *ailp = lip->li_ailp;
    1138    34113447 :         xfs_lsn_t               tail_lsn;
    1139             : 
    1140             :         /*
    1141             :          * We only want to pull the item from the AIL if its
    1142             :          * location in the log has not changed since we started the flush.
    1143             :          * Thus, we only bother if the dquot's lsn has
    1144             :          * not changed. First we check the lsn outside the lock
    1145             :          * since it's cheaper, and then we recheck while
    1146             :          * holding the lock before removing the dquot from the AIL.
    1147             :          */
    1148    68239001 :         if (test_bit(XFS_LI_IN_AIL, &lip->li_flags) &&
    1149    34061285 :             ((lip->li_lsn == qip->qli_flush_lsn) ||
    1150           0 :              test_bit(XFS_LI_FAILED, &lip->li_flags))) {
    1151             : 
    1152    34037071 :                 spin_lock(&ailp->ail_lock);
    1153    34037071 :                 xfs_clear_li_failed(lip);
    1154    34037071 :                 if (lip->li_lsn == qip->qli_flush_lsn) {
    1155             :                         /* xfs_ail_update_finish() drops the AIL lock */
    1156    34037071 :                         tail_lsn = xfs_ail_delete_one(ailp, lip);
    1157    34037071 :                         xfs_ail_update_finish(ailp, tail_lsn);
    1158             :                 } else {
    1159           0 :                         spin_unlock(&ailp->ail_lock);
    1160             :                 }
    1161             :         }
    1162             : 
    1163             :         /*
    1164             :          * Release the dq's flush lock since we're done with it.
    1165             :          */
    1166    34113447 :         xfs_dqfunlock(dqp);
    1167    34113447 : }
    1168             : 
    1169             : void
    1170    29861491 : xfs_buf_dquot_iodone(
    1171             :         struct xfs_buf          *bp)
    1172             : {
    1173    29861491 :         struct xfs_log_item     *lip, *n;
    1174             : 
    1175    63974938 :         list_for_each_entry_safe(lip, n, &bp->b_li_list, li_bio_list) {
    1176    34113447 :                 list_del_init(&lip->li_bio_list);
    1177    34113447 :                 xfs_qm_dqflush_done(lip);
    1178             :         }
    1179    29861491 : }
    1180             : 
    1181             : void
    1182         131 : xfs_buf_dquot_io_fail(
    1183             :         struct xfs_buf          *bp)
    1184             : {
    1185         131 :         struct xfs_log_item     *lip;
    1186             : 
    1187         131 :         spin_lock(&bp->b_mount->m_ail->ail_lock);
    1188         262 :         list_for_each_entry(lip, &bp->b_li_list, li_bio_list)
    1189         131 :                 xfs_set_li_failed(lip, bp);
    1190         131 :         spin_unlock(&bp->b_mount->m_ail->ail_lock);
    1191         131 : }
    1192             : 
    1193             : /* Check incore dquot for errors before we flush. */
    1194             : static xfs_failaddr_t
    1195    34113447 : xfs_qm_dqflush_check(
    1196             :         struct xfs_dquot        *dqp)
    1197             : {
    1198    34113447 :         xfs_dqtype_t            type = xfs_dquot_type(dqp);
    1199             : 
    1200    34113447 :         if (type != XFS_DQTYPE_USER &&
    1201    34113447 :             type != XFS_DQTYPE_GROUP &&
    1202             :             type != XFS_DQTYPE_PROJ)
    1203           0 :                 return __this_address;
    1204             : 
    1205    34113447 :         if (dqp->q_id == 0)
    1206             :                 return NULL;
    1207             : 
    1208    33752321 :         if (dqp->q_blk.softlimit && dqp->q_blk.count > dqp->q_blk.softlimit &&
    1209         741 :             !dqp->q_blk.timer)
    1210           0 :                 return __this_address;
    1211             : 
    1212    33752321 :         if (dqp->q_ino.softlimit && dqp->q_ino.count > dqp->q_ino.softlimit &&
    1213         900 :             !dqp->q_ino.timer)
    1214           0 :                 return __this_address;
    1215             : 
    1216    33752321 :         if (dqp->q_rtb.softlimit && dqp->q_rtb.count > dqp->q_rtb.softlimit &&
    1217           0 :             !dqp->q_rtb.timer)
    1218           0 :                 return __this_address;
    1219             : 
    1220             :         /* bigtime flag should never be set on root dquots */
    1221    33752321 :         if (dqp->q_type & XFS_DQTYPE_BIGTIME) {
    1222    33733589 :                 if (!xfs_has_bigtime(dqp->q_mount))
    1223           0 :                         return __this_address;
    1224             :                 if (dqp->q_id == 0)
    1225           0 :                         return __this_address;
    1226             :         }
    1227             : 
    1228             :         return NULL;
    1229             : }
    1230             : 
    1231             : /*
    1232             :  * Write a modified dquot to disk.
    1233             :  * The dquot must be locked and the flush lock too taken by caller.
    1234             :  * The flush lock will not be unlocked until the dquot reaches the disk,
    1235             :  * but the dquot is free to be unlocked and modified by the caller
    1236             :  * in the interim. Dquot is still locked on return. This behavior is
    1237             :  * identical to that of inodes.
    1238             :  */
    1239             : int
    1240    35710223 : xfs_qm_dqflush(
    1241             :         struct xfs_dquot        *dqp,
    1242             :         struct xfs_buf          **bpp)
    1243             : {
    1244    35710223 :         struct xfs_mount        *mp = dqp->q_mount;
    1245    35710223 :         struct xfs_log_item     *lip = &dqp->q_logitem.qli_item;
    1246    35710223 :         struct xfs_buf          *bp;
    1247    35710223 :         struct xfs_dqblk        *dqblk;
    1248    35710223 :         xfs_failaddr_t          fa;
    1249    35710223 :         int                     error;
    1250             : 
    1251    35710223 :         ASSERT(XFS_DQ_IS_LOCKED(dqp));
    1252    35710223 :         ASSERT(!completion_done(&dqp->q_flush));
    1253             : 
    1254    35710223 :         trace_xfs_dqflush(dqp);
    1255             : 
    1256    35710223 :         *bpp = NULL;
    1257             : 
    1258    35710223 :         xfs_qm_dqunpin_wait(dqp);
    1259             : 
    1260             :         /*
    1261             :          * Get the buffer containing the on-disk dquot
    1262             :          */
    1263    35710223 :         error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp, dqp->q_blkno,
    1264    35710223 :                                    mp->m_quotainfo->qi_dqchunklen, XBF_TRYLOCK,
    1265             :                                    &bp, &xfs_dquot_buf_ops);
    1266    35710223 :         if (error == -EAGAIN)
    1267        6593 :                 goto out_unlock;
    1268    35703630 :         if (xfs_metadata_is_sick(error))
    1269           0 :                 xfs_dquot_mark_sick(dqp);
    1270    35703630 :         if (error)
    1271     1590183 :                 goto out_abort;
    1272             : 
    1273    34113447 :         fa = xfs_qm_dqflush_check(dqp);
    1274    34113447 :         if (fa) {
    1275           0 :                 xfs_alert(mp, "corrupt dquot ID 0x%x in memory at %pS",
    1276             :                                 dqp->q_id, fa);
    1277           0 :                 xfs_buf_relse(bp);
    1278           0 :                 xfs_dquot_mark_sick(dqp);
    1279           0 :                 error = -EFSCORRUPTED;
    1280           0 :                 goto out_abort;
    1281             :         }
    1282             : 
    1283             :         /* Flush the incore dquot to the ondisk buffer. */
    1284    34113447 :         dqblk = bp->b_addr + dqp->q_bufoffset;
    1285    34113447 :         xfs_dquot_to_disk(&dqblk->dd_diskdq, dqp);
    1286             : 
    1287             :         /*
    1288             :          * Clear the dirty field and remember the flush lsn for later use.
    1289             :          */
    1290    34113446 :         dqp->q_flags &= ~XFS_DQFLAG_DIRTY;
    1291             : 
    1292    34113446 :         xfs_trans_ail_copy_lsn(mp->m_ail, &dqp->q_logitem.qli_flush_lsn,
    1293             :                                         &dqp->q_logitem.qli_item.li_lsn);
    1294             : 
    1295             :         /*
    1296             :          * copy the lsn into the on-disk dquot now while we have the in memory
    1297             :          * dquot here. This can't be done later in the write verifier as we
    1298             :          * can't get access to the log item at that point in time.
    1299             :          *
    1300             :          * We also calculate the CRC here so that the on-disk dquot in the
    1301             :          * buffer always has a valid CRC. This ensures there is no possibility
    1302             :          * of a dquot without an up-to-date CRC getting to disk.
    1303             :          */
    1304    34113446 :         if (xfs_has_crc(mp)) {
    1305    34113289 :                 dqblk->dd_lsn = cpu_to_be64(dqp->q_logitem.qli_item.li_lsn);
    1306    34113289 :                 xfs_update_cksum((char *)dqblk, sizeof(struct xfs_dqblk),
    1307             :                                  XFS_DQUOT_CRC_OFF);
    1308             :         }
    1309             : 
    1310             :         /*
    1311             :          * Attach the dquot to the buffer so that we can remove this dquot from
    1312             :          * the AIL and release the flush lock once the dquot is synced to disk.
    1313             :          */
    1314    34113447 :         bp->b_flags |= _XBF_DQUOTS;
    1315    34113447 :         list_add_tail(&dqp->q_logitem.qli_item.li_bio_list, &bp->b_li_list);
    1316             : 
    1317             :         /*
    1318             :          * If the buffer is pinned then push on the log so we won't
    1319             :          * get stuck waiting in the write for too long.
    1320             :          */
    1321    34113447 :         if (xfs_buf_ispinned(bp)) {
    1322       50463 :                 trace_xfs_dqflush_force(dqp);
    1323       50463 :                 xfs_log_force(mp, 0);
    1324             :         }
    1325             : 
    1326    34113447 :         trace_xfs_dqflush_done(dqp);
    1327    34113446 :         *bpp = bp;
    1328    34113446 :         return 0;
    1329             : 
    1330     1590183 : out_abort:
    1331     1590183 :         dqp->q_flags &= ~XFS_DQFLAG_DIRTY;
    1332     1590183 :         xfs_trans_ail_delete(lip, 0);
    1333     1590183 :         xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
    1334     1596776 : out_unlock:
    1335     1596776 :         xfs_dqfunlock(dqp);
    1336     1596776 :         return error;
    1337             : }
    1338             : 
    1339             : /*
    1340             :  * Lock two xfs_dquot structures.
    1341             :  *
    1342             :  * To avoid deadlocks we always lock the quota structure with
    1343             :  * the lowerd id first.
    1344             :  */
    1345             : void
    1346    35952091 : xfs_dqlock2(
    1347             :         struct xfs_dquot        *d1,
    1348             :         struct xfs_dquot        *d2)
    1349             : {
    1350    35952091 :         if (d1 && d2) {
    1351    35952091 :                 ASSERT(d1 != d2);
    1352    35952091 :                 if (d1->q_id > d2->q_id) {
    1353    29828139 :                         mutex_lock(&d2->q_qlock);
    1354    29912488 :                         mutex_lock_nested(&d1->q_qlock, XFS_QLOCK_NESTED);
    1355             :                 } else {
    1356     6123952 :                         mutex_lock(&d1->q_qlock);
    1357     6124035 :                         mutex_lock_nested(&d2->q_qlock, XFS_QLOCK_NESTED);
    1358             :                 }
    1359           0 :         } else if (d1) {
    1360           0 :                 mutex_lock(&d1->q_qlock);
    1361           0 :         } else if (d2) {
    1362           0 :                 mutex_lock(&d2->q_qlock);
    1363             :         }
    1364    36036564 : }
    1365             : 
    1366             : static int
    1367       18705 : xfs_dqtrx_cmp(
    1368             :         const void              *a,
    1369             :         const void              *b)
    1370             : {
    1371       18705 :         const struct xfs_dqtrx  *qa = a;
    1372       18705 :         const struct xfs_dqtrx  *qb = b;
    1373             : 
    1374       18705 :         if (qa->qt_dquot->q_id > qb->qt_dquot->q_id)
    1375             :                 return 1;
    1376       11403 :         if (qa->qt_dquot->q_id < qb->qt_dquot->q_id)
    1377       11403 :                 return -1;
    1378             :         return 0;
    1379             : }
    1380             : 
    1381             : void
    1382        6235 : xfs_dqlockn(
    1383             :         struct xfs_dqtrx        *q)
    1384             : {
    1385        6235 :         unsigned int            i;
    1386             : 
    1387             :         /* Sort in order of dquot id, do not allow duplicates */
    1388       24940 :         for (i = 0; i < XFS_QM_TRANS_MAXDQS && q[i].qt_dquot != NULL; i++) {
    1389             :                 unsigned int    j;
    1390             : 
    1391       37410 :                 for (j = 0; j < i; j++)
    1392       18705 :                         ASSERT(q[i].qt_dquot != q[j].qt_dquot);
    1393             :         }
    1394        6235 :         if (i == 0)
    1395             :                 return;
    1396             : 
    1397        6235 :         sort(q, i, sizeof(struct xfs_dqtrx), xfs_dqtrx_cmp, NULL);
    1398             : 
    1399        6235 :         mutex_lock(&q[0].qt_dquot->q_qlock);
    1400       24940 :         for (i = 1; i < XFS_QM_TRANS_MAXDQS && q[i].qt_dquot != NULL; i++)
    1401       12470 :                 mutex_lock_nested(&q[i].qt_dquot->q_qlock, XFS_QLOCK_NESTED);
    1402             : }
    1403             : 
    1404             : int __init
    1405          59 : xfs_qm_init(void)
    1406             : {
    1407          59 :         xfs_dquot_cache = kmem_cache_create("xfs_dquot",
    1408             :                                           sizeof(struct xfs_dquot),
    1409             :                                           0, 0, NULL);
    1410          59 :         if (!xfs_dquot_cache)
    1411           0 :                 goto out;
    1412             : 
    1413          59 :         xfs_dqtrx_cache = kmem_cache_create("xfs_dqtrx",
    1414             :                                              sizeof(struct xfs_dquot_acct),
    1415             :                                              0, 0, NULL);
    1416          59 :         if (!xfs_dqtrx_cache)
    1417           0 :                 goto out_free_dquot_cache;
    1418             : 
    1419             :         return 0;
    1420             : 
    1421             : out_free_dquot_cache:
    1422           0 :         kmem_cache_destroy(xfs_dquot_cache);
    1423             : out:
    1424             :         return -ENOMEM;
    1425             : }
    1426             : 
    1427             : void
    1428          58 : xfs_qm_exit(void)
    1429             : {
    1430          58 :         kmem_cache_destroy(xfs_dqtrx_cache);
    1431          58 :         kmem_cache_destroy(xfs_dquot_cache);
    1432          58 : }
    1433             : 
    1434             : /*
    1435             :  * Iterate every dquot of a particular type.  The caller must ensure that the
    1436             :  * particular quota type is active.  iter_fn can return negative error codes,
    1437             :  * or -ECANCELED to indicate that it wants to stop iterating.
    1438             :  */
    1439             : int
    1440      405153 : xfs_qm_dqiterate(
    1441             :         struct xfs_mount        *mp,
    1442             :         xfs_dqtype_t            type,
    1443             :         xfs_qm_dqiterate_fn     iter_fn,
    1444             :         void                    *priv)
    1445             : {
    1446      405153 :         struct xfs_dquot        *dq;
    1447      405153 :         xfs_dqid_t              id = 0;
    1448      405153 :         int                     error;
    1449             : 
    1450      405153 :         do {
    1451      405153 :                 error = xfs_qm_dqget_next(mp, id, type, &dq);
    1452      405138 :                 if (error == -ENOENT)
    1453             :                         return 0;
    1454      405138 :                 if (error)
    1455           0 :                         return error;
    1456             : 
    1457      405138 :                 error = iter_fn(dq, type, priv);
    1458      405152 :                 id = dq->q_id;
    1459      405152 :                 xfs_qm_dqput(dq);
    1460      405153 :         } while (error == 0 && id != 0);
    1461             : 
    1462             :         return error;
    1463             : }

Generated by: LCOV version 1.14