Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * Copyright (c) 2000-2003 Silicon Graphics, Inc.
0004  * All Rights Reserved.
0005  */
0006 #include "xfs.h"
0007 #include "xfs_fs.h"
0008 #include "xfs_format.h"
0009 #include "xfs_log_format.h"
0010 #include "xfs_shared.h"
0011 #include "xfs_trans_resv.h"
0012 #include "xfs_bit.h"
0013 #include "xfs_mount.h"
0014 #include "xfs_defer.h"
0015 #include "xfs_inode.h"
0016 #include "xfs_bmap.h"
0017 #include "xfs_quota.h"
0018 #include "xfs_trans.h"
0019 #include "xfs_buf_item.h"
0020 #include "xfs_trans_space.h"
0021 #include "xfs_trans_priv.h"
0022 #include "xfs_qm.h"
0023 #include "xfs_trace.h"
0024 #include "xfs_log.h"
0025 #include "xfs_bmap_btree.h"
0026 #include "xfs_error.h"
0027 
0028 /*
0029  * Lock order:
0030  *
0031  * ip->i_lock
0032  *   qi->qi_tree_lock
0033  *     dquot->q_qlock (xfs_dqlock() and friends)
0034  *       dquot->q_flush (xfs_dqflock() and friends)
0035  *       qi->qi_lru_lock
0036  *
0037  * If two dquots need to be locked the order is user before group/project,
0038  * otherwise by the lowest id first, see xfs_dqlock2.
0039  */
0040 
0041 struct kmem_cache       *xfs_dqtrx_cache;
0042 static struct kmem_cache    *xfs_dquot_cache;
0043 
0044 static struct lock_class_key xfs_dquot_group_class;
0045 static struct lock_class_key xfs_dquot_project_class;
0046 
0047 /*
0048  * This is called to free all the memory associated with a dquot
0049  */
0050 void
0051 xfs_qm_dqdestroy(
0052     struct xfs_dquot    *dqp)
0053 {
0054     ASSERT(list_empty(&dqp->q_lru));
0055 
0056     kmem_free(dqp->q_logitem.qli_item.li_lv_shadow);
0057     mutex_destroy(&dqp->q_qlock);
0058 
0059     XFS_STATS_DEC(dqp->q_mount, xs_qm_dquot);
0060     kmem_cache_free(xfs_dquot_cache, dqp);
0061 }
0062 
0063 /*
0064  * If default limits are in force, push them into the dquot now.
0065  * We overwrite the dquot limits only if they are zero and this
0066  * is not the root dquot.
0067  */
0068 void
0069 xfs_qm_adjust_dqlimits(
0070     struct xfs_dquot    *dq)
0071 {
0072     struct xfs_mount    *mp = dq->q_mount;
0073     struct xfs_quotainfo    *q = mp->m_quotainfo;
0074     struct xfs_def_quota    *defq;
0075     int         prealloc = 0;
0076 
0077     ASSERT(dq->q_id);
0078     defq = xfs_get_defquota(q, xfs_dquot_type(dq));
0079 
0080     if (!dq->q_blk.softlimit) {
0081         dq->q_blk.softlimit = defq->blk.soft;
0082         prealloc = 1;
0083     }
0084     if (!dq->q_blk.hardlimit) {
0085         dq->q_blk.hardlimit = defq->blk.hard;
0086         prealloc = 1;
0087     }
0088     if (!dq->q_ino.softlimit)
0089         dq->q_ino.softlimit = defq->ino.soft;
0090     if (!dq->q_ino.hardlimit)
0091         dq->q_ino.hardlimit = defq->ino.hard;
0092     if (!dq->q_rtb.softlimit)
0093         dq->q_rtb.softlimit = defq->rtb.soft;
0094     if (!dq->q_rtb.hardlimit)
0095         dq->q_rtb.hardlimit = defq->rtb.hard;
0096 
0097     if (prealloc)
0098         xfs_dquot_set_prealloc_limits(dq);
0099 }
0100 
0101 /* Set the expiration time of a quota's grace period. */
0102 time64_t
0103 xfs_dquot_set_timeout(
0104     struct xfs_mount    *mp,
0105     time64_t        timeout)
0106 {
0107     struct xfs_quotainfo    *qi = mp->m_quotainfo;
0108 
0109     return clamp_t(time64_t, timeout, qi->qi_expiry_min,
0110                       qi->qi_expiry_max);
0111 }
0112 
0113 /* Set the length of the default grace period. */
0114 time64_t
0115 xfs_dquot_set_grace_period(
0116     time64_t        grace)
0117 {
0118     return clamp_t(time64_t, grace, XFS_DQ_GRACE_MIN, XFS_DQ_GRACE_MAX);
0119 }
0120 
0121 /*
0122  * Determine if this quota counter is over either limit and set the quota
0123  * timers as appropriate.
0124  */
0125 static inline void
0126 xfs_qm_adjust_res_timer(
0127     struct xfs_mount    *mp,
0128     struct xfs_dquot_res    *res,
0129     struct xfs_quota_limits *qlim)
0130 {
0131     ASSERT(res->hardlimit == 0 || res->softlimit <= res->hardlimit);
0132 
0133     if ((res->softlimit && res->count > res->softlimit) ||
0134         (res->hardlimit && res->count > res->hardlimit)) {
0135         if (res->timer == 0)
0136             res->timer = xfs_dquot_set_timeout(mp,
0137                     ktime_get_real_seconds() + qlim->time);
0138     } else {
0139         res->timer = 0;
0140     }
0141 }
0142 
0143 /*
0144  * Check the limits and timers of a dquot and start or reset timers
0145  * if necessary.
0146  * This gets called even when quota enforcement is OFF, which makes our
0147  * life a little less complicated. (We just don't reject any quota
0148  * reservations in that case, when enforcement is off).
0149  * We also return 0 as the values of the timers in Q_GETQUOTA calls, when
0150  * enforcement's off.
0151  * In contrast, warnings are a little different in that they don't
0152  * 'automatically' get started when limits get exceeded.  They do
0153  * get reset to zero, however, when we find the count to be under
0154  * the soft limit (they are only ever set non-zero via userspace).
0155  */
0156 void
0157 xfs_qm_adjust_dqtimers(
0158     struct xfs_dquot    *dq)
0159 {
0160     struct xfs_mount    *mp = dq->q_mount;
0161     struct xfs_quotainfo    *qi = mp->m_quotainfo;
0162     struct xfs_def_quota    *defq;
0163 
0164     ASSERT(dq->q_id);
0165     defq = xfs_get_defquota(qi, xfs_dquot_type(dq));
0166 
0167     xfs_qm_adjust_res_timer(dq->q_mount, &dq->q_blk, &defq->blk);
0168     xfs_qm_adjust_res_timer(dq->q_mount, &dq->q_ino, &defq->ino);
0169     xfs_qm_adjust_res_timer(dq->q_mount, &dq->q_rtb, &defq->rtb);
0170 }
0171 
0172 /*
0173  * initialize a buffer full of dquots and log the whole thing
0174  */
0175 STATIC void
0176 xfs_qm_init_dquot_blk(
0177     struct xfs_trans    *tp,
0178     struct xfs_mount    *mp,
0179     xfs_dqid_t      id,
0180     xfs_dqtype_t        type,
0181     struct xfs_buf      *bp)
0182 {
0183     struct xfs_quotainfo    *q = mp->m_quotainfo;
0184     struct xfs_dqblk    *d;
0185     xfs_dqid_t      curid;
0186     unsigned int        qflag;
0187     unsigned int        blftype;
0188     int         i;
0189 
0190     ASSERT(tp);
0191     ASSERT(xfs_buf_islocked(bp));
0192 
0193     switch (type) {
0194     case XFS_DQTYPE_USER:
0195         qflag = XFS_UQUOTA_CHKD;
0196         blftype = XFS_BLF_UDQUOT_BUF;
0197         break;
0198     case XFS_DQTYPE_PROJ:
0199         qflag = XFS_PQUOTA_CHKD;
0200         blftype = XFS_BLF_PDQUOT_BUF;
0201         break;
0202     case XFS_DQTYPE_GROUP:
0203         qflag = XFS_GQUOTA_CHKD;
0204         blftype = XFS_BLF_GDQUOT_BUF;
0205         break;
0206     default:
0207         ASSERT(0);
0208         return;
0209     }
0210 
0211     d = bp->b_addr;
0212 
0213     /*
0214      * ID of the first dquot in the block - id's are zero based.
0215      */
0216     curid = id - (id % q->qi_dqperchunk);
0217     memset(d, 0, BBTOB(q->qi_dqchunklen));
0218     for (i = 0; i < q->qi_dqperchunk; i++, d++, curid++) {
0219         d->dd_diskdq.d_magic = cpu_to_be16(XFS_DQUOT_MAGIC);
0220         d->dd_diskdq.d_version = XFS_DQUOT_VERSION;
0221         d->dd_diskdq.d_id = cpu_to_be32(curid);
0222         d->dd_diskdq.d_type = type;
0223         if (curid > 0 && xfs_has_bigtime(mp))
0224             d->dd_diskdq.d_type |= XFS_DQTYPE_BIGTIME;
0225         if (xfs_has_crc(mp)) {
0226             uuid_copy(&d->dd_uuid, &mp->m_sb.sb_meta_uuid);
0227             xfs_update_cksum((char *)d, sizeof(struct xfs_dqblk),
0228                      XFS_DQUOT_CRC_OFF);
0229         }
0230     }
0231 
0232     xfs_trans_dquot_buf(tp, bp, blftype);
0233 
0234     /*
0235      * quotacheck uses delayed writes to update all the dquots on disk in an
0236      * efficient manner instead of logging the individual dquot changes as
0237      * they are made. However if we log the buffer allocated here and crash
0238      * after quotacheck while the logged initialisation is still in the
0239      * active region of the log, log recovery can replay the dquot buffer
0240      * initialisation over the top of the checked dquots and corrupt quota
0241      * accounting.
0242      *
0243      * To avoid this problem, quotacheck cannot log the initialised buffer.
0244      * We must still dirty the buffer and write it back before the
0245      * allocation transaction clears the log. Therefore, mark the buffer as
0246      * ordered instead of logging it directly. This is safe for quotacheck
0247      * because it detects and repairs allocated but initialized dquot blocks
0248      * in the quota inodes.
0249      */
0250     if (!(mp->m_qflags & qflag))
0251         xfs_trans_ordered_buf(tp, bp);
0252     else
0253         xfs_trans_log_buf(tp, bp, 0, BBTOB(q->qi_dqchunklen) - 1);
0254 }
0255 
0256 /*
0257  * Initialize the dynamic speculative preallocation thresholds. The lo/hi
0258  * watermarks correspond to the soft and hard limits by default. If a soft limit
0259  * is not specified, we use 95% of the hard limit.
0260  */
0261 void
0262 xfs_dquot_set_prealloc_limits(struct xfs_dquot *dqp)
0263 {
0264     uint64_t space;
0265 
0266     dqp->q_prealloc_hi_wmark = dqp->q_blk.hardlimit;
0267     dqp->q_prealloc_lo_wmark = dqp->q_blk.softlimit;
0268     if (!dqp->q_prealloc_lo_wmark) {
0269         dqp->q_prealloc_lo_wmark = dqp->q_prealloc_hi_wmark;
0270         do_div(dqp->q_prealloc_lo_wmark, 100);
0271         dqp->q_prealloc_lo_wmark *= 95;
0272     }
0273 
0274     space = dqp->q_prealloc_hi_wmark;
0275 
0276     do_div(space, 100);
0277     dqp->q_low_space[XFS_QLOWSP_1_PCNT] = space;
0278     dqp->q_low_space[XFS_QLOWSP_3_PCNT] = space * 3;
0279     dqp->q_low_space[XFS_QLOWSP_5_PCNT] = space * 5;
0280 }
0281 
0282 /*
0283  * Ensure that the given in-core dquot has a buffer on disk backing it, and
0284  * return the buffer locked and held. This is called when the bmapi finds a
0285  * hole.
0286  */
0287 STATIC int
0288 xfs_dquot_disk_alloc(
0289     struct xfs_dquot    *dqp,
0290     struct xfs_buf      **bpp)
0291 {
0292     struct xfs_bmbt_irec    map;
0293     struct xfs_trans    *tp;
0294     struct xfs_mount    *mp = dqp->q_mount;
0295     struct xfs_buf      *bp;
0296     xfs_dqtype_t        qtype = xfs_dquot_type(dqp);
0297     struct xfs_inode    *quotip = xfs_quota_inode(mp, qtype);
0298     int         nmaps = 1;
0299     int         error;
0300 
0301     trace_xfs_dqalloc(dqp);
0302 
0303     error = xfs_trans_alloc(mp, &M_RES(mp)->tr_qm_dqalloc,
0304             XFS_QM_DQALLOC_SPACE_RES(mp), 0, 0, &tp);
0305     if (error)
0306         return error;
0307 
0308     xfs_ilock(quotip, XFS_ILOCK_EXCL);
0309     xfs_trans_ijoin(tp, quotip, 0);
0310 
0311     if (!xfs_this_quota_on(dqp->q_mount, qtype)) {
0312         /*
0313          * Return if this type of quotas is turned off while we didn't
0314          * have an inode lock
0315          */
0316         error = -ESRCH;
0317         goto err_cancel;
0318     }
0319 
0320     error = xfs_iext_count_may_overflow(quotip, XFS_DATA_FORK,
0321             XFS_IEXT_ADD_NOSPLIT_CNT);
0322     if (error == -EFBIG)
0323         error = xfs_iext_count_upgrade(tp, quotip,
0324                 XFS_IEXT_ADD_NOSPLIT_CNT);
0325     if (error)
0326         goto err_cancel;
0327 
0328     /* Create the block mapping. */
0329     error = xfs_bmapi_write(tp, quotip, dqp->q_fileoffset,
0330             XFS_DQUOT_CLUSTER_SIZE_FSB, XFS_BMAPI_METADATA, 0, &map,
0331             &nmaps);
0332     if (error)
0333         goto err_cancel;
0334 
0335     ASSERT(map.br_blockcount == XFS_DQUOT_CLUSTER_SIZE_FSB);
0336     ASSERT(nmaps == 1);
0337     ASSERT((map.br_startblock != DELAYSTARTBLOCK) &&
0338            (map.br_startblock != HOLESTARTBLOCK));
0339 
0340     /*
0341      * Keep track of the blkno to save a lookup later
0342      */
0343     dqp->q_blkno = XFS_FSB_TO_DADDR(mp, map.br_startblock);
0344 
0345     /* now we can just get the buffer (there's nothing to read yet) */
0346     error = xfs_trans_get_buf(tp, mp->m_ddev_targp, dqp->q_blkno,
0347             mp->m_quotainfo->qi_dqchunklen, 0, &bp);
0348     if (error)
0349         goto err_cancel;
0350     bp->b_ops = &xfs_dquot_buf_ops;
0351 
0352     /*
0353      * Make a chunk of dquots out of this buffer and log
0354      * the entire thing.
0355      */
0356     xfs_qm_init_dquot_blk(tp, mp, dqp->q_id, qtype, bp);
0357     xfs_buf_set_ref(bp, XFS_DQUOT_REF);
0358 
0359     /*
0360      * Hold the buffer and join it to the dfops so that we'll still own
0361      * the buffer when we return to the caller.  The buffer disposal on
0362      * error must be paid attention to very carefully, as it has been
0363      * broken since commit efa092f3d4c6 "[XFS] Fixes a bug in the quota
0364      * code when allocating a new dquot record" in 2005, and the later
0365      * conversion to xfs_defer_ops in commit 310a75a3c6c747 failed to keep
0366      * the buffer locked across the _defer_finish call.  We can now do
0367      * this correctly with xfs_defer_bjoin.
0368      *
0369      * Above, we allocated a disk block for the dquot information and used
0370      * get_buf to initialize the dquot. If the _defer_finish fails, the old
0371      * transaction is gone but the new buffer is not joined or held to any
0372      * transaction, so we must _buf_relse it.
0373      *
0374      * If everything succeeds, the caller of this function is returned a
0375      * buffer that is locked and held to the transaction.  The caller
0376      * is responsible for unlocking any buffer passed back, either
0377      * manually or by committing the transaction.  On error, the buffer is
0378      * released and not passed back.
0379      *
0380      * Keep the quota inode ILOCKed until after the transaction commit to
0381      * maintain the atomicity of bmap/rmap updates.
0382      */
0383     xfs_trans_bhold(tp, bp);
0384     error = xfs_trans_commit(tp);
0385     xfs_iunlock(quotip, XFS_ILOCK_EXCL);
0386     if (error) {
0387         xfs_buf_relse(bp);
0388         return error;
0389     }
0390 
0391     *bpp = bp;
0392     return 0;
0393 
0394 err_cancel:
0395     xfs_trans_cancel(tp);
0396     xfs_iunlock(quotip, XFS_ILOCK_EXCL);
0397     return error;
0398 }
0399 
0400 /*
0401  * Read in the in-core dquot's on-disk metadata and return the buffer.
0402  * Returns ENOENT to signal a hole.
0403  */
0404 STATIC int
0405 xfs_dquot_disk_read(
0406     struct xfs_mount    *mp,
0407     struct xfs_dquot    *dqp,
0408     struct xfs_buf      **bpp)
0409 {
0410     struct xfs_bmbt_irec    map;
0411     struct xfs_buf      *bp;
0412     xfs_dqtype_t        qtype = xfs_dquot_type(dqp);
0413     struct xfs_inode    *quotip = xfs_quota_inode(mp, qtype);
0414     uint            lock_mode;
0415     int         nmaps = 1;
0416     int         error;
0417 
0418     lock_mode = xfs_ilock_data_map_shared(quotip);
0419     if (!xfs_this_quota_on(mp, qtype)) {
0420         /*
0421          * Return if this type of quotas is turned off while we
0422          * didn't have the quota inode lock.
0423          */
0424         xfs_iunlock(quotip, lock_mode);
0425         return -ESRCH;
0426     }
0427 
0428     /*
0429      * Find the block map; no allocations yet
0430      */
0431     error = xfs_bmapi_read(quotip, dqp->q_fileoffset,
0432             XFS_DQUOT_CLUSTER_SIZE_FSB, &map, &nmaps, 0);
0433     xfs_iunlock(quotip, lock_mode);
0434     if (error)
0435         return error;
0436 
0437     ASSERT(nmaps == 1);
0438     ASSERT(map.br_blockcount >= 1);
0439     ASSERT(map.br_startblock != DELAYSTARTBLOCK);
0440     if (map.br_startblock == HOLESTARTBLOCK)
0441         return -ENOENT;
0442 
0443     trace_xfs_dqtobp_read(dqp);
0444 
0445     /*
0446      * store the blkno etc so that we don't have to do the
0447      * mapping all the time
0448      */
0449     dqp->q_blkno = XFS_FSB_TO_DADDR(mp, map.br_startblock);
0450 
0451     error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp, dqp->q_blkno,
0452             mp->m_quotainfo->qi_dqchunklen, 0, &bp,
0453             &xfs_dquot_buf_ops);
0454     if (error) {
0455         ASSERT(bp == NULL);
0456         return error;
0457     }
0458 
0459     ASSERT(xfs_buf_islocked(bp));
0460     xfs_buf_set_ref(bp, XFS_DQUOT_REF);
0461     *bpp = bp;
0462 
0463     return 0;
0464 }
0465 
0466 /* Allocate and initialize everything we need for an incore dquot. */
0467 STATIC struct xfs_dquot *
0468 xfs_dquot_alloc(
0469     struct xfs_mount    *mp,
0470     xfs_dqid_t      id,
0471     xfs_dqtype_t        type)
0472 {
0473     struct xfs_dquot    *dqp;
0474 
0475     dqp = kmem_cache_zalloc(xfs_dquot_cache, GFP_KERNEL | __GFP_NOFAIL);
0476 
0477     dqp->q_type = type;
0478     dqp->q_id = id;
0479     dqp->q_mount = mp;
0480     INIT_LIST_HEAD(&dqp->q_lru);
0481     mutex_init(&dqp->q_qlock);
0482     init_waitqueue_head(&dqp->q_pinwait);
0483     dqp->q_fileoffset = (xfs_fileoff_t)id / mp->m_quotainfo->qi_dqperchunk;
0484     /*
0485      * Offset of dquot in the (fixed sized) dquot chunk.
0486      */
0487     dqp->q_bufoffset = (id % mp->m_quotainfo->qi_dqperchunk) *
0488             sizeof(struct xfs_dqblk);
0489 
0490     /*
0491      * Because we want to use a counting completion, complete
0492      * the flush completion once to allow a single access to
0493      * the flush completion without blocking.
0494      */
0495     init_completion(&dqp->q_flush);
0496     complete(&dqp->q_flush);
0497 
0498     /*
0499      * Make sure group quotas have a different lock class than user
0500      * quotas.
0501      */
0502     switch (type) {
0503     case XFS_DQTYPE_USER:
0504         /* uses the default lock class */
0505         break;
0506     case XFS_DQTYPE_GROUP:
0507         lockdep_set_class(&dqp->q_qlock, &xfs_dquot_group_class);
0508         break;
0509     case XFS_DQTYPE_PROJ:
0510         lockdep_set_class(&dqp->q_qlock, &xfs_dquot_project_class);
0511         break;
0512     default:
0513         ASSERT(0);
0514         break;
0515     }
0516 
0517     xfs_qm_dquot_logitem_init(dqp);
0518 
0519     XFS_STATS_INC(mp, xs_qm_dquot);
0520     return dqp;
0521 }
0522 
0523 /* Check the ondisk dquot's id and type match what the incore dquot expects. */
0524 static bool
0525 xfs_dquot_check_type(
0526     struct xfs_dquot    *dqp,
0527     struct xfs_disk_dquot   *ddqp)
0528 {
0529     uint8_t         ddqp_type;
0530     uint8_t         dqp_type;
0531 
0532     ddqp_type = ddqp->d_type & XFS_DQTYPE_REC_MASK;
0533     dqp_type = xfs_dquot_type(dqp);
0534 
0535     if (be32_to_cpu(ddqp->d_id) != dqp->q_id)
0536         return false;
0537 
0538     /*
0539      * V5 filesystems always expect an exact type match.  V4 filesystems
0540      * expect an exact match for user dquots and for non-root group and
0541      * project dquots.
0542      */
0543     if (xfs_has_crc(dqp->q_mount) ||
0544         dqp_type == XFS_DQTYPE_USER || dqp->q_id != 0)
0545         return ddqp_type == dqp_type;
0546 
0547     /*
0548      * V4 filesystems support either group or project quotas, but not both
0549      * at the same time.  The non-user quota file can be switched between
0550      * group and project quota uses depending on the mount options, which
0551      * means that we can encounter the other type when we try to load quota
0552      * defaults.  Quotacheck will soon reset the entire quota file
0553      * (including the root dquot) anyway, but don't log scary corruption
0554      * reports to dmesg.
0555      */
0556     return ddqp_type == XFS_DQTYPE_GROUP || ddqp_type == XFS_DQTYPE_PROJ;
0557 }
0558 
0559 /* Copy the in-core quota fields in from the on-disk buffer. */
0560 STATIC int
0561 xfs_dquot_from_disk(
0562     struct xfs_dquot    *dqp,
0563     struct xfs_buf      *bp)
0564 {
0565     struct xfs_disk_dquot   *ddqp = bp->b_addr + dqp->q_bufoffset;
0566 
0567     /*
0568      * Ensure that we got the type and ID we were looking for.
0569      * Everything else was checked by the dquot buffer verifier.
0570      */
0571     if (!xfs_dquot_check_type(dqp, ddqp)) {
0572         xfs_alert_tag(bp->b_mount, XFS_PTAG_VERIFIER_ERROR,
0573               "Metadata corruption detected at %pS, quota %u",
0574               __this_address, dqp->q_id);
0575         xfs_alert(bp->b_mount, "Unmount and run xfs_repair");
0576         return -EFSCORRUPTED;
0577     }
0578 
0579     /* copy everything from disk dquot to the incore dquot */
0580     dqp->q_type = ddqp->d_type;
0581     dqp->q_blk.hardlimit = be64_to_cpu(ddqp->d_blk_hardlimit);
0582     dqp->q_blk.softlimit = be64_to_cpu(ddqp->d_blk_softlimit);
0583     dqp->q_ino.hardlimit = be64_to_cpu(ddqp->d_ino_hardlimit);
0584     dqp->q_ino.softlimit = be64_to_cpu(ddqp->d_ino_softlimit);
0585     dqp->q_rtb.hardlimit = be64_to_cpu(ddqp->d_rtb_hardlimit);
0586     dqp->q_rtb.softlimit = be64_to_cpu(ddqp->d_rtb_softlimit);
0587 
0588     dqp->q_blk.count = be64_to_cpu(ddqp->d_bcount);
0589     dqp->q_ino.count = be64_to_cpu(ddqp->d_icount);
0590     dqp->q_rtb.count = be64_to_cpu(ddqp->d_rtbcount);
0591 
0592     dqp->q_blk.timer = xfs_dquot_from_disk_ts(ddqp, ddqp->d_btimer);
0593     dqp->q_ino.timer = xfs_dquot_from_disk_ts(ddqp, ddqp->d_itimer);
0594     dqp->q_rtb.timer = xfs_dquot_from_disk_ts(ddqp, ddqp->d_rtbtimer);
0595 
0596     /*
0597      * Reservation counters are defined as reservation plus current usage
0598      * to avoid having to add every time.
0599      */
0600     dqp->q_blk.reserved = dqp->q_blk.count;
0601     dqp->q_ino.reserved = dqp->q_ino.count;
0602     dqp->q_rtb.reserved = dqp->q_rtb.count;
0603 
0604     /* initialize the dquot speculative prealloc thresholds */
0605     xfs_dquot_set_prealloc_limits(dqp);
0606     return 0;
0607 }
0608 
0609 /* Copy the in-core quota fields into the on-disk buffer. */
0610 void
0611 xfs_dquot_to_disk(
0612     struct xfs_disk_dquot   *ddqp,
0613     struct xfs_dquot    *dqp)
0614 {
0615     ddqp->d_magic = cpu_to_be16(XFS_DQUOT_MAGIC);
0616     ddqp->d_version = XFS_DQUOT_VERSION;
0617     ddqp->d_type = dqp->q_type;
0618     ddqp->d_id = cpu_to_be32(dqp->q_id);
0619     ddqp->d_pad0 = 0;
0620     ddqp->d_pad = 0;
0621 
0622     ddqp->d_blk_hardlimit = cpu_to_be64(dqp->q_blk.hardlimit);
0623     ddqp->d_blk_softlimit = cpu_to_be64(dqp->q_blk.softlimit);
0624     ddqp->d_ino_hardlimit = cpu_to_be64(dqp->q_ino.hardlimit);
0625     ddqp->d_ino_softlimit = cpu_to_be64(dqp->q_ino.softlimit);
0626     ddqp->d_rtb_hardlimit = cpu_to_be64(dqp->q_rtb.hardlimit);
0627     ddqp->d_rtb_softlimit = cpu_to_be64(dqp->q_rtb.softlimit);
0628 
0629     ddqp->d_bcount = cpu_to_be64(dqp->q_blk.count);
0630     ddqp->d_icount = cpu_to_be64(dqp->q_ino.count);
0631     ddqp->d_rtbcount = cpu_to_be64(dqp->q_rtb.count);
0632 
0633     ddqp->d_bwarns = 0;
0634     ddqp->d_iwarns = 0;
0635     ddqp->d_rtbwarns = 0;
0636 
0637     ddqp->d_btimer = xfs_dquot_to_disk_ts(dqp, dqp->q_blk.timer);
0638     ddqp->d_itimer = xfs_dquot_to_disk_ts(dqp, dqp->q_ino.timer);
0639     ddqp->d_rtbtimer = xfs_dquot_to_disk_ts(dqp, dqp->q_rtb.timer);
0640 }
0641 
0642 /*
0643  * Read in the ondisk dquot using dqtobp() then copy it to an incore version,
0644  * and release the buffer immediately.  If @can_alloc is true, fill any
0645  * holes in the on-disk metadata.
0646  */
0647 static int
0648 xfs_qm_dqread(
0649     struct xfs_mount    *mp,
0650     xfs_dqid_t      id,
0651     xfs_dqtype_t        type,
0652     bool            can_alloc,
0653     struct xfs_dquot    **dqpp)
0654 {
0655     struct xfs_dquot    *dqp;
0656     struct xfs_buf      *bp;
0657     int         error;
0658 
0659     dqp = xfs_dquot_alloc(mp, id, type);
0660     trace_xfs_dqread(dqp);
0661 
0662     /* Try to read the buffer, allocating if necessary. */
0663     error = xfs_dquot_disk_read(mp, dqp, &bp);
0664     if (error == -ENOENT && can_alloc)
0665         error = xfs_dquot_disk_alloc(dqp, &bp);
0666     if (error)
0667         goto err;
0668 
0669     /*
0670      * At this point we should have a clean locked buffer.  Copy the data
0671      * to the incore dquot and release the buffer since the incore dquot
0672      * has its own locking protocol so we needn't tie up the buffer any
0673      * further.
0674      */
0675     ASSERT(xfs_buf_islocked(bp));
0676     error = xfs_dquot_from_disk(dqp, bp);
0677     xfs_buf_relse(bp);
0678     if (error)
0679         goto err;
0680 
0681     *dqpp = dqp;
0682     return error;
0683 
0684 err:
0685     trace_xfs_dqread_fail(dqp);
0686     xfs_qm_dqdestroy(dqp);
0687     *dqpp = NULL;
0688     return error;
0689 }
0690 
0691 /*
0692  * Advance to the next id in the current chunk, or if at the
0693  * end of the chunk, skip ahead to first id in next allocated chunk
0694  * using the SEEK_DATA interface.
0695  */
0696 static int
0697 xfs_dq_get_next_id(
0698     struct xfs_mount    *mp,
0699     xfs_dqtype_t        type,
0700     xfs_dqid_t      *id)
0701 {
0702     struct xfs_inode    *quotip = xfs_quota_inode(mp, type);
0703     xfs_dqid_t      next_id = *id + 1; /* simple advance */
0704     uint            lock_flags;
0705     struct xfs_bmbt_irec    got;
0706     struct xfs_iext_cursor  cur;
0707     xfs_fsblock_t       start;
0708     int         error = 0;
0709 
0710     /* If we'd wrap past the max ID, stop */
0711     if (next_id < *id)
0712         return -ENOENT;
0713 
0714     /* If new ID is within the current chunk, advancing it sufficed */
0715     if (next_id % mp->m_quotainfo->qi_dqperchunk) {
0716         *id = next_id;
0717         return 0;
0718     }
0719 
0720     /* Nope, next_id is now past the current chunk, so find the next one */
0721     start = (xfs_fsblock_t)next_id / mp->m_quotainfo->qi_dqperchunk;
0722 
0723     lock_flags = xfs_ilock_data_map_shared(quotip);
0724     error = xfs_iread_extents(NULL, quotip, XFS_DATA_FORK);
0725     if (error)
0726         return error;
0727 
0728     if (xfs_iext_lookup_extent(quotip, &quotip->i_df, start, &cur, &got)) {
0729         /* contiguous chunk, bump startoff for the id calculation */
0730         if (got.br_startoff < start)
0731             got.br_startoff = start;
0732         *id = got.br_startoff * mp->m_quotainfo->qi_dqperchunk;
0733     } else {
0734         error = -ENOENT;
0735     }
0736 
0737     xfs_iunlock(quotip, lock_flags);
0738 
0739     return error;
0740 }
0741 
0742 /*
0743  * Look up the dquot in the in-core cache.  If found, the dquot is returned
0744  * locked and ready to go.
0745  */
0746 static struct xfs_dquot *
0747 xfs_qm_dqget_cache_lookup(
0748     struct xfs_mount    *mp,
0749     struct xfs_quotainfo    *qi,
0750     struct radix_tree_root  *tree,
0751     xfs_dqid_t      id)
0752 {
0753     struct xfs_dquot    *dqp;
0754 
0755 restart:
0756     mutex_lock(&qi->qi_tree_lock);
0757     dqp = radix_tree_lookup(tree, id);
0758     if (!dqp) {
0759         mutex_unlock(&qi->qi_tree_lock);
0760         XFS_STATS_INC(mp, xs_qm_dqcachemisses);
0761         return NULL;
0762     }
0763 
0764     xfs_dqlock(dqp);
0765     if (dqp->q_flags & XFS_DQFLAG_FREEING) {
0766         xfs_dqunlock(dqp);
0767         mutex_unlock(&qi->qi_tree_lock);
0768         trace_xfs_dqget_freeing(dqp);
0769         delay(1);
0770         goto restart;
0771     }
0772 
0773     dqp->q_nrefs++;
0774     mutex_unlock(&qi->qi_tree_lock);
0775 
0776     trace_xfs_dqget_hit(dqp);
0777     XFS_STATS_INC(mp, xs_qm_dqcachehits);
0778     return dqp;
0779 }
0780 
0781 /*
0782  * Try to insert a new dquot into the in-core cache.  If an error occurs the
0783  * caller should throw away the dquot and start over.  Otherwise, the dquot
0784  * is returned locked (and held by the cache) as if there had been a cache
0785  * hit.
0786  */
0787 static int
0788 xfs_qm_dqget_cache_insert(
0789     struct xfs_mount    *mp,
0790     struct xfs_quotainfo    *qi,
0791     struct radix_tree_root  *tree,
0792     xfs_dqid_t      id,
0793     struct xfs_dquot    *dqp)
0794 {
0795     int         error;
0796 
0797     mutex_lock(&qi->qi_tree_lock);
0798     error = radix_tree_insert(tree, id, dqp);
0799     if (unlikely(error)) {
0800         /* Duplicate found!  Caller must try again. */
0801         WARN_ON(error != -EEXIST);
0802         mutex_unlock(&qi->qi_tree_lock);
0803         trace_xfs_dqget_dup(dqp);
0804         return error;
0805     }
0806 
0807     /* Return a locked dquot to the caller, with a reference taken. */
0808     xfs_dqlock(dqp);
0809     dqp->q_nrefs = 1;
0810 
0811     qi->qi_dquots++;
0812     mutex_unlock(&qi->qi_tree_lock);
0813 
0814     return 0;
0815 }
0816 
0817 /* Check our input parameters. */
0818 static int
0819 xfs_qm_dqget_checks(
0820     struct xfs_mount    *mp,
0821     xfs_dqtype_t        type)
0822 {
0823     switch (type) {
0824     case XFS_DQTYPE_USER:
0825         if (!XFS_IS_UQUOTA_ON(mp))
0826             return -ESRCH;
0827         return 0;
0828     case XFS_DQTYPE_GROUP:
0829         if (!XFS_IS_GQUOTA_ON(mp))
0830             return -ESRCH;
0831         return 0;
0832     case XFS_DQTYPE_PROJ:
0833         if (!XFS_IS_PQUOTA_ON(mp))
0834             return -ESRCH;
0835         return 0;
0836     default:
0837         WARN_ON_ONCE(0);
0838         return -EINVAL;
0839     }
0840 }
0841 
0842 /*
0843  * Given the file system, id, and type (UDQUOT/GDQUOT/PDQUOT), return a
0844  * locked dquot, doing an allocation (if requested) as needed.
0845  */
0846 int
0847 xfs_qm_dqget(
0848     struct xfs_mount    *mp,
0849     xfs_dqid_t      id,
0850     xfs_dqtype_t        type,
0851     bool            can_alloc,
0852     struct xfs_dquot    **O_dqpp)
0853 {
0854     struct xfs_quotainfo    *qi = mp->m_quotainfo;
0855     struct radix_tree_root  *tree = xfs_dquot_tree(qi, type);
0856     struct xfs_dquot    *dqp;
0857     int         error;
0858 
0859     error = xfs_qm_dqget_checks(mp, type);
0860     if (error)
0861         return error;
0862 
0863 restart:
0864     dqp = xfs_qm_dqget_cache_lookup(mp, qi, tree, id);
0865     if (dqp) {
0866         *O_dqpp = dqp;
0867         return 0;
0868     }
0869 
0870     error = xfs_qm_dqread(mp, id, type, can_alloc, &dqp);
0871     if (error)
0872         return error;
0873 
0874     error = xfs_qm_dqget_cache_insert(mp, qi, tree, id, dqp);
0875     if (error) {
0876         /*
0877          * Duplicate found. Just throw away the new dquot and start
0878          * over.
0879          */
0880         xfs_qm_dqdestroy(dqp);
0881         XFS_STATS_INC(mp, xs_qm_dquot_dups);
0882         goto restart;
0883     }
0884 
0885     trace_xfs_dqget_miss(dqp);
0886     *O_dqpp = dqp;
0887     return 0;
0888 }
0889 
0890 /*
0891  * Given a dquot id and type, read and initialize a dquot from the on-disk
0892  * metadata.  This function is only for use during quota initialization so
0893  * it ignores the dquot cache assuming that the dquot shrinker isn't set up.
0894  * The caller is responsible for _qm_dqdestroy'ing the returned dquot.
0895  */
0896 int
0897 xfs_qm_dqget_uncached(
0898     struct xfs_mount    *mp,
0899     xfs_dqid_t      id,
0900     xfs_dqtype_t        type,
0901     struct xfs_dquot    **dqpp)
0902 {
0903     int         error;
0904 
0905     error = xfs_qm_dqget_checks(mp, type);
0906     if (error)
0907         return error;
0908 
0909     return xfs_qm_dqread(mp, id, type, 0, dqpp);
0910 }
0911 
0912 /* Return the quota id for a given inode and type. */
0913 xfs_dqid_t
0914 xfs_qm_id_for_quotatype(
0915     struct xfs_inode    *ip,
0916     xfs_dqtype_t        type)
0917 {
0918     switch (type) {
0919     case XFS_DQTYPE_USER:
0920         return i_uid_read(VFS_I(ip));
0921     case XFS_DQTYPE_GROUP:
0922         return i_gid_read(VFS_I(ip));
0923     case XFS_DQTYPE_PROJ:
0924         return ip->i_projid;
0925     }
0926     ASSERT(0);
0927     return 0;
0928 }
0929 
0930 /*
0931  * Return the dquot for a given inode and type.  If @can_alloc is true, then
0932  * allocate blocks if needed.  The inode's ILOCK must be held and it must not
0933  * have already had an inode attached.
0934  */
0935 int
0936 xfs_qm_dqget_inode(
0937     struct xfs_inode    *ip,
0938     xfs_dqtype_t        type,
0939     bool            can_alloc,
0940     struct xfs_dquot    **O_dqpp)
0941 {
0942     struct xfs_mount    *mp = ip->i_mount;
0943     struct xfs_quotainfo    *qi = mp->m_quotainfo;
0944     struct radix_tree_root  *tree = xfs_dquot_tree(qi, type);
0945     struct xfs_dquot    *dqp;
0946     xfs_dqid_t      id;
0947     int         error;
0948 
0949     error = xfs_qm_dqget_checks(mp, type);
0950     if (error)
0951         return error;
0952 
0953     ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
0954     ASSERT(xfs_inode_dquot(ip, type) == NULL);
0955 
0956     id = xfs_qm_id_for_quotatype(ip, type);
0957 
0958 restart:
0959     dqp = xfs_qm_dqget_cache_lookup(mp, qi, tree, id);
0960     if (dqp) {
0961         *O_dqpp = dqp;
0962         return 0;
0963     }
0964 
0965     /*
0966      * Dquot cache miss. We don't want to keep the inode lock across
0967      * a (potential) disk read. Also we don't want to deal with the lock
0968      * ordering between quotainode and this inode. OTOH, dropping the inode
0969      * lock here means dealing with a chown that can happen before
0970      * we re-acquire the lock.
0971      */
0972     xfs_iunlock(ip, XFS_ILOCK_EXCL);
0973     error = xfs_qm_dqread(mp, id, type, can_alloc, &dqp);
0974     xfs_ilock(ip, XFS_ILOCK_EXCL);
0975     if (error)
0976         return error;
0977 
0978     /*
0979      * A dquot could be attached to this inode by now, since we had
0980      * dropped the ilock.
0981      */
0982     if (xfs_this_quota_on(mp, type)) {
0983         struct xfs_dquot    *dqp1;
0984 
0985         dqp1 = xfs_inode_dquot(ip, type);
0986         if (dqp1) {
0987             xfs_qm_dqdestroy(dqp);
0988             dqp = dqp1;
0989             xfs_dqlock(dqp);
0990             goto dqret;
0991         }
0992     } else {
0993         /* inode stays locked on return */
0994         xfs_qm_dqdestroy(dqp);
0995         return -ESRCH;
0996     }
0997 
0998     error = xfs_qm_dqget_cache_insert(mp, qi, tree, id, dqp);
0999     if (error) {
1000         /*
1001          * Duplicate found. Just throw away the new dquot and start
1002          * over.
1003          */
1004         xfs_qm_dqdestroy(dqp);
1005         XFS_STATS_INC(mp, xs_qm_dquot_dups);
1006         goto restart;
1007     }
1008 
1009 dqret:
1010     ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
1011     trace_xfs_dqget_miss(dqp);
1012     *O_dqpp = dqp;
1013     return 0;
1014 }
1015 
1016 /*
1017  * Starting at @id and progressing upwards, look for an initialized incore
1018  * dquot, lock it, and return it.
1019  */
1020 int
1021 xfs_qm_dqget_next(
1022     struct xfs_mount    *mp,
1023     xfs_dqid_t      id,
1024     xfs_dqtype_t        type,
1025     struct xfs_dquot    **dqpp)
1026 {
1027     struct xfs_dquot    *dqp;
1028     int         error = 0;
1029 
1030     *dqpp = NULL;
1031     for (; !error; error = xfs_dq_get_next_id(mp, type, &id)) {
1032         error = xfs_qm_dqget(mp, id, type, false, &dqp);
1033         if (error == -ENOENT)
1034             continue;
1035         else if (error != 0)
1036             break;
1037 
1038         if (!XFS_IS_DQUOT_UNINITIALIZED(dqp)) {
1039             *dqpp = dqp;
1040             return 0;
1041         }
1042 
1043         xfs_qm_dqput(dqp);
1044     }
1045 
1046     return error;
1047 }
1048 
1049 /*
1050  * Release a reference to the dquot (decrement ref-count) and unlock it.
1051  *
1052  * If there is a group quota attached to this dquot, carefully release that
1053  * too without tripping over deadlocks'n'stuff.
1054  */
1055 void
1056 xfs_qm_dqput(
1057     struct xfs_dquot    *dqp)
1058 {
1059     ASSERT(dqp->q_nrefs > 0);
1060     ASSERT(XFS_DQ_IS_LOCKED(dqp));
1061 
1062     trace_xfs_dqput(dqp);
1063 
1064     if (--dqp->q_nrefs == 0) {
1065         struct xfs_quotainfo    *qi = dqp->q_mount->m_quotainfo;
1066         trace_xfs_dqput_free(dqp);
1067 
1068         if (list_lru_add(&qi->qi_lru, &dqp->q_lru))
1069             XFS_STATS_INC(dqp->q_mount, xs_qm_dquot_unused);
1070     }
1071     xfs_dqunlock(dqp);
1072 }
1073 
1074 /*
1075  * Release a dquot. Flush it if dirty, then dqput() it.
1076  * dquot must not be locked.
1077  */
1078 void
1079 xfs_qm_dqrele(
1080     struct xfs_dquot    *dqp)
1081 {
1082     if (!dqp)
1083         return;
1084 
1085     trace_xfs_dqrele(dqp);
1086 
1087     xfs_dqlock(dqp);
1088     /*
1089      * We don't care to flush it if the dquot is dirty here.
1090      * That will create stutters that we want to avoid.
1091      * Instead we do a delayed write when we try to reclaim
1092      * a dirty dquot. Also xfs_sync will take part of the burden...
1093      */
1094     xfs_qm_dqput(dqp);
1095 }
1096 
1097 /*
1098  * This is the dquot flushing I/O completion routine.  It is called
1099  * from interrupt level when the buffer containing the dquot is
1100  * flushed to disk.  It is responsible for removing the dquot logitem
1101  * from the AIL if it has not been re-logged, and unlocking the dquot's
1102  * flush lock. This behavior is very similar to that of inodes..
1103  */
1104 static void
1105 xfs_qm_dqflush_done(
1106     struct xfs_log_item *lip)
1107 {
1108     struct xfs_dq_logitem   *qip = (struct xfs_dq_logitem *)lip;
1109     struct xfs_dquot    *dqp = qip->qli_dquot;
1110     struct xfs_ail      *ailp = lip->li_ailp;
1111     xfs_lsn_t       tail_lsn;
1112 
1113     /*
1114      * We only want to pull the item from the AIL if its
1115      * location in the log has not changed since we started the flush.
1116      * Thus, we only bother if the dquot's lsn has
1117      * not changed. First we check the lsn outside the lock
1118      * since it's cheaper, and then we recheck while
1119      * holding the lock before removing the dquot from the AIL.
1120      */
1121     if (test_bit(XFS_LI_IN_AIL, &lip->li_flags) &&
1122         ((lip->li_lsn == qip->qli_flush_lsn) ||
1123          test_bit(XFS_LI_FAILED, &lip->li_flags))) {
1124 
1125         spin_lock(&ailp->ail_lock);
1126         xfs_clear_li_failed(lip);
1127         if (lip->li_lsn == qip->qli_flush_lsn) {
1128             /* xfs_ail_update_finish() drops the AIL lock */
1129             tail_lsn = xfs_ail_delete_one(ailp, lip);
1130             xfs_ail_update_finish(ailp, tail_lsn);
1131         } else {
1132             spin_unlock(&ailp->ail_lock);
1133         }
1134     }
1135 
1136     /*
1137      * Release the dq's flush lock since we're done with it.
1138      */
1139     xfs_dqfunlock(dqp);
1140 }
1141 
1142 void
1143 xfs_buf_dquot_iodone(
1144     struct xfs_buf      *bp)
1145 {
1146     struct xfs_log_item *lip, *n;
1147 
1148     list_for_each_entry_safe(lip, n, &bp->b_li_list, li_bio_list) {
1149         list_del_init(&lip->li_bio_list);
1150         xfs_qm_dqflush_done(lip);
1151     }
1152 }
1153 
1154 void
1155 xfs_buf_dquot_io_fail(
1156     struct xfs_buf      *bp)
1157 {
1158     struct xfs_log_item *lip;
1159 
1160     spin_lock(&bp->b_mount->m_ail->ail_lock);
1161     list_for_each_entry(lip, &bp->b_li_list, li_bio_list)
1162         xfs_set_li_failed(lip, bp);
1163     spin_unlock(&bp->b_mount->m_ail->ail_lock);
1164 }
1165 
1166 /* Check incore dquot for errors before we flush. */
1167 static xfs_failaddr_t
1168 xfs_qm_dqflush_check(
1169     struct xfs_dquot    *dqp)
1170 {
1171     xfs_dqtype_t        type = xfs_dquot_type(dqp);
1172 
1173     if (type != XFS_DQTYPE_USER &&
1174         type != XFS_DQTYPE_GROUP &&
1175         type != XFS_DQTYPE_PROJ)
1176         return __this_address;
1177 
1178     if (dqp->q_id == 0)
1179         return NULL;
1180 
1181     if (dqp->q_blk.softlimit && dqp->q_blk.count > dqp->q_blk.softlimit &&
1182         !dqp->q_blk.timer)
1183         return __this_address;
1184 
1185     if (dqp->q_ino.softlimit && dqp->q_ino.count > dqp->q_ino.softlimit &&
1186         !dqp->q_ino.timer)
1187         return __this_address;
1188 
1189     if (dqp->q_rtb.softlimit && dqp->q_rtb.count > dqp->q_rtb.softlimit &&
1190         !dqp->q_rtb.timer)
1191         return __this_address;
1192 
1193     /* bigtime flag should never be set on root dquots */
1194     if (dqp->q_type & XFS_DQTYPE_BIGTIME) {
1195         if (!xfs_has_bigtime(dqp->q_mount))
1196             return __this_address;
1197         if (dqp->q_id == 0)
1198             return __this_address;
1199     }
1200 
1201     return NULL;
1202 }
1203 
1204 /*
1205  * Write a modified dquot to disk.
1206  * The dquot must be locked and the flush lock too taken by caller.
1207  * The flush lock will not be unlocked until the dquot reaches the disk,
1208  * but the dquot is free to be unlocked and modified by the caller
1209  * in the interim. Dquot is still locked on return. This behavior is
1210  * identical to that of inodes.
1211  */
1212 int
1213 xfs_qm_dqflush(
1214     struct xfs_dquot    *dqp,
1215     struct xfs_buf      **bpp)
1216 {
1217     struct xfs_mount    *mp = dqp->q_mount;
1218     struct xfs_log_item *lip = &dqp->q_logitem.qli_item;
1219     struct xfs_buf      *bp;
1220     struct xfs_dqblk    *dqblk;
1221     xfs_failaddr_t      fa;
1222     int         error;
1223 
1224     ASSERT(XFS_DQ_IS_LOCKED(dqp));
1225     ASSERT(!completion_done(&dqp->q_flush));
1226 
1227     trace_xfs_dqflush(dqp);
1228 
1229     *bpp = NULL;
1230 
1231     xfs_qm_dqunpin_wait(dqp);
1232 
1233     /*
1234      * Get the buffer containing the on-disk dquot
1235      */
1236     error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp, dqp->q_blkno,
1237                    mp->m_quotainfo->qi_dqchunklen, XBF_TRYLOCK,
1238                    &bp, &xfs_dquot_buf_ops);
1239     if (error == -EAGAIN)
1240         goto out_unlock;
1241     if (error)
1242         goto out_abort;
1243 
1244     fa = xfs_qm_dqflush_check(dqp);
1245     if (fa) {
1246         xfs_alert(mp, "corrupt dquot ID 0x%x in memory at %pS",
1247                 dqp->q_id, fa);
1248         xfs_buf_relse(bp);
1249         error = -EFSCORRUPTED;
1250         goto out_abort;
1251     }
1252 
1253     /* Flush the incore dquot to the ondisk buffer. */
1254     dqblk = bp->b_addr + dqp->q_bufoffset;
1255     xfs_dquot_to_disk(&dqblk->dd_diskdq, dqp);
1256 
1257     /*
1258      * Clear the dirty field and remember the flush lsn for later use.
1259      */
1260     dqp->q_flags &= ~XFS_DQFLAG_DIRTY;
1261 
1262     xfs_trans_ail_copy_lsn(mp->m_ail, &dqp->q_logitem.qli_flush_lsn,
1263                     &dqp->q_logitem.qli_item.li_lsn);
1264 
1265     /*
1266      * copy the lsn into the on-disk dquot now while we have the in memory
1267      * dquot here. This can't be done later in the write verifier as we
1268      * can't get access to the log item at that point in time.
1269      *
1270      * We also calculate the CRC here so that the on-disk dquot in the
1271      * buffer always has a valid CRC. This ensures there is no possibility
1272      * of a dquot without an up-to-date CRC getting to disk.
1273      */
1274     if (xfs_has_crc(mp)) {
1275         dqblk->dd_lsn = cpu_to_be64(dqp->q_logitem.qli_item.li_lsn);
1276         xfs_update_cksum((char *)dqblk, sizeof(struct xfs_dqblk),
1277                  XFS_DQUOT_CRC_OFF);
1278     }
1279 
1280     /*
1281      * Attach the dquot to the buffer so that we can remove this dquot from
1282      * the AIL and release the flush lock once the dquot is synced to disk.
1283      */
1284     bp->b_flags |= _XBF_DQUOTS;
1285     list_add_tail(&dqp->q_logitem.qli_item.li_bio_list, &bp->b_li_list);
1286 
1287     /*
1288      * If the buffer is pinned then push on the log so we won't
1289      * get stuck waiting in the write for too long.
1290      */
1291     if (xfs_buf_ispinned(bp)) {
1292         trace_xfs_dqflush_force(dqp);
1293         xfs_log_force(mp, 0);
1294     }
1295 
1296     trace_xfs_dqflush_done(dqp);
1297     *bpp = bp;
1298     return 0;
1299 
1300 out_abort:
1301     dqp->q_flags &= ~XFS_DQFLAG_DIRTY;
1302     xfs_trans_ail_delete(lip, 0);
1303     xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
1304 out_unlock:
1305     xfs_dqfunlock(dqp);
1306     return error;
1307 }
1308 
1309 /*
1310  * Lock two xfs_dquot structures.
1311  *
1312  * To avoid deadlocks we always lock the quota structure with
1313  * the lowerd id first.
1314  */
1315 void
1316 xfs_dqlock2(
1317     struct xfs_dquot    *d1,
1318     struct xfs_dquot    *d2)
1319 {
1320     if (d1 && d2) {
1321         ASSERT(d1 != d2);
1322         if (d1->q_id > d2->q_id) {
1323             mutex_lock(&d2->q_qlock);
1324             mutex_lock_nested(&d1->q_qlock, XFS_QLOCK_NESTED);
1325         } else {
1326             mutex_lock(&d1->q_qlock);
1327             mutex_lock_nested(&d2->q_qlock, XFS_QLOCK_NESTED);
1328         }
1329     } else if (d1) {
1330         mutex_lock(&d1->q_qlock);
1331     } else if (d2) {
1332         mutex_lock(&d2->q_qlock);
1333     }
1334 }
1335 
1336 int __init
1337 xfs_qm_init(void)
1338 {
1339     xfs_dquot_cache = kmem_cache_create("xfs_dquot",
1340                       sizeof(struct xfs_dquot),
1341                       0, 0, NULL);
1342     if (!xfs_dquot_cache)
1343         goto out;
1344 
1345     xfs_dqtrx_cache = kmem_cache_create("xfs_dqtrx",
1346                          sizeof(struct xfs_dquot_acct),
1347                          0, 0, NULL);
1348     if (!xfs_dqtrx_cache)
1349         goto out_free_dquot_cache;
1350 
1351     return 0;
1352 
1353 out_free_dquot_cache:
1354     kmem_cache_destroy(xfs_dquot_cache);
1355 out:
1356     return -ENOMEM;
1357 }
1358 
1359 void
1360 xfs_qm_exit(void)
1361 {
1362     kmem_cache_destroy(xfs_dqtrx_cache);
1363     kmem_cache_destroy(xfs_dquot_cache);
1364 }
1365 
1366 /*
1367  * Iterate every dquot of a particular type.  The caller must ensure that the
1368  * particular quota type is active.  iter_fn can return negative error codes,
1369  * or -ECANCELED to indicate that it wants to stop iterating.
1370  */
1371 int
1372 xfs_qm_dqiterate(
1373     struct xfs_mount    *mp,
1374     xfs_dqtype_t        type,
1375     xfs_qm_dqiterate_fn iter_fn,
1376     void            *priv)
1377 {
1378     struct xfs_dquot    *dq;
1379     xfs_dqid_t      id = 0;
1380     int         error;
1381 
1382     do {
1383         error = xfs_qm_dqget_next(mp, id, type, &dq);
1384         if (error == -ENOENT)
1385             return 0;
1386         if (error)
1387             return error;
1388 
1389         error = iter_fn(dq, type, priv);
1390         id = dq->q_id;
1391         xfs_qm_dqput(dq);
1392     } while (error == 0 && id != 0);
1393 
1394     return error;
1395 }