cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

xfs_qm.c (46380B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * Copyright (c) 2000-2005 Silicon Graphics, Inc.
      4 * All Rights Reserved.
      5 */
      6#include "xfs.h"
      7#include "xfs_fs.h"
      8#include "xfs_shared.h"
      9#include "xfs_format.h"
     10#include "xfs_log_format.h"
     11#include "xfs_trans_resv.h"
     12#include "xfs_bit.h"
     13#include "xfs_sb.h"
     14#include "xfs_mount.h"
     15#include "xfs_inode.h"
     16#include "xfs_iwalk.h"
     17#include "xfs_quota.h"
     18#include "xfs_bmap.h"
     19#include "xfs_bmap_util.h"
     20#include "xfs_trans.h"
     21#include "xfs_trans_space.h"
     22#include "xfs_qm.h"
     23#include "xfs_trace.h"
     24#include "xfs_icache.h"
     25#include "xfs_error.h"
     26#include "xfs_ag.h"
     27#include "xfs_ialloc.h"
     28#include "xfs_log_priv.h"
     29
     30/*
     31 * The global quota manager. There is only one of these for the entire
     32 * system, _not_ one per file system. XQM keeps track of the overall
     33 * quota functionality, including maintaining the freelist and hash
     34 * tables of dquots.
     35 */
     36STATIC int	xfs_qm_init_quotainos(struct xfs_mount *mp);
     37STATIC int	xfs_qm_init_quotainfo(struct xfs_mount *mp);
     38
     39STATIC void	xfs_qm_destroy_quotainos(struct xfs_quotainfo *qi);
     40STATIC void	xfs_qm_dqfree_one(struct xfs_dquot *dqp);
     41/*
     42 * We use the batch lookup interface to iterate over the dquots as it
     43 * currently is the only interface into the radix tree code that allows
     44 * fuzzy lookups instead of exact matches.  Holding the lock over multiple
     45 * operations is fine as all callers are used either during mount/umount
     46 * or quotaoff.
     47 */
     48#define XFS_DQ_LOOKUP_BATCH	32
     49
     50STATIC int
     51xfs_qm_dquot_walk(
     52	struct xfs_mount	*mp,
     53	xfs_dqtype_t		type,
     54	int			(*execute)(struct xfs_dquot *dqp, void *data),
     55	void			*data)
     56{
     57	struct xfs_quotainfo	*qi = mp->m_quotainfo;
     58	struct radix_tree_root	*tree = xfs_dquot_tree(qi, type);
     59	uint32_t		next_index;
     60	int			last_error = 0;
     61	int			skipped;
     62	int			nr_found;
     63
     64restart:
     65	skipped = 0;
     66	next_index = 0;
     67	nr_found = 0;
     68
     69	while (1) {
     70		struct xfs_dquot *batch[XFS_DQ_LOOKUP_BATCH];
     71		int		error = 0;
     72		int		i;
     73
     74		mutex_lock(&qi->qi_tree_lock);
     75		nr_found = radix_tree_gang_lookup(tree, (void **)batch,
     76					next_index, XFS_DQ_LOOKUP_BATCH);
     77		if (!nr_found) {
     78			mutex_unlock(&qi->qi_tree_lock);
     79			break;
     80		}
     81
     82		for (i = 0; i < nr_found; i++) {
     83			struct xfs_dquot *dqp = batch[i];
     84
     85			next_index = dqp->q_id + 1;
     86
     87			error = execute(batch[i], data);
     88			if (error == -EAGAIN) {
     89				skipped++;
     90				continue;
     91			}
     92			if (error && last_error != -EFSCORRUPTED)
     93				last_error = error;
     94		}
     95
     96		mutex_unlock(&qi->qi_tree_lock);
     97
     98		/* bail out if the filesystem is corrupted.  */
     99		if (last_error == -EFSCORRUPTED) {
    100			skipped = 0;
    101			break;
    102		}
    103		/* we're done if id overflows back to zero */
    104		if (!next_index)
    105			break;
    106	}
    107
    108	if (skipped) {
    109		delay(1);
    110		goto restart;
    111	}
    112
    113	return last_error;
    114}
    115
    116
    117/*
    118 * Purge a dquot from all tracking data structures and free it.
    119 */
    120STATIC int
    121xfs_qm_dqpurge(
    122	struct xfs_dquot	*dqp,
    123	void			*data)
    124{
    125	struct xfs_quotainfo	*qi = dqp->q_mount->m_quotainfo;
    126	int			error = -EAGAIN;
    127
    128	xfs_dqlock(dqp);
    129	if ((dqp->q_flags & XFS_DQFLAG_FREEING) || dqp->q_nrefs != 0)
    130		goto out_unlock;
    131
    132	dqp->q_flags |= XFS_DQFLAG_FREEING;
    133
    134	xfs_dqflock(dqp);
    135
    136	/*
    137	 * If we are turning this type of quotas off, we don't care
    138	 * about the dirty metadata sitting in this dquot. OTOH, if
    139	 * we're unmounting, we do care, so we flush it and wait.
    140	 */
    141	if (XFS_DQ_IS_DIRTY(dqp)) {
    142		struct xfs_buf	*bp = NULL;
    143
    144		/*
    145		 * We don't care about getting disk errors here. We need
    146		 * to purge this dquot anyway, so we go ahead regardless.
    147		 */
    148		error = xfs_qm_dqflush(dqp, &bp);
    149		if (!error) {
    150			error = xfs_bwrite(bp);
    151			xfs_buf_relse(bp);
    152		} else if (error == -EAGAIN) {
    153			dqp->q_flags &= ~XFS_DQFLAG_FREEING;
    154			goto out_unlock;
    155		}
    156		xfs_dqflock(dqp);
    157	}
    158
    159	ASSERT(atomic_read(&dqp->q_pincount) == 0);
    160	ASSERT(xlog_is_shutdown(dqp->q_logitem.qli_item.li_log) ||
    161		!test_bit(XFS_LI_IN_AIL, &dqp->q_logitem.qli_item.li_flags));
    162
    163	xfs_dqfunlock(dqp);
    164	xfs_dqunlock(dqp);
    165
    166	radix_tree_delete(xfs_dquot_tree(qi, xfs_dquot_type(dqp)), dqp->q_id);
    167	qi->qi_dquots--;
    168
    169	/*
    170	 * We move dquots to the freelist as soon as their reference count
    171	 * hits zero, so it really should be on the freelist here.
    172	 */
    173	ASSERT(!list_empty(&dqp->q_lru));
    174	list_lru_del(&qi->qi_lru, &dqp->q_lru);
    175	XFS_STATS_DEC(dqp->q_mount, xs_qm_dquot_unused);
    176
    177	xfs_qm_dqdestroy(dqp);
    178	return 0;
    179
    180out_unlock:
    181	xfs_dqunlock(dqp);
    182	return error;
    183}
    184
    185/*
    186 * Purge the dquot cache.
    187 */
    188static void
    189xfs_qm_dqpurge_all(
    190	struct xfs_mount	*mp)
    191{
    192	xfs_qm_dquot_walk(mp, XFS_DQTYPE_USER, xfs_qm_dqpurge, NULL);
    193	xfs_qm_dquot_walk(mp, XFS_DQTYPE_GROUP, xfs_qm_dqpurge, NULL);
    194	xfs_qm_dquot_walk(mp, XFS_DQTYPE_PROJ, xfs_qm_dqpurge, NULL);
    195}
    196
    197/*
    198 * Just destroy the quotainfo structure.
    199 */
    200void
    201xfs_qm_unmount(
    202	struct xfs_mount	*mp)
    203{
    204	if (mp->m_quotainfo) {
    205		xfs_qm_dqpurge_all(mp);
    206		xfs_qm_destroy_quotainfo(mp);
    207	}
    208}
    209
    210/*
    211 * Called from the vfsops layer.
    212 */
    213void
    214xfs_qm_unmount_quotas(
    215	xfs_mount_t	*mp)
    216{
    217	/*
    218	 * Release the dquots that root inode, et al might be holding,
    219	 * before we flush quotas and blow away the quotainfo structure.
    220	 */
    221	ASSERT(mp->m_rootip);
    222	xfs_qm_dqdetach(mp->m_rootip);
    223	if (mp->m_rbmip)
    224		xfs_qm_dqdetach(mp->m_rbmip);
    225	if (mp->m_rsumip)
    226		xfs_qm_dqdetach(mp->m_rsumip);
    227
    228	/*
    229	 * Release the quota inodes.
    230	 */
    231	if (mp->m_quotainfo) {
    232		if (mp->m_quotainfo->qi_uquotaip) {
    233			xfs_irele(mp->m_quotainfo->qi_uquotaip);
    234			mp->m_quotainfo->qi_uquotaip = NULL;
    235		}
    236		if (mp->m_quotainfo->qi_gquotaip) {
    237			xfs_irele(mp->m_quotainfo->qi_gquotaip);
    238			mp->m_quotainfo->qi_gquotaip = NULL;
    239		}
    240		if (mp->m_quotainfo->qi_pquotaip) {
    241			xfs_irele(mp->m_quotainfo->qi_pquotaip);
    242			mp->m_quotainfo->qi_pquotaip = NULL;
    243		}
    244	}
    245}
    246
    247STATIC int
    248xfs_qm_dqattach_one(
    249	struct xfs_inode	*ip,
    250	xfs_dqtype_t		type,
    251	bool			doalloc,
    252	struct xfs_dquot	**IO_idqpp)
    253{
    254	struct xfs_dquot	*dqp;
    255	int			error;
    256
    257	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
    258	error = 0;
    259
    260	/*
    261	 * See if we already have it in the inode itself. IO_idqpp is &i_udquot
    262	 * or &i_gdquot. This made the code look weird, but made the logic a lot
    263	 * simpler.
    264	 */
    265	dqp = *IO_idqpp;
    266	if (dqp) {
    267		trace_xfs_dqattach_found(dqp);
    268		return 0;
    269	}
    270
    271	/*
    272	 * Find the dquot from somewhere. This bumps the reference count of
    273	 * dquot and returns it locked.  This can return ENOENT if dquot didn't
    274	 * exist on disk and we didn't ask it to allocate; ESRCH if quotas got
    275	 * turned off suddenly.
    276	 */
    277	error = xfs_qm_dqget_inode(ip, type, doalloc, &dqp);
    278	if (error)
    279		return error;
    280
    281	trace_xfs_dqattach_get(dqp);
    282
    283	/*
    284	 * dqget may have dropped and re-acquired the ilock, but it guarantees
    285	 * that the dquot returned is the one that should go in the inode.
    286	 */
    287	*IO_idqpp = dqp;
    288	xfs_dqunlock(dqp);
    289	return 0;
    290}
    291
    292static bool
    293xfs_qm_need_dqattach(
    294	struct xfs_inode	*ip)
    295{
    296	struct xfs_mount	*mp = ip->i_mount;
    297
    298	if (!XFS_IS_QUOTA_ON(mp))
    299		return false;
    300	if (!XFS_NOT_DQATTACHED(mp, ip))
    301		return false;
    302	if (xfs_is_quota_inode(&mp->m_sb, ip->i_ino))
    303		return false;
    304	return true;
    305}
    306
    307/*
    308 * Given a locked inode, attach dquot(s) to it, taking U/G/P-QUOTAON
    309 * into account.
    310 * If @doalloc is true, the dquot(s) will be allocated if needed.
    311 * Inode may get unlocked and relocked in here, and the caller must deal with
    312 * the consequences.
    313 */
    314int
    315xfs_qm_dqattach_locked(
    316	xfs_inode_t	*ip,
    317	bool		doalloc)
    318{
    319	xfs_mount_t	*mp = ip->i_mount;
    320	int		error = 0;
    321
    322	if (!xfs_qm_need_dqattach(ip))
    323		return 0;
    324
    325	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
    326
    327	if (XFS_IS_UQUOTA_ON(mp) && !ip->i_udquot) {
    328		error = xfs_qm_dqattach_one(ip, XFS_DQTYPE_USER,
    329				doalloc, &ip->i_udquot);
    330		if (error)
    331			goto done;
    332		ASSERT(ip->i_udquot);
    333	}
    334
    335	if (XFS_IS_GQUOTA_ON(mp) && !ip->i_gdquot) {
    336		error = xfs_qm_dqattach_one(ip, XFS_DQTYPE_GROUP,
    337				doalloc, &ip->i_gdquot);
    338		if (error)
    339			goto done;
    340		ASSERT(ip->i_gdquot);
    341	}
    342
    343	if (XFS_IS_PQUOTA_ON(mp) && !ip->i_pdquot) {
    344		error = xfs_qm_dqattach_one(ip, XFS_DQTYPE_PROJ,
    345				doalloc, &ip->i_pdquot);
    346		if (error)
    347			goto done;
    348		ASSERT(ip->i_pdquot);
    349	}
    350
    351done:
    352	/*
    353	 * Don't worry about the dquots that we may have attached before any
    354	 * error - they'll get detached later if it has not already been done.
    355	 */
    356	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
    357	return error;
    358}
    359
    360int
    361xfs_qm_dqattach(
    362	struct xfs_inode	*ip)
    363{
    364	int			error;
    365
    366	if (!xfs_qm_need_dqattach(ip))
    367		return 0;
    368
    369	xfs_ilock(ip, XFS_ILOCK_EXCL);
    370	error = xfs_qm_dqattach_locked(ip, false);
    371	xfs_iunlock(ip, XFS_ILOCK_EXCL);
    372
    373	return error;
    374}
    375
    376/*
    377 * Release dquots (and their references) if any.
    378 * The inode should be locked EXCL except when this's called by
    379 * xfs_ireclaim.
    380 */
    381void
    382xfs_qm_dqdetach(
    383	xfs_inode_t	*ip)
    384{
    385	if (!(ip->i_udquot || ip->i_gdquot || ip->i_pdquot))
    386		return;
    387
    388	trace_xfs_dquot_dqdetach(ip);
    389
    390	ASSERT(!xfs_is_quota_inode(&ip->i_mount->m_sb, ip->i_ino));
    391	if (ip->i_udquot) {
    392		xfs_qm_dqrele(ip->i_udquot);
    393		ip->i_udquot = NULL;
    394	}
    395	if (ip->i_gdquot) {
    396		xfs_qm_dqrele(ip->i_gdquot);
    397		ip->i_gdquot = NULL;
    398	}
    399	if (ip->i_pdquot) {
    400		xfs_qm_dqrele(ip->i_pdquot);
    401		ip->i_pdquot = NULL;
    402	}
    403}
    404
    405struct xfs_qm_isolate {
    406	struct list_head	buffers;
    407	struct list_head	dispose;
    408};
    409
    410static enum lru_status
    411xfs_qm_dquot_isolate(
    412	struct list_head	*item,
    413	struct list_lru_one	*lru,
    414	spinlock_t		*lru_lock,
    415	void			*arg)
    416		__releases(lru_lock) __acquires(lru_lock)
    417{
    418	struct xfs_dquot	*dqp = container_of(item,
    419						struct xfs_dquot, q_lru);
    420	struct xfs_qm_isolate	*isol = arg;
    421
    422	if (!xfs_dqlock_nowait(dqp))
    423		goto out_miss_busy;
    424
    425	/*
    426	 * This dquot has acquired a reference in the meantime remove it from
    427	 * the freelist and try again.
    428	 */
    429	if (dqp->q_nrefs) {
    430		xfs_dqunlock(dqp);
    431		XFS_STATS_INC(dqp->q_mount, xs_qm_dqwants);
    432
    433		trace_xfs_dqreclaim_want(dqp);
    434		list_lru_isolate(lru, &dqp->q_lru);
    435		XFS_STATS_DEC(dqp->q_mount, xs_qm_dquot_unused);
    436		return LRU_REMOVED;
    437	}
    438
    439	/*
    440	 * If the dquot is dirty, flush it. If it's already being flushed, just
    441	 * skip it so there is time for the IO to complete before we try to
    442	 * reclaim it again on the next LRU pass.
    443	 */
    444	if (!xfs_dqflock_nowait(dqp)) {
    445		xfs_dqunlock(dqp);
    446		goto out_miss_busy;
    447	}
    448
    449	if (XFS_DQ_IS_DIRTY(dqp)) {
    450		struct xfs_buf	*bp = NULL;
    451		int		error;
    452
    453		trace_xfs_dqreclaim_dirty(dqp);
    454
    455		/* we have to drop the LRU lock to flush the dquot */
    456		spin_unlock(lru_lock);
    457
    458		error = xfs_qm_dqflush(dqp, &bp);
    459		if (error)
    460			goto out_unlock_dirty;
    461
    462		xfs_buf_delwri_queue(bp, &isol->buffers);
    463		xfs_buf_relse(bp);
    464		goto out_unlock_dirty;
    465	}
    466	xfs_dqfunlock(dqp);
    467
    468	/*
    469	 * Prevent lookups now that we are past the point of no return.
    470	 */
    471	dqp->q_flags |= XFS_DQFLAG_FREEING;
    472	xfs_dqunlock(dqp);
    473
    474	ASSERT(dqp->q_nrefs == 0);
    475	list_lru_isolate_move(lru, &dqp->q_lru, &isol->dispose);
    476	XFS_STATS_DEC(dqp->q_mount, xs_qm_dquot_unused);
    477	trace_xfs_dqreclaim_done(dqp);
    478	XFS_STATS_INC(dqp->q_mount, xs_qm_dqreclaims);
    479	return LRU_REMOVED;
    480
    481out_miss_busy:
    482	trace_xfs_dqreclaim_busy(dqp);
    483	XFS_STATS_INC(dqp->q_mount, xs_qm_dqreclaim_misses);
    484	return LRU_SKIP;
    485
    486out_unlock_dirty:
    487	trace_xfs_dqreclaim_busy(dqp);
    488	XFS_STATS_INC(dqp->q_mount, xs_qm_dqreclaim_misses);
    489	xfs_dqunlock(dqp);
    490	spin_lock(lru_lock);
    491	return LRU_RETRY;
    492}
    493
    494static unsigned long
    495xfs_qm_shrink_scan(
    496	struct shrinker		*shrink,
    497	struct shrink_control	*sc)
    498{
    499	struct xfs_quotainfo	*qi = container_of(shrink,
    500					struct xfs_quotainfo, qi_shrinker);
    501	struct xfs_qm_isolate	isol;
    502	unsigned long		freed;
    503	int			error;
    504
    505	if ((sc->gfp_mask & (__GFP_FS|__GFP_DIRECT_RECLAIM)) != (__GFP_FS|__GFP_DIRECT_RECLAIM))
    506		return 0;
    507
    508	INIT_LIST_HEAD(&isol.buffers);
    509	INIT_LIST_HEAD(&isol.dispose);
    510
    511	freed = list_lru_shrink_walk(&qi->qi_lru, sc,
    512				     xfs_qm_dquot_isolate, &isol);
    513
    514	error = xfs_buf_delwri_submit(&isol.buffers);
    515	if (error)
    516		xfs_warn(NULL, "%s: dquot reclaim failed", __func__);
    517
    518	while (!list_empty(&isol.dispose)) {
    519		struct xfs_dquot	*dqp;
    520
    521		dqp = list_first_entry(&isol.dispose, struct xfs_dquot, q_lru);
    522		list_del_init(&dqp->q_lru);
    523		xfs_qm_dqfree_one(dqp);
    524	}
    525
    526	return freed;
    527}
    528
    529static unsigned long
    530xfs_qm_shrink_count(
    531	struct shrinker		*shrink,
    532	struct shrink_control	*sc)
    533{
    534	struct xfs_quotainfo	*qi = container_of(shrink,
    535					struct xfs_quotainfo, qi_shrinker);
    536
    537	return list_lru_shrink_count(&qi->qi_lru, sc);
    538}
    539
    540STATIC void
    541xfs_qm_set_defquota(
    542	struct xfs_mount	*mp,
    543	xfs_dqtype_t		type,
    544	struct xfs_quotainfo	*qinf)
    545{
    546	struct xfs_dquot	*dqp;
    547	struct xfs_def_quota	*defq;
    548	int			error;
    549
    550	error = xfs_qm_dqget_uncached(mp, 0, type, &dqp);
    551	if (error)
    552		return;
    553
    554	defq = xfs_get_defquota(qinf, xfs_dquot_type(dqp));
    555
    556	/*
    557	 * Timers and warnings have been already set, let's just set the
    558	 * default limits for this quota type
    559	 */
    560	defq->blk.hard = dqp->q_blk.hardlimit;
    561	defq->blk.soft = dqp->q_blk.softlimit;
    562	defq->ino.hard = dqp->q_ino.hardlimit;
    563	defq->ino.soft = dqp->q_ino.softlimit;
    564	defq->rtb.hard = dqp->q_rtb.hardlimit;
    565	defq->rtb.soft = dqp->q_rtb.softlimit;
    566	xfs_qm_dqdestroy(dqp);
    567}
    568
    569/* Initialize quota time limits from the root dquot. */
    570static void
    571xfs_qm_init_timelimits(
    572	struct xfs_mount	*mp,
    573	xfs_dqtype_t		type)
    574{
    575	struct xfs_quotainfo	*qinf = mp->m_quotainfo;
    576	struct xfs_def_quota	*defq;
    577	struct xfs_dquot	*dqp;
    578	int			error;
    579
    580	defq = xfs_get_defquota(qinf, type);
    581
    582	defq->blk.time = XFS_QM_BTIMELIMIT;
    583	defq->ino.time = XFS_QM_ITIMELIMIT;
    584	defq->rtb.time = XFS_QM_RTBTIMELIMIT;
    585
    586	/*
    587	 * We try to get the limits from the superuser's limits fields.
    588	 * This is quite hacky, but it is standard quota practice.
    589	 *
    590	 * Since we may not have done a quotacheck by this point, just read
    591	 * the dquot without attaching it to any hashtables or lists.
    592	 */
    593	error = xfs_qm_dqget_uncached(mp, 0, type, &dqp);
    594	if (error)
    595		return;
    596
    597	/*
    598	 * The warnings and timers set the grace period given to
    599	 * a user or group before he or she can not perform any
    600	 * more writing. If it is zero, a default is used.
    601	 */
    602	if (dqp->q_blk.timer)
    603		defq->blk.time = dqp->q_blk.timer;
    604	if (dqp->q_ino.timer)
    605		defq->ino.time = dqp->q_ino.timer;
    606	if (dqp->q_rtb.timer)
    607		defq->rtb.time = dqp->q_rtb.timer;
    608
    609	xfs_qm_dqdestroy(dqp);
    610}
    611
    612/*
    613 * This initializes all the quota information that's kept in the
    614 * mount structure
    615 */
    616STATIC int
    617xfs_qm_init_quotainfo(
    618	struct xfs_mount	*mp)
    619{
    620	struct xfs_quotainfo	*qinf;
    621	int			error;
    622
    623	ASSERT(XFS_IS_QUOTA_ON(mp));
    624
    625	qinf = mp->m_quotainfo = kmem_zalloc(sizeof(struct xfs_quotainfo), 0);
    626
    627	error = list_lru_init(&qinf->qi_lru);
    628	if (error)
    629		goto out_free_qinf;
    630
    631	/*
    632	 * See if quotainodes are setup, and if not, allocate them,
    633	 * and change the superblock accordingly.
    634	 */
    635	error = xfs_qm_init_quotainos(mp);
    636	if (error)
    637		goto out_free_lru;
    638
    639	INIT_RADIX_TREE(&qinf->qi_uquota_tree, GFP_NOFS);
    640	INIT_RADIX_TREE(&qinf->qi_gquota_tree, GFP_NOFS);
    641	INIT_RADIX_TREE(&qinf->qi_pquota_tree, GFP_NOFS);
    642	mutex_init(&qinf->qi_tree_lock);
    643
    644	/* mutex used to serialize quotaoffs */
    645	mutex_init(&qinf->qi_quotaofflock);
    646
    647	/* Precalc some constants */
    648	qinf->qi_dqchunklen = XFS_FSB_TO_BB(mp, XFS_DQUOT_CLUSTER_SIZE_FSB);
    649	qinf->qi_dqperchunk = xfs_calc_dquots_per_chunk(qinf->qi_dqchunklen);
    650	if (xfs_has_bigtime(mp)) {
    651		qinf->qi_expiry_min =
    652			xfs_dq_bigtime_to_unix(XFS_DQ_BIGTIME_EXPIRY_MIN);
    653		qinf->qi_expiry_max =
    654			xfs_dq_bigtime_to_unix(XFS_DQ_BIGTIME_EXPIRY_MAX);
    655	} else {
    656		qinf->qi_expiry_min = XFS_DQ_LEGACY_EXPIRY_MIN;
    657		qinf->qi_expiry_max = XFS_DQ_LEGACY_EXPIRY_MAX;
    658	}
    659	trace_xfs_quota_expiry_range(mp, qinf->qi_expiry_min,
    660			qinf->qi_expiry_max);
    661
    662	mp->m_qflags |= (mp->m_sb.sb_qflags & XFS_ALL_QUOTA_CHKD);
    663
    664	xfs_qm_init_timelimits(mp, XFS_DQTYPE_USER);
    665	xfs_qm_init_timelimits(mp, XFS_DQTYPE_GROUP);
    666	xfs_qm_init_timelimits(mp, XFS_DQTYPE_PROJ);
    667
    668	if (XFS_IS_UQUOTA_ON(mp))
    669		xfs_qm_set_defquota(mp, XFS_DQTYPE_USER, qinf);
    670	if (XFS_IS_GQUOTA_ON(mp))
    671		xfs_qm_set_defquota(mp, XFS_DQTYPE_GROUP, qinf);
    672	if (XFS_IS_PQUOTA_ON(mp))
    673		xfs_qm_set_defquota(mp, XFS_DQTYPE_PROJ, qinf);
    674
    675	qinf->qi_shrinker.count_objects = xfs_qm_shrink_count;
    676	qinf->qi_shrinker.scan_objects = xfs_qm_shrink_scan;
    677	qinf->qi_shrinker.seeks = DEFAULT_SEEKS;
    678	qinf->qi_shrinker.flags = SHRINKER_NUMA_AWARE;
    679
    680	error = register_shrinker(&qinf->qi_shrinker);
    681	if (error)
    682		goto out_free_inos;
    683
    684	return 0;
    685
    686out_free_inos:
    687	mutex_destroy(&qinf->qi_quotaofflock);
    688	mutex_destroy(&qinf->qi_tree_lock);
    689	xfs_qm_destroy_quotainos(qinf);
    690out_free_lru:
    691	list_lru_destroy(&qinf->qi_lru);
    692out_free_qinf:
    693	kmem_free(qinf);
    694	mp->m_quotainfo = NULL;
    695	return error;
    696}
    697
    698/*
    699 * Gets called when unmounting a filesystem or when all quotas get
    700 * turned off.
    701 * This purges the quota inodes, destroys locks and frees itself.
    702 */
    703void
    704xfs_qm_destroy_quotainfo(
    705	struct xfs_mount	*mp)
    706{
    707	struct xfs_quotainfo	*qi;
    708
    709	qi = mp->m_quotainfo;
    710	ASSERT(qi != NULL);
    711
    712	unregister_shrinker(&qi->qi_shrinker);
    713	list_lru_destroy(&qi->qi_lru);
    714	xfs_qm_destroy_quotainos(qi);
    715	mutex_destroy(&qi->qi_tree_lock);
    716	mutex_destroy(&qi->qi_quotaofflock);
    717	kmem_free(qi);
    718	mp->m_quotainfo = NULL;
    719}
    720
    721/*
    722 * Create an inode and return with a reference already taken, but unlocked
    723 * This is how we create quota inodes
    724 */
    725STATIC int
    726xfs_qm_qino_alloc(
    727	struct xfs_mount	*mp,
    728	struct xfs_inode	**ipp,
    729	unsigned int		flags)
    730{
    731	struct xfs_trans	*tp;
    732	int			error;
    733	bool			need_alloc = true;
    734
    735	*ipp = NULL;
    736	/*
    737	 * With superblock that doesn't have separate pquotino, we
    738	 * share an inode between gquota and pquota. If the on-disk
    739	 * superblock has GQUOTA and the filesystem is now mounted
    740	 * with PQUOTA, just use sb_gquotino for sb_pquotino and
    741	 * vice-versa.
    742	 */
    743	if (!xfs_has_pquotino(mp) &&
    744			(flags & (XFS_QMOPT_PQUOTA|XFS_QMOPT_GQUOTA))) {
    745		xfs_ino_t ino = NULLFSINO;
    746
    747		if ((flags & XFS_QMOPT_PQUOTA) &&
    748			     (mp->m_sb.sb_gquotino != NULLFSINO)) {
    749			ino = mp->m_sb.sb_gquotino;
    750			if (XFS_IS_CORRUPT(mp,
    751					   mp->m_sb.sb_pquotino != NULLFSINO))
    752				return -EFSCORRUPTED;
    753		} else if ((flags & XFS_QMOPT_GQUOTA) &&
    754			     (mp->m_sb.sb_pquotino != NULLFSINO)) {
    755			ino = mp->m_sb.sb_pquotino;
    756			if (XFS_IS_CORRUPT(mp,
    757					   mp->m_sb.sb_gquotino != NULLFSINO))
    758				return -EFSCORRUPTED;
    759		}
    760		if (ino != NULLFSINO) {
    761			error = xfs_iget(mp, NULL, ino, 0, 0, ipp);
    762			if (error)
    763				return error;
    764			mp->m_sb.sb_gquotino = NULLFSINO;
    765			mp->m_sb.sb_pquotino = NULLFSINO;
    766			need_alloc = false;
    767		}
    768	}
    769
    770	error = xfs_trans_alloc(mp, &M_RES(mp)->tr_create,
    771			need_alloc ? XFS_QM_QINOCREATE_SPACE_RES(mp) : 0,
    772			0, 0, &tp);
    773	if (error)
    774		return error;
    775
    776	if (need_alloc) {
    777		xfs_ino_t	ino;
    778
    779		error = xfs_dialloc(&tp, 0, S_IFREG, &ino);
    780		if (!error)
    781			error = xfs_init_new_inode(&init_user_ns, tp, NULL, ino,
    782					S_IFREG, 1, 0, 0, false, ipp);
    783		if (error) {
    784			xfs_trans_cancel(tp);
    785			return error;
    786		}
    787	}
    788
    789	/*
    790	 * Make the changes in the superblock, and log those too.
    791	 * sbfields arg may contain fields other than *QUOTINO;
    792	 * VERSIONNUM for example.
    793	 */
    794	spin_lock(&mp->m_sb_lock);
    795	if (flags & XFS_QMOPT_SBVERSION) {
    796		ASSERT(!xfs_has_quota(mp));
    797
    798		xfs_add_quota(mp);
    799		mp->m_sb.sb_uquotino = NULLFSINO;
    800		mp->m_sb.sb_gquotino = NULLFSINO;
    801		mp->m_sb.sb_pquotino = NULLFSINO;
    802
    803		/* qflags will get updated fully _after_ quotacheck */
    804		mp->m_sb.sb_qflags = mp->m_qflags & XFS_ALL_QUOTA_ACCT;
    805	}
    806	if (flags & XFS_QMOPT_UQUOTA)
    807		mp->m_sb.sb_uquotino = (*ipp)->i_ino;
    808	else if (flags & XFS_QMOPT_GQUOTA)
    809		mp->m_sb.sb_gquotino = (*ipp)->i_ino;
    810	else
    811		mp->m_sb.sb_pquotino = (*ipp)->i_ino;
    812	spin_unlock(&mp->m_sb_lock);
    813	xfs_log_sb(tp);
    814
    815	error = xfs_trans_commit(tp);
    816	if (error) {
    817		ASSERT(xfs_is_shutdown(mp));
    818		xfs_alert(mp, "%s failed (error %d)!", __func__, error);
    819	}
    820	if (need_alloc)
    821		xfs_finish_inode_setup(*ipp);
    822	return error;
    823}
    824
    825
    826STATIC void
    827xfs_qm_reset_dqcounts(
    828	struct xfs_mount	*mp,
    829	struct xfs_buf		*bp,
    830	xfs_dqid_t		id,
    831	xfs_dqtype_t		type)
    832{
    833	struct xfs_dqblk	*dqb;
    834	int			j;
    835
    836	trace_xfs_reset_dqcounts(bp, _RET_IP_);
    837
    838	/*
    839	 * Reset all counters and timers. They'll be
    840	 * started afresh by xfs_qm_quotacheck.
    841	 */
    842#ifdef DEBUG
    843	j = (int)XFS_FSB_TO_B(mp, XFS_DQUOT_CLUSTER_SIZE_FSB) /
    844		sizeof(struct xfs_dqblk);
    845	ASSERT(mp->m_quotainfo->qi_dqperchunk == j);
    846#endif
    847	dqb = bp->b_addr;
    848	for (j = 0; j < mp->m_quotainfo->qi_dqperchunk; j++) {
    849		struct xfs_disk_dquot	*ddq;
    850
    851		ddq = (struct xfs_disk_dquot *)&dqb[j];
    852
    853		/*
    854		 * Do a sanity check, and if needed, repair the dqblk. Don't
    855		 * output any warnings because it's perfectly possible to
    856		 * find uninitialised dquot blks. See comment in
    857		 * xfs_dquot_verify.
    858		 */
    859		if (xfs_dqblk_verify(mp, &dqb[j], id + j) ||
    860		    (dqb[j].dd_diskdq.d_type & XFS_DQTYPE_REC_MASK) != type)
    861			xfs_dqblk_repair(mp, &dqb[j], id + j, type);
    862
    863		/*
    864		 * Reset type in case we are reusing group quota file for
    865		 * project quotas or vice versa
    866		 */
    867		ddq->d_type = type;
    868		ddq->d_bcount = 0;
    869		ddq->d_icount = 0;
    870		ddq->d_rtbcount = 0;
    871
    872		/*
    873		 * dquot id 0 stores the default grace period and the maximum
    874		 * warning limit that were set by the administrator, so we
    875		 * should not reset them.
    876		 */
    877		if (ddq->d_id != 0) {
    878			ddq->d_btimer = 0;
    879			ddq->d_itimer = 0;
    880			ddq->d_rtbtimer = 0;
    881			ddq->d_bwarns = 0;
    882			ddq->d_iwarns = 0;
    883			ddq->d_rtbwarns = 0;
    884			if (xfs_has_bigtime(mp))
    885				ddq->d_type |= XFS_DQTYPE_BIGTIME;
    886		}
    887
    888		if (xfs_has_crc(mp)) {
    889			xfs_update_cksum((char *)&dqb[j],
    890					 sizeof(struct xfs_dqblk),
    891					 XFS_DQUOT_CRC_OFF);
    892		}
    893	}
    894}
    895
    896STATIC int
    897xfs_qm_reset_dqcounts_all(
    898	struct xfs_mount	*mp,
    899	xfs_dqid_t		firstid,
    900	xfs_fsblock_t		bno,
    901	xfs_filblks_t		blkcnt,
    902	xfs_dqtype_t		type,
    903	struct list_head	*buffer_list)
    904{
    905	struct xfs_buf		*bp;
    906	int			error = 0;
    907
    908	ASSERT(blkcnt > 0);
    909
    910	/*
    911	 * Blkcnt arg can be a very big number, and might even be
    912	 * larger than the log itself. So, we have to break it up into
    913	 * manageable-sized transactions.
    914	 * Note that we don't start a permanent transaction here; we might
    915	 * not be able to get a log reservation for the whole thing up front,
    916	 * and we don't really care to either, because we just discard
    917	 * everything if we were to crash in the middle of this loop.
    918	 */
    919	while (blkcnt--) {
    920		error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp,
    921			      XFS_FSB_TO_DADDR(mp, bno),
    922			      mp->m_quotainfo->qi_dqchunklen, 0, &bp,
    923			      &xfs_dquot_buf_ops);
    924
    925		/*
    926		 * CRC and validation errors will return a EFSCORRUPTED here. If
    927		 * this occurs, re-read without CRC validation so that we can
    928		 * repair the damage via xfs_qm_reset_dqcounts(). This process
    929		 * will leave a trace in the log indicating corruption has
    930		 * been detected.
    931		 */
    932		if (error == -EFSCORRUPTED) {
    933			error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp,
    934				      XFS_FSB_TO_DADDR(mp, bno),
    935				      mp->m_quotainfo->qi_dqchunklen, 0, &bp,
    936				      NULL);
    937		}
    938
    939		if (error)
    940			break;
    941
    942		/*
    943		 * A corrupt buffer might not have a verifier attached, so
    944		 * make sure we have the correct one attached before writeback
    945		 * occurs.
    946		 */
    947		bp->b_ops = &xfs_dquot_buf_ops;
    948		xfs_qm_reset_dqcounts(mp, bp, firstid, type);
    949		xfs_buf_delwri_queue(bp, buffer_list);
    950		xfs_buf_relse(bp);
    951
    952		/* goto the next block. */
    953		bno++;
    954		firstid += mp->m_quotainfo->qi_dqperchunk;
    955	}
    956
    957	return error;
    958}
    959
    960/*
    961 * Iterate over all allocated dquot blocks in this quota inode, zeroing all
    962 * counters for every chunk of dquots that we find.
    963 */
    964STATIC int
    965xfs_qm_reset_dqcounts_buf(
    966	struct xfs_mount	*mp,
    967	struct xfs_inode	*qip,
    968	xfs_dqtype_t		type,
    969	struct list_head	*buffer_list)
    970{
    971	struct xfs_bmbt_irec	*map;
    972	int			i, nmaps;	/* number of map entries */
    973	int			error;		/* return value */
    974	xfs_fileoff_t		lblkno;
    975	xfs_filblks_t		maxlblkcnt;
    976	xfs_dqid_t		firstid;
    977	xfs_fsblock_t		rablkno;
    978	xfs_filblks_t		rablkcnt;
    979
    980	error = 0;
    981	/*
    982	 * This looks racy, but we can't keep an inode lock across a
    983	 * trans_reserve. But, this gets called during quotacheck, and that
    984	 * happens only at mount time which is single threaded.
    985	 */
    986	if (qip->i_nblocks == 0)
    987		return 0;
    988
    989	map = kmem_alloc(XFS_DQITER_MAP_SIZE * sizeof(*map), 0);
    990
    991	lblkno = 0;
    992	maxlblkcnt = XFS_B_TO_FSB(mp, mp->m_super->s_maxbytes);
    993	do {
    994		uint		lock_mode;
    995
    996		nmaps = XFS_DQITER_MAP_SIZE;
    997		/*
    998		 * We aren't changing the inode itself. Just changing
    999		 * some of its data. No new blocks are added here, and
   1000		 * the inode is never added to the transaction.
   1001		 */
   1002		lock_mode = xfs_ilock_data_map_shared(qip);
   1003		error = xfs_bmapi_read(qip, lblkno, maxlblkcnt - lblkno,
   1004				       map, &nmaps, 0);
   1005		xfs_iunlock(qip, lock_mode);
   1006		if (error)
   1007			break;
   1008
   1009		ASSERT(nmaps <= XFS_DQITER_MAP_SIZE);
   1010		for (i = 0; i < nmaps; i++) {
   1011			ASSERT(map[i].br_startblock != DELAYSTARTBLOCK);
   1012			ASSERT(map[i].br_blockcount);
   1013
   1014
   1015			lblkno += map[i].br_blockcount;
   1016
   1017			if (map[i].br_startblock == HOLESTARTBLOCK)
   1018				continue;
   1019
   1020			firstid = (xfs_dqid_t) map[i].br_startoff *
   1021				mp->m_quotainfo->qi_dqperchunk;
   1022			/*
   1023			 * Do a read-ahead on the next extent.
   1024			 */
   1025			if ((i+1 < nmaps) &&
   1026			    (map[i+1].br_startblock != HOLESTARTBLOCK)) {
   1027				rablkcnt =  map[i+1].br_blockcount;
   1028				rablkno = map[i+1].br_startblock;
   1029				while (rablkcnt--) {
   1030					xfs_buf_readahead(mp->m_ddev_targp,
   1031					       XFS_FSB_TO_DADDR(mp, rablkno),
   1032					       mp->m_quotainfo->qi_dqchunklen,
   1033					       &xfs_dquot_buf_ops);
   1034					rablkno++;
   1035				}
   1036			}
   1037			/*
   1038			 * Iterate thru all the blks in the extent and
   1039			 * reset the counters of all the dquots inside them.
   1040			 */
   1041			error = xfs_qm_reset_dqcounts_all(mp, firstid,
   1042						   map[i].br_startblock,
   1043						   map[i].br_blockcount,
   1044						   type, buffer_list);
   1045			if (error)
   1046				goto out;
   1047		}
   1048	} while (nmaps > 0);
   1049
   1050out:
   1051	kmem_free(map);
   1052	return error;
   1053}
   1054
   1055/*
   1056 * Called by dqusage_adjust in doing a quotacheck.
   1057 *
   1058 * Given the inode, and a dquot id this updates both the incore dqout as well
   1059 * as the buffer copy. This is so that once the quotacheck is done, we can
   1060 * just log all the buffers, as opposed to logging numerous updates to
   1061 * individual dquots.
   1062 */
   1063STATIC int
   1064xfs_qm_quotacheck_dqadjust(
   1065	struct xfs_inode	*ip,
   1066	xfs_dqtype_t		type,
   1067	xfs_qcnt_t		nblks,
   1068	xfs_qcnt_t		rtblks)
   1069{
   1070	struct xfs_mount	*mp = ip->i_mount;
   1071	struct xfs_dquot	*dqp;
   1072	xfs_dqid_t		id;
   1073	int			error;
   1074
   1075	id = xfs_qm_id_for_quotatype(ip, type);
   1076	error = xfs_qm_dqget(mp, id, type, true, &dqp);
   1077	if (error) {
   1078		/*
   1079		 * Shouldn't be able to turn off quotas here.
   1080		 */
   1081		ASSERT(error != -ESRCH);
   1082		ASSERT(error != -ENOENT);
   1083		return error;
   1084	}
   1085
   1086	trace_xfs_dqadjust(dqp);
   1087
   1088	/*
   1089	 * Adjust the inode count and the block count to reflect this inode's
   1090	 * resource usage.
   1091	 */
   1092	dqp->q_ino.count++;
   1093	dqp->q_ino.reserved++;
   1094	if (nblks) {
   1095		dqp->q_blk.count += nblks;
   1096		dqp->q_blk.reserved += nblks;
   1097	}
   1098	if (rtblks) {
   1099		dqp->q_rtb.count += rtblks;
   1100		dqp->q_rtb.reserved += rtblks;
   1101	}
   1102
   1103	/*
   1104	 * Set default limits, adjust timers (since we changed usages)
   1105	 *
   1106	 * There are no timers for the default values set in the root dquot.
   1107	 */
   1108	if (dqp->q_id) {
   1109		xfs_qm_adjust_dqlimits(dqp);
   1110		xfs_qm_adjust_dqtimers(dqp);
   1111	}
   1112
   1113	dqp->q_flags |= XFS_DQFLAG_DIRTY;
   1114	xfs_qm_dqput(dqp);
   1115	return 0;
   1116}
   1117
   1118/*
   1119 * callback routine supplied to bulkstat(). Given an inumber, find its
   1120 * dquots and update them to account for resources taken by that inode.
   1121 */
   1122/* ARGSUSED */
   1123STATIC int
   1124xfs_qm_dqusage_adjust(
   1125	struct xfs_mount	*mp,
   1126	struct xfs_trans	*tp,
   1127	xfs_ino_t		ino,
   1128	void			*data)
   1129{
   1130	struct xfs_inode	*ip;
   1131	xfs_qcnt_t		nblks;
   1132	xfs_filblks_t		rtblks = 0;	/* total rt blks */
   1133	int			error;
   1134
   1135	ASSERT(XFS_IS_QUOTA_ON(mp));
   1136
   1137	/*
   1138	 * rootino must have its resources accounted for, not so with the quota
   1139	 * inodes.
   1140	 */
   1141	if (xfs_is_quota_inode(&mp->m_sb, ino))
   1142		return 0;
   1143
   1144	/*
   1145	 * We don't _need_ to take the ilock EXCL here because quotacheck runs
   1146	 * at mount time and therefore nobody will be racing chown/chproj.
   1147	 */
   1148	error = xfs_iget(mp, tp, ino, XFS_IGET_DONTCACHE, 0, &ip);
   1149	if (error == -EINVAL || error == -ENOENT)
   1150		return 0;
   1151	if (error)
   1152		return error;
   1153
   1154	ASSERT(ip->i_delayed_blks == 0);
   1155
   1156	if (XFS_IS_REALTIME_INODE(ip)) {
   1157		struct xfs_ifork	*ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK);
   1158
   1159		error = xfs_iread_extents(tp, ip, XFS_DATA_FORK);
   1160		if (error)
   1161			goto error0;
   1162
   1163		xfs_bmap_count_leaves(ifp, &rtblks);
   1164	}
   1165
   1166	nblks = (xfs_qcnt_t)ip->i_nblocks - rtblks;
   1167
   1168	/*
   1169	 * Add the (disk blocks and inode) resources occupied by this
   1170	 * inode to its dquots. We do this adjustment in the incore dquot,
   1171	 * and also copy the changes to its buffer.
   1172	 * We don't care about putting these changes in a transaction
   1173	 * envelope because if we crash in the middle of a 'quotacheck'
   1174	 * we have to start from the beginning anyway.
   1175	 * Once we're done, we'll log all the dquot bufs.
   1176	 *
   1177	 * The *QUOTA_ON checks below may look pretty racy, but quotachecks
   1178	 * and quotaoffs don't race. (Quotachecks happen at mount time only).
   1179	 */
   1180	if (XFS_IS_UQUOTA_ON(mp)) {
   1181		error = xfs_qm_quotacheck_dqadjust(ip, XFS_DQTYPE_USER, nblks,
   1182				rtblks);
   1183		if (error)
   1184			goto error0;
   1185	}
   1186
   1187	if (XFS_IS_GQUOTA_ON(mp)) {
   1188		error = xfs_qm_quotacheck_dqadjust(ip, XFS_DQTYPE_GROUP, nblks,
   1189				rtblks);
   1190		if (error)
   1191			goto error0;
   1192	}
   1193
   1194	if (XFS_IS_PQUOTA_ON(mp)) {
   1195		error = xfs_qm_quotacheck_dqadjust(ip, XFS_DQTYPE_PROJ, nblks,
   1196				rtblks);
   1197		if (error)
   1198			goto error0;
   1199	}
   1200
   1201error0:
   1202	xfs_irele(ip);
   1203	return error;
   1204}
   1205
   1206STATIC int
   1207xfs_qm_flush_one(
   1208	struct xfs_dquot	*dqp,
   1209	void			*data)
   1210{
   1211	struct xfs_mount	*mp = dqp->q_mount;
   1212	struct list_head	*buffer_list = data;
   1213	struct xfs_buf		*bp = NULL;
   1214	int			error = 0;
   1215
   1216	xfs_dqlock(dqp);
   1217	if (dqp->q_flags & XFS_DQFLAG_FREEING)
   1218		goto out_unlock;
   1219	if (!XFS_DQ_IS_DIRTY(dqp))
   1220		goto out_unlock;
   1221
   1222	/*
   1223	 * The only way the dquot is already flush locked by the time quotacheck
   1224	 * gets here is if reclaim flushed it before the dqadjust walk dirtied
   1225	 * it for the final time. Quotacheck collects all dquot bufs in the
   1226	 * local delwri queue before dquots are dirtied, so reclaim can't have
   1227	 * possibly queued it for I/O. The only way out is to push the buffer to
   1228	 * cycle the flush lock.
   1229	 */
   1230	if (!xfs_dqflock_nowait(dqp)) {
   1231		/* buf is pinned in-core by delwri list */
   1232		bp = xfs_buf_incore(mp->m_ddev_targp, dqp->q_blkno,
   1233				mp->m_quotainfo->qi_dqchunklen, 0);
   1234		if (!bp) {
   1235			error = -EINVAL;
   1236			goto out_unlock;
   1237		}
   1238		xfs_buf_unlock(bp);
   1239
   1240		xfs_buf_delwri_pushbuf(bp, buffer_list);
   1241		xfs_buf_rele(bp);
   1242
   1243		error = -EAGAIN;
   1244		goto out_unlock;
   1245	}
   1246
   1247	error = xfs_qm_dqflush(dqp, &bp);
   1248	if (error)
   1249		goto out_unlock;
   1250
   1251	xfs_buf_delwri_queue(bp, buffer_list);
   1252	xfs_buf_relse(bp);
   1253out_unlock:
   1254	xfs_dqunlock(dqp);
   1255	return error;
   1256}
   1257
   1258/*
   1259 * Walk thru all the filesystem inodes and construct a consistent view
   1260 * of the disk quota world. If the quotacheck fails, disable quotas.
   1261 */
   1262STATIC int
   1263xfs_qm_quotacheck(
   1264	xfs_mount_t	*mp)
   1265{
   1266	int			error, error2;
   1267	uint			flags;
   1268	LIST_HEAD		(buffer_list);
   1269	struct xfs_inode	*uip = mp->m_quotainfo->qi_uquotaip;
   1270	struct xfs_inode	*gip = mp->m_quotainfo->qi_gquotaip;
   1271	struct xfs_inode	*pip = mp->m_quotainfo->qi_pquotaip;
   1272
   1273	flags = 0;
   1274
   1275	ASSERT(uip || gip || pip);
   1276	ASSERT(XFS_IS_QUOTA_ON(mp));
   1277
   1278	xfs_notice(mp, "Quotacheck needed: Please wait.");
   1279
   1280	/*
   1281	 * First we go thru all the dquots on disk, USR and GRP/PRJ, and reset
   1282	 * their counters to zero. We need a clean slate.
   1283	 * We don't log our changes till later.
   1284	 */
   1285	if (uip) {
   1286		error = xfs_qm_reset_dqcounts_buf(mp, uip, XFS_DQTYPE_USER,
   1287					 &buffer_list);
   1288		if (error)
   1289			goto error_return;
   1290		flags |= XFS_UQUOTA_CHKD;
   1291	}
   1292
   1293	if (gip) {
   1294		error = xfs_qm_reset_dqcounts_buf(mp, gip, XFS_DQTYPE_GROUP,
   1295					 &buffer_list);
   1296		if (error)
   1297			goto error_return;
   1298		flags |= XFS_GQUOTA_CHKD;
   1299	}
   1300
   1301	if (pip) {
   1302		error = xfs_qm_reset_dqcounts_buf(mp, pip, XFS_DQTYPE_PROJ,
   1303					 &buffer_list);
   1304		if (error)
   1305			goto error_return;
   1306		flags |= XFS_PQUOTA_CHKD;
   1307	}
   1308
   1309	error = xfs_iwalk_threaded(mp, 0, 0, xfs_qm_dqusage_adjust, 0, true,
   1310			NULL);
   1311	if (error) {
   1312		/*
   1313		 * The inode walk may have partially populated the dquot
   1314		 * caches.  We must purge them before disabling quota and
   1315		 * tearing down the quotainfo, or else the dquots will leak.
   1316		 */
   1317		xfs_qm_dqpurge_all(mp);
   1318		goto error_return;
   1319	}
   1320
   1321	/*
   1322	 * We've made all the changes that we need to make incore.  Flush them
   1323	 * down to disk buffers if everything was updated successfully.
   1324	 */
   1325	if (XFS_IS_UQUOTA_ON(mp)) {
   1326		error = xfs_qm_dquot_walk(mp, XFS_DQTYPE_USER, xfs_qm_flush_one,
   1327					  &buffer_list);
   1328	}
   1329	if (XFS_IS_GQUOTA_ON(mp)) {
   1330		error2 = xfs_qm_dquot_walk(mp, XFS_DQTYPE_GROUP, xfs_qm_flush_one,
   1331					   &buffer_list);
   1332		if (!error)
   1333			error = error2;
   1334	}
   1335	if (XFS_IS_PQUOTA_ON(mp)) {
   1336		error2 = xfs_qm_dquot_walk(mp, XFS_DQTYPE_PROJ, xfs_qm_flush_one,
   1337					   &buffer_list);
   1338		if (!error)
   1339			error = error2;
   1340	}
   1341
   1342	error2 = xfs_buf_delwri_submit(&buffer_list);
   1343	if (!error)
   1344		error = error2;
   1345
   1346	/*
   1347	 * We can get this error if we couldn't do a dquot allocation inside
   1348	 * xfs_qm_dqusage_adjust (via bulkstat). We don't care about the
   1349	 * dirty dquots that might be cached, we just want to get rid of them
   1350	 * and turn quotaoff. The dquots won't be attached to any of the inodes
   1351	 * at this point (because we intentionally didn't in dqget_noattach).
   1352	 */
   1353	if (error) {
   1354		xfs_qm_dqpurge_all(mp);
   1355		goto error_return;
   1356	}
   1357
   1358	/*
   1359	 * If one type of quotas is off, then it will lose its
   1360	 * quotachecked status, since we won't be doing accounting for
   1361	 * that type anymore.
   1362	 */
   1363	mp->m_qflags &= ~XFS_ALL_QUOTA_CHKD;
   1364	mp->m_qflags |= flags;
   1365
   1366 error_return:
   1367	xfs_buf_delwri_cancel(&buffer_list);
   1368
   1369	if (error) {
   1370		xfs_warn(mp,
   1371	"Quotacheck: Unsuccessful (Error %d): Disabling quotas.",
   1372			error);
   1373		/*
   1374		 * We must turn off quotas.
   1375		 */
   1376		ASSERT(mp->m_quotainfo != NULL);
   1377		xfs_qm_destroy_quotainfo(mp);
   1378		if (xfs_mount_reset_sbqflags(mp)) {
   1379			xfs_warn(mp,
   1380				"Quotacheck: Failed to reset quota flags.");
   1381		}
   1382	} else
   1383		xfs_notice(mp, "Quotacheck: Done.");
   1384	return error;
   1385}
   1386
   1387/*
   1388 * This is called from xfs_mountfs to start quotas and initialize all
   1389 * necessary data structures like quotainfo.  This is also responsible for
   1390 * running a quotacheck as necessary.  We are guaranteed that the superblock
   1391 * is consistently read in at this point.
   1392 *
   1393 * If we fail here, the mount will continue with quota turned off. We don't
   1394 * need to inidicate success or failure at all.
   1395 */
   1396void
   1397xfs_qm_mount_quotas(
   1398	struct xfs_mount	*mp)
   1399{
   1400	int			error = 0;
   1401	uint			sbf;
   1402
   1403	/*
   1404	 * If quotas on realtime volumes is not supported, we disable
   1405	 * quotas immediately.
   1406	 */
   1407	if (mp->m_sb.sb_rextents) {
   1408		xfs_notice(mp, "Cannot turn on quotas for realtime filesystem");
   1409		mp->m_qflags = 0;
   1410		goto write_changes;
   1411	}
   1412
   1413	ASSERT(XFS_IS_QUOTA_ON(mp));
   1414
   1415	/*
   1416	 * Allocate the quotainfo structure inside the mount struct, and
   1417	 * create quotainode(s), and change/rev superblock if necessary.
   1418	 */
   1419	error = xfs_qm_init_quotainfo(mp);
   1420	if (error) {
   1421		/*
   1422		 * We must turn off quotas.
   1423		 */
   1424		ASSERT(mp->m_quotainfo == NULL);
   1425		mp->m_qflags = 0;
   1426		goto write_changes;
   1427	}
   1428	/*
   1429	 * If any of the quotas are not consistent, do a quotacheck.
   1430	 */
   1431	if (XFS_QM_NEED_QUOTACHECK(mp)) {
   1432		error = xfs_qm_quotacheck(mp);
   1433		if (error) {
   1434			/* Quotacheck failed and disabled quotas. */
   1435			return;
   1436		}
   1437	}
   1438	/*
   1439	 * If one type of quotas is off, then it will lose its
   1440	 * quotachecked status, since we won't be doing accounting for
   1441	 * that type anymore.
   1442	 */
   1443	if (!XFS_IS_UQUOTA_ON(mp))
   1444		mp->m_qflags &= ~XFS_UQUOTA_CHKD;
   1445	if (!XFS_IS_GQUOTA_ON(mp))
   1446		mp->m_qflags &= ~XFS_GQUOTA_CHKD;
   1447	if (!XFS_IS_PQUOTA_ON(mp))
   1448		mp->m_qflags &= ~XFS_PQUOTA_CHKD;
   1449
   1450 write_changes:
   1451	/*
   1452	 * We actually don't have to acquire the m_sb_lock at all.
   1453	 * This can only be called from mount, and that's single threaded. XXX
   1454	 */
   1455	spin_lock(&mp->m_sb_lock);
   1456	sbf = mp->m_sb.sb_qflags;
   1457	mp->m_sb.sb_qflags = mp->m_qflags & XFS_MOUNT_QUOTA_ALL;
   1458	spin_unlock(&mp->m_sb_lock);
   1459
   1460	if (sbf != (mp->m_qflags & XFS_MOUNT_QUOTA_ALL)) {
   1461		if (xfs_sync_sb(mp, false)) {
   1462			/*
   1463			 * We could only have been turning quotas off.
   1464			 * We aren't in very good shape actually because
   1465			 * the incore structures are convinced that quotas are
   1466			 * off, but the on disk superblock doesn't know that !
   1467			 */
   1468			ASSERT(!(XFS_IS_QUOTA_ON(mp)));
   1469			xfs_alert(mp, "%s: Superblock update failed!",
   1470				__func__);
   1471		}
   1472	}
   1473
   1474	if (error) {
   1475		xfs_warn(mp, "Failed to initialize disk quotas.");
   1476		return;
   1477	}
   1478}
   1479
   1480/*
   1481 * This is called after the superblock has been read in and we're ready to
   1482 * iget the quota inodes.
   1483 */
   1484STATIC int
   1485xfs_qm_init_quotainos(
   1486	xfs_mount_t	*mp)
   1487{
   1488	struct xfs_inode	*uip = NULL;
   1489	struct xfs_inode	*gip = NULL;
   1490	struct xfs_inode	*pip = NULL;
   1491	int			error;
   1492	uint			flags = 0;
   1493
   1494	ASSERT(mp->m_quotainfo);
   1495
   1496	/*
   1497	 * Get the uquota and gquota inodes
   1498	 */
   1499	if (xfs_has_quota(mp)) {
   1500		if (XFS_IS_UQUOTA_ON(mp) &&
   1501		    mp->m_sb.sb_uquotino != NULLFSINO) {
   1502			ASSERT(mp->m_sb.sb_uquotino > 0);
   1503			error = xfs_iget(mp, NULL, mp->m_sb.sb_uquotino,
   1504					     0, 0, &uip);
   1505			if (error)
   1506				return error;
   1507		}
   1508		if (XFS_IS_GQUOTA_ON(mp) &&
   1509		    mp->m_sb.sb_gquotino != NULLFSINO) {
   1510			ASSERT(mp->m_sb.sb_gquotino > 0);
   1511			error = xfs_iget(mp, NULL, mp->m_sb.sb_gquotino,
   1512					     0, 0, &gip);
   1513			if (error)
   1514				goto error_rele;
   1515		}
   1516		if (XFS_IS_PQUOTA_ON(mp) &&
   1517		    mp->m_sb.sb_pquotino != NULLFSINO) {
   1518			ASSERT(mp->m_sb.sb_pquotino > 0);
   1519			error = xfs_iget(mp, NULL, mp->m_sb.sb_pquotino,
   1520					     0, 0, &pip);
   1521			if (error)
   1522				goto error_rele;
   1523		}
   1524	} else {
   1525		flags |= XFS_QMOPT_SBVERSION;
   1526	}
   1527
   1528	/*
   1529	 * Create the three inodes, if they don't exist already. The changes
   1530	 * made above will get added to a transaction and logged in one of
   1531	 * the qino_alloc calls below.  If the device is readonly,
   1532	 * temporarily switch to read-write to do this.
   1533	 */
   1534	if (XFS_IS_UQUOTA_ON(mp) && uip == NULL) {
   1535		error = xfs_qm_qino_alloc(mp, &uip,
   1536					      flags | XFS_QMOPT_UQUOTA);
   1537		if (error)
   1538			goto error_rele;
   1539
   1540		flags &= ~XFS_QMOPT_SBVERSION;
   1541	}
   1542	if (XFS_IS_GQUOTA_ON(mp) && gip == NULL) {
   1543		error = xfs_qm_qino_alloc(mp, &gip,
   1544					  flags | XFS_QMOPT_GQUOTA);
   1545		if (error)
   1546			goto error_rele;
   1547
   1548		flags &= ~XFS_QMOPT_SBVERSION;
   1549	}
   1550	if (XFS_IS_PQUOTA_ON(mp) && pip == NULL) {
   1551		error = xfs_qm_qino_alloc(mp, &pip,
   1552					  flags | XFS_QMOPT_PQUOTA);
   1553		if (error)
   1554			goto error_rele;
   1555	}
   1556
   1557	mp->m_quotainfo->qi_uquotaip = uip;
   1558	mp->m_quotainfo->qi_gquotaip = gip;
   1559	mp->m_quotainfo->qi_pquotaip = pip;
   1560
   1561	return 0;
   1562
   1563error_rele:
   1564	if (uip)
   1565		xfs_irele(uip);
   1566	if (gip)
   1567		xfs_irele(gip);
   1568	if (pip)
   1569		xfs_irele(pip);
   1570	return error;
   1571}
   1572
   1573STATIC void
   1574xfs_qm_destroy_quotainos(
   1575	struct xfs_quotainfo	*qi)
   1576{
   1577	if (qi->qi_uquotaip) {
   1578		xfs_irele(qi->qi_uquotaip);
   1579		qi->qi_uquotaip = NULL; /* paranoia */
   1580	}
   1581	if (qi->qi_gquotaip) {
   1582		xfs_irele(qi->qi_gquotaip);
   1583		qi->qi_gquotaip = NULL;
   1584	}
   1585	if (qi->qi_pquotaip) {
   1586		xfs_irele(qi->qi_pquotaip);
   1587		qi->qi_pquotaip = NULL;
   1588	}
   1589}
   1590
   1591STATIC void
   1592xfs_qm_dqfree_one(
   1593	struct xfs_dquot	*dqp)
   1594{
   1595	struct xfs_mount	*mp = dqp->q_mount;
   1596	struct xfs_quotainfo	*qi = mp->m_quotainfo;
   1597
   1598	mutex_lock(&qi->qi_tree_lock);
   1599	radix_tree_delete(xfs_dquot_tree(qi, xfs_dquot_type(dqp)), dqp->q_id);
   1600
   1601	qi->qi_dquots--;
   1602	mutex_unlock(&qi->qi_tree_lock);
   1603
   1604	xfs_qm_dqdestroy(dqp);
   1605}
   1606
   1607/* --------------- utility functions for vnodeops ---------------- */
   1608
   1609
   1610/*
   1611 * Given an inode, a uid, gid and prid make sure that we have
   1612 * allocated relevant dquot(s) on disk, and that we won't exceed inode
   1613 * quotas by creating this file.
   1614 * This also attaches dquot(s) to the given inode after locking it,
   1615 * and returns the dquots corresponding to the uid and/or gid.
   1616 *
   1617 * in	: inode (unlocked)
   1618 * out	: udquot, gdquot with references taken and unlocked
   1619 */
   1620int
   1621xfs_qm_vop_dqalloc(
   1622	struct xfs_inode	*ip,
   1623	kuid_t			uid,
   1624	kgid_t			gid,
   1625	prid_t			prid,
   1626	uint			flags,
   1627	struct xfs_dquot	**O_udqpp,
   1628	struct xfs_dquot	**O_gdqpp,
   1629	struct xfs_dquot	**O_pdqpp)
   1630{
   1631	struct xfs_mount	*mp = ip->i_mount;
   1632	struct inode		*inode = VFS_I(ip);
   1633	struct user_namespace	*user_ns = inode->i_sb->s_user_ns;
   1634	struct xfs_dquot	*uq = NULL;
   1635	struct xfs_dquot	*gq = NULL;
   1636	struct xfs_dquot	*pq = NULL;
   1637	int			error;
   1638	uint			lockflags;
   1639
   1640	if (!XFS_IS_QUOTA_ON(mp))
   1641		return 0;
   1642
   1643	lockflags = XFS_ILOCK_EXCL;
   1644	xfs_ilock(ip, lockflags);
   1645
   1646	if ((flags & XFS_QMOPT_INHERIT) && XFS_INHERIT_GID(ip))
   1647		gid = inode->i_gid;
   1648
   1649	/*
   1650	 * Attach the dquot(s) to this inode, doing a dquot allocation
   1651	 * if necessary. The dquot(s) will not be locked.
   1652	 */
   1653	if (XFS_NOT_DQATTACHED(mp, ip)) {
   1654		error = xfs_qm_dqattach_locked(ip, true);
   1655		if (error) {
   1656			xfs_iunlock(ip, lockflags);
   1657			return error;
   1658		}
   1659	}
   1660
   1661	if ((flags & XFS_QMOPT_UQUOTA) && XFS_IS_UQUOTA_ON(mp)) {
   1662		ASSERT(O_udqpp);
   1663		if (!uid_eq(inode->i_uid, uid)) {
   1664			/*
   1665			 * What we need is the dquot that has this uid, and
   1666			 * if we send the inode to dqget, the uid of the inode
   1667			 * takes priority over what's sent in the uid argument.
   1668			 * We must unlock inode here before calling dqget if
   1669			 * we're not sending the inode, because otherwise
   1670			 * we'll deadlock by doing trans_reserve while
   1671			 * holding ilock.
   1672			 */
   1673			xfs_iunlock(ip, lockflags);
   1674			error = xfs_qm_dqget(mp, from_kuid(user_ns, uid),
   1675					XFS_DQTYPE_USER, true, &uq);
   1676			if (error) {
   1677				ASSERT(error != -ENOENT);
   1678				return error;
   1679			}
   1680			/*
   1681			 * Get the ilock in the right order.
   1682			 */
   1683			xfs_dqunlock(uq);
   1684			lockflags = XFS_ILOCK_SHARED;
   1685			xfs_ilock(ip, lockflags);
   1686		} else {
   1687			/*
   1688			 * Take an extra reference, because we'll return
   1689			 * this to caller
   1690			 */
   1691			ASSERT(ip->i_udquot);
   1692			uq = xfs_qm_dqhold(ip->i_udquot);
   1693		}
   1694	}
   1695	if ((flags & XFS_QMOPT_GQUOTA) && XFS_IS_GQUOTA_ON(mp)) {
   1696		ASSERT(O_gdqpp);
   1697		if (!gid_eq(inode->i_gid, gid)) {
   1698			xfs_iunlock(ip, lockflags);
   1699			error = xfs_qm_dqget(mp, from_kgid(user_ns, gid),
   1700					XFS_DQTYPE_GROUP, true, &gq);
   1701			if (error) {
   1702				ASSERT(error != -ENOENT);
   1703				goto error_rele;
   1704			}
   1705			xfs_dqunlock(gq);
   1706			lockflags = XFS_ILOCK_SHARED;
   1707			xfs_ilock(ip, lockflags);
   1708		} else {
   1709			ASSERT(ip->i_gdquot);
   1710			gq = xfs_qm_dqhold(ip->i_gdquot);
   1711		}
   1712	}
   1713	if ((flags & XFS_QMOPT_PQUOTA) && XFS_IS_PQUOTA_ON(mp)) {
   1714		ASSERT(O_pdqpp);
   1715		if (ip->i_projid != prid) {
   1716			xfs_iunlock(ip, lockflags);
   1717			error = xfs_qm_dqget(mp, prid,
   1718					XFS_DQTYPE_PROJ, true, &pq);
   1719			if (error) {
   1720				ASSERT(error != -ENOENT);
   1721				goto error_rele;
   1722			}
   1723			xfs_dqunlock(pq);
   1724			lockflags = XFS_ILOCK_SHARED;
   1725			xfs_ilock(ip, lockflags);
   1726		} else {
   1727			ASSERT(ip->i_pdquot);
   1728			pq = xfs_qm_dqhold(ip->i_pdquot);
   1729		}
   1730	}
   1731	trace_xfs_dquot_dqalloc(ip);
   1732
   1733	xfs_iunlock(ip, lockflags);
   1734	if (O_udqpp)
   1735		*O_udqpp = uq;
   1736	else
   1737		xfs_qm_dqrele(uq);
   1738	if (O_gdqpp)
   1739		*O_gdqpp = gq;
   1740	else
   1741		xfs_qm_dqrele(gq);
   1742	if (O_pdqpp)
   1743		*O_pdqpp = pq;
   1744	else
   1745		xfs_qm_dqrele(pq);
   1746	return 0;
   1747
   1748error_rele:
   1749	xfs_qm_dqrele(gq);
   1750	xfs_qm_dqrele(uq);
   1751	return error;
   1752}
   1753
   1754/*
   1755 * Actually transfer ownership, and do dquot modifications.
   1756 * These were already reserved.
   1757 */
   1758struct xfs_dquot *
   1759xfs_qm_vop_chown(
   1760	struct xfs_trans	*tp,
   1761	struct xfs_inode	*ip,
   1762	struct xfs_dquot	**IO_olddq,
   1763	struct xfs_dquot	*newdq)
   1764{
   1765	struct xfs_dquot	*prevdq;
   1766	uint		bfield = XFS_IS_REALTIME_INODE(ip) ?
   1767				 XFS_TRANS_DQ_RTBCOUNT : XFS_TRANS_DQ_BCOUNT;
   1768
   1769
   1770	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
   1771	ASSERT(XFS_IS_QUOTA_ON(ip->i_mount));
   1772
   1773	/* old dquot */
   1774	prevdq = *IO_olddq;
   1775	ASSERT(prevdq);
   1776	ASSERT(prevdq != newdq);
   1777
   1778	xfs_trans_mod_dquot(tp, prevdq, bfield, -(ip->i_nblocks));
   1779	xfs_trans_mod_dquot(tp, prevdq, XFS_TRANS_DQ_ICOUNT, -1);
   1780
   1781	/* the sparkling new dquot */
   1782	xfs_trans_mod_dquot(tp, newdq, bfield, ip->i_nblocks);
   1783	xfs_trans_mod_dquot(tp, newdq, XFS_TRANS_DQ_ICOUNT, 1);
   1784
   1785	/*
   1786	 * Back when we made quota reservations for the chown, we reserved the
   1787	 * ondisk blocks + delalloc blocks with the new dquot.  Now that we've
   1788	 * switched the dquots, decrease the new dquot's block reservation
   1789	 * (having already bumped up the real counter) so that we don't have
   1790	 * any reservation to give back when we commit.
   1791	 */
   1792	xfs_trans_mod_dquot(tp, newdq, XFS_TRANS_DQ_RES_BLKS,
   1793			-ip->i_delayed_blks);
   1794
   1795	/*
   1796	 * Give the incore reservation for delalloc blocks back to the old
   1797	 * dquot.  We don't normally handle delalloc quota reservations
   1798	 * transactionally, so just lock the dquot and subtract from the
   1799	 * reservation.  Dirty the transaction because it's too late to turn
   1800	 * back now.
   1801	 */
   1802	tp->t_flags |= XFS_TRANS_DIRTY;
   1803	xfs_dqlock(prevdq);
   1804	ASSERT(prevdq->q_blk.reserved >= ip->i_delayed_blks);
   1805	prevdq->q_blk.reserved -= ip->i_delayed_blks;
   1806	xfs_dqunlock(prevdq);
   1807
   1808	/*
   1809	 * Take an extra reference, because the inode is going to keep
   1810	 * this dquot pointer even after the trans_commit.
   1811	 */
   1812	*IO_olddq = xfs_qm_dqhold(newdq);
   1813
   1814	return prevdq;
   1815}
   1816
   1817int
   1818xfs_qm_vop_rename_dqattach(
   1819	struct xfs_inode	**i_tab)
   1820{
   1821	struct xfs_mount	*mp = i_tab[0]->i_mount;
   1822	int			i;
   1823
   1824	if (!XFS_IS_QUOTA_ON(mp))
   1825		return 0;
   1826
   1827	for (i = 0; (i < 4 && i_tab[i]); i++) {
   1828		struct xfs_inode	*ip = i_tab[i];
   1829		int			error;
   1830
   1831		/*
   1832		 * Watch out for duplicate entries in the table.
   1833		 */
   1834		if (i == 0 || ip != i_tab[i-1]) {
   1835			if (XFS_NOT_DQATTACHED(mp, ip)) {
   1836				error = xfs_qm_dqattach(ip);
   1837				if (error)
   1838					return error;
   1839			}
   1840		}
   1841	}
   1842	return 0;
   1843}
   1844
   1845void
   1846xfs_qm_vop_create_dqattach(
   1847	struct xfs_trans	*tp,
   1848	struct xfs_inode	*ip,
   1849	struct xfs_dquot	*udqp,
   1850	struct xfs_dquot	*gdqp,
   1851	struct xfs_dquot	*pdqp)
   1852{
   1853	struct xfs_mount	*mp = tp->t_mountp;
   1854
   1855	if (!XFS_IS_QUOTA_ON(mp))
   1856		return;
   1857
   1858	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
   1859
   1860	if (udqp && XFS_IS_UQUOTA_ON(mp)) {
   1861		ASSERT(ip->i_udquot == NULL);
   1862		ASSERT(i_uid_read(VFS_I(ip)) == udqp->q_id);
   1863
   1864		ip->i_udquot = xfs_qm_dqhold(udqp);
   1865		xfs_trans_mod_dquot(tp, udqp, XFS_TRANS_DQ_ICOUNT, 1);
   1866	}
   1867	if (gdqp && XFS_IS_GQUOTA_ON(mp)) {
   1868		ASSERT(ip->i_gdquot == NULL);
   1869		ASSERT(i_gid_read(VFS_I(ip)) == gdqp->q_id);
   1870
   1871		ip->i_gdquot = xfs_qm_dqhold(gdqp);
   1872		xfs_trans_mod_dquot(tp, gdqp, XFS_TRANS_DQ_ICOUNT, 1);
   1873	}
   1874	if (pdqp && XFS_IS_PQUOTA_ON(mp)) {
   1875		ASSERT(ip->i_pdquot == NULL);
   1876		ASSERT(ip->i_projid == pdqp->q_id);
   1877
   1878		ip->i_pdquot = xfs_qm_dqhold(pdqp);
   1879		xfs_trans_mod_dquot(tp, pdqp, XFS_TRANS_DQ_ICOUNT, 1);
   1880	}
   1881}
   1882
   1883/* Decide if this inode's dquot is near an enforcement boundary. */
   1884bool
   1885xfs_inode_near_dquot_enforcement(
   1886	struct xfs_inode	*ip,
   1887	xfs_dqtype_t		type)
   1888{
   1889	struct xfs_dquot	*dqp;
   1890	int64_t			freesp;
   1891
   1892	/* We only care for quotas that are enabled and enforced. */
   1893	dqp = xfs_inode_dquot(ip, type);
   1894	if (!dqp || !xfs_dquot_is_enforced(dqp))
   1895		return false;
   1896
   1897	if (xfs_dquot_res_over_limits(&dqp->q_ino) ||
   1898	    xfs_dquot_res_over_limits(&dqp->q_rtb))
   1899		return true;
   1900
   1901	/* For space on the data device, check the various thresholds. */
   1902	if (!dqp->q_prealloc_hi_wmark)
   1903		return false;
   1904
   1905	if (dqp->q_blk.reserved < dqp->q_prealloc_lo_wmark)
   1906		return false;
   1907
   1908	if (dqp->q_blk.reserved >= dqp->q_prealloc_hi_wmark)
   1909		return true;
   1910
   1911	freesp = dqp->q_prealloc_hi_wmark - dqp->q_blk.reserved;
   1912	if (freesp < dqp->q_low_space[XFS_QLOWSP_5_PCNT])
   1913		return true;
   1914
   1915	return false;
   1916}