public inbox for linux-xfs@vger.kernel.org
 help / color / mirror / Atom feed
From: Brian Foster <bfoster@redhat.com>
To: "Darrick J. Wong" <djwong@kernel.org>
Cc: linux-xfs@vger.kernel.org, hch@infradead.org, david@fromorbit.com
Subject: Re: [PATCH 08/12] xfs: flush eof/cowblocks if we can't reserve quota for inode creation
Date: Tue, 2 Feb 2021 10:39:08 -0500	[thread overview]
Message-ID: <20210202153908.GH3336100@bfoster> (raw)
In-Reply-To: <161214517156.140945.6151197680730753044.stgit@magnolia>

On Sun, Jan 31, 2021 at 06:06:11PM -0800, Darrick J. Wong wrote:
> From: Darrick J. Wong <djwong@kernel.org>
> 
> If an inode creation is unable to reserve enough quota to handle the
> modification, try clearing whatever space the filesystem might have been
> hanging onto in the hopes of speeding up the filesystem.  The flushing
> behavior will become particularly important when we add deferred inode
> inactivation because that will increase the amount of space that isn't
> actively tied to user data.
> 
> Signed-off-by: Darrick J. Wong <djwong@kernel.org>
> ---

Reviewed-by: Brian Foster <bfoster@redhat.com>

>  fs/xfs/xfs_icache.c |   73 ++++++++++++++++++++++++++++++---------------------
>  fs/xfs/xfs_icache.h |    2 +
>  fs/xfs/xfs_trans.c  |    8 ++++++
>  3 files changed, 53 insertions(+), 30 deletions(-)
> 
> 
> diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c
> index 4a074aa12b52..cd369dd48818 100644
> --- a/fs/xfs/xfs_icache.c
> +++ b/fs/xfs/xfs_icache.c
> @@ -1646,64 +1646,77 @@ xfs_start_block_reaping(
>  }
>  
>  /*
> - * Run cow/eofblocks scans on the quotas applicable to the inode. For inodes
> - * with multiple quotas, we don't know exactly which quota caused an allocation
> - * failure. We make a best effort by including each quota under low free space
> - * conditions (less than 1% free space) in the scan.
> + * Run cow/eofblocks scans on the supplied dquots.  We don't know exactly which
> + * quota caused an allocation failure, so we make a best effort by including
> + * each quota under low free space conditions (less than 1% free space) in the
> + * scan.
>   *
>   * Callers must not hold any inode's ILOCK.  If requesting a synchronous scan
>   * (XFS_EOF_FLAGS_SYNC), the caller also must not hold any inode's IOLOCK or
>   * MMAPLOCK.
>   */
>  int
> -xfs_blockgc_free_quota(
> -	struct xfs_inode	*ip,
> +xfs_blockgc_free_dquots(
> +	struct xfs_dquot	*udqp,
> +	struct xfs_dquot	*gdqp,
> +	struct xfs_dquot	*pdqp,
>  	unsigned int		eof_flags)
>  {
>  	struct xfs_eofblocks	eofb = {0};
> -	struct xfs_dquot	*dq;
> +	struct xfs_mount	*mp = NULL;
>  	bool			do_work = false;
>  	int			error;
>  
> +	if (!udqp && !gdqp && !pdqp)
> +		return 0;
> +	if (udqp)
> +		mp = udqp->q_mount;
> +	if (!mp && gdqp)
> +		mp = gdqp->q_mount;
> +	if (!mp && pdqp)
> +		mp = pdqp->q_mount;
> +
>  	/*
>  	 * Run a scan to free blocks using the union filter to cover all
>  	 * applicable quotas in a single scan.
>  	 */
>  	eofb.eof_flags = XFS_EOF_FLAGS_UNION | eof_flags;
>  
> -	if (XFS_IS_UQUOTA_ENFORCED(ip->i_mount)) {
> -		dq = xfs_inode_dquot(ip, XFS_DQTYPE_USER);
> -		if (dq && xfs_dquot_lowsp(dq)) {
> -			eofb.eof_uid = VFS_I(ip)->i_uid;
> -			eofb.eof_flags |= XFS_EOF_FLAGS_UID;
> -			do_work = true;
> -		}
> +	if (XFS_IS_UQUOTA_ENFORCED(mp) && udqp && xfs_dquot_lowsp(udqp)) {
> +		eofb.eof_uid = make_kuid(mp->m_super->s_user_ns, udqp->q_id);
> +		eofb.eof_flags |= XFS_EOF_FLAGS_UID;
> +		do_work = true;
>  	}
>  
> -	if (XFS_IS_GQUOTA_ENFORCED(ip->i_mount)) {
> -		dq = xfs_inode_dquot(ip, XFS_DQTYPE_GROUP);
> -		if (dq && xfs_dquot_lowsp(dq)) {
> -			eofb.eof_gid = VFS_I(ip)->i_gid;
> -			eofb.eof_flags |= XFS_EOF_FLAGS_GID;
> -			do_work = true;
> -		}
> +	if (XFS_IS_UQUOTA_ENFORCED(mp) && gdqp && xfs_dquot_lowsp(gdqp)) {
> +		eofb.eof_gid = make_kgid(mp->m_super->s_user_ns, gdqp->q_id);
> +		eofb.eof_flags |= XFS_EOF_FLAGS_GID;
> +		do_work = true;
>  	}
>  
> -	if (XFS_IS_PQUOTA_ENFORCED(ip->i_mount)) {
> -		dq = xfs_inode_dquot(ip, XFS_DQTYPE_PROJ);
> -		if (dq && xfs_dquot_lowsp(dq)) {
> -			eofb.eof_prid = ip->i_d.di_projid;
> -			eofb.eof_flags |= XFS_EOF_FLAGS_PRID;
> -			do_work = true;
> -		}
> +	if (XFS_IS_PQUOTA_ENFORCED(mp) && pdqp && xfs_dquot_lowsp(pdqp)) {
> +		eofb.eof_prid = pdqp->q_id;
> +		eofb.eof_flags |= XFS_EOF_FLAGS_PRID;
> +		do_work = true;
>  	}
>  
>  	if (!do_work)
>  		return 0;
>  
> -	error = xfs_icache_free_eofblocks(ip->i_mount, &eofb);
> +	error = xfs_icache_free_eofblocks(mp, &eofb);
>  	if (error)
>  		return error;
>  
> -	return xfs_icache_free_cowblocks(ip->i_mount, &eofb);
> +	return xfs_icache_free_cowblocks(mp, &eofb);
> +}
> +
> +/* Run cow/eofblocks scans on the quotas attached to the inode. */
> +int
> +xfs_blockgc_free_quota(
> +	struct xfs_inode	*ip,
> +	unsigned int		eof_flags)
> +{
> +	return xfs_blockgc_free_dquots(xfs_inode_dquot(ip, XFS_DQTYPE_USER),
> +			xfs_inode_dquot(ip, XFS_DQTYPE_GROUP),
> +			xfs_inode_dquot(ip, XFS_DQTYPE_PROJ), eof_flags);
>  }
> diff --git a/fs/xfs/xfs_icache.h b/fs/xfs/xfs_icache.h
> index d64ea8f5c589..5f520de637f6 100644
> --- a/fs/xfs/xfs_icache.h
> +++ b/fs/xfs/xfs_icache.h
> @@ -54,6 +54,8 @@ long xfs_reclaim_inodes_nr(struct xfs_mount *mp, int nr_to_scan);
>  
>  void xfs_inode_set_reclaim_tag(struct xfs_inode *ip);
>  
> +int xfs_blockgc_free_dquots(struct xfs_dquot *udqp, struct xfs_dquot *gdqp,
> +		struct xfs_dquot *pdqp, unsigned int eof_flags);
>  int xfs_blockgc_free_quota(struct xfs_inode *ip, unsigned int eof_flags);
>  
>  void xfs_inode_set_eofblocks_tag(struct xfs_inode *ip);
> diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c
> index f62c1c5f210f..ee3cb916c5c9 100644
> --- a/fs/xfs/xfs_trans.c
> +++ b/fs/xfs/xfs_trans.c
> @@ -1102,13 +1102,21 @@ xfs_trans_alloc_icreate(
>  	struct xfs_trans	**tpp)
>  {
>  	struct xfs_trans	*tp;
> +	bool			retried = false;
>  	int			error;
>  
> +retry:
>  	error = xfs_trans_alloc(mp, resv, dblocks, 0, 0, &tp);
>  	if (error)
>  		return error;
>  
>  	error = xfs_trans_reserve_quota_icreate(tp, udqp, gdqp, pdqp, dblocks);
> +	if (!retried && (error == -EDQUOT || error == -ENOSPC)) {
> +		xfs_trans_cancel(tp);
> +		xfs_blockgc_free_dquots(udqp, gdqp, pdqp, 0);
> +		retried = true;
> +		goto retry;
> +	}
>  	if (error) {
>  		xfs_trans_cancel(tp);
>  		return error;
> 


  parent reply	other threads:[~2021-02-02 15:44 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-01  2:05 [PATCHSET v7 00/12] xfs: try harder to reclaim space when we run out Darrick J. Wong
2021-02-01  2:05 ` [PATCH 01/12] xfs: trigger all block gc scans when low on quota space Darrick J. Wong
2021-02-01  2:05 ` [PATCH 02/12] xfs: don't stall cowblocks scan if we can't take locks Darrick J. Wong
2021-02-01  2:05 ` [PATCH 03/12] xfs: xfs_inode_free_quota_blocks should scan project quota Darrick J. Wong
2021-02-01  2:05 ` [PATCH 04/12] xfs: move and rename xfs_inode_free_quota_blocks to avoid conflicts Darrick J. Wong
2021-02-01  2:05 ` [PATCH 05/12] xfs: pass flags and return gc errors from xfs_blockgc_free_quota Darrick J. Wong
2021-02-01  2:06 ` [PATCH 06/12] xfs: try worst case space reservation upfront in xfs_reflink_remap_extent Darrick J. Wong
2021-02-01 12:24   ` Christoph Hellwig
2021-02-01  2:06 ` [PATCH 07/12] xfs: flush eof/cowblocks if we can't reserve quota for file blocks Darrick J. Wong
2021-02-01 12:32   ` Christoph Hellwig
2021-02-01 19:01     ` Darrick J. Wong
2021-02-02 15:38   ` Brian Foster
2021-02-02 16:53     ` Darrick J. Wong
2021-02-01  2:06 ` [PATCH 08/12] xfs: flush eof/cowblocks if we can't reserve quota for inode creation Darrick J. Wong
2021-02-01 12:35   ` Christoph Hellwig
2021-02-01 19:03     ` Darrick J. Wong
2021-02-02 15:39   ` Brian Foster [this message]
2021-02-01  2:06 ` [PATCH 09/12] xfs: flush eof/cowblocks if we can't reserve quota for chown Darrick J. Wong
2021-02-01 12:36   ` Christoph Hellwig
2021-02-01 19:12     ` Darrick J. Wong
2021-02-02 15:39   ` Brian Foster
2021-02-01  2:06 ` [PATCH 10/12] xfs: add a tracepoint for blockgc scans Darrick J. Wong
2021-02-01  2:06 ` [PATCH 11/12] xfs: refactor xfs_icache_free_{eof,cow}blocks call sites Darrick J. Wong
2021-02-01  2:06 ` [PATCH 12/12] xfs: flush speculative space allocations when we run out of space Darrick J. Wong
2021-02-02 15:39   ` Brian Foster
  -- strict thread matches above, loose matches on Subject: below --
2021-01-29  2:17 [PATCHSET v6 00/12] xfs: try harder to reclaim space when we run out Darrick J. Wong
2021-01-29  2:18 ` [PATCH 08/12] xfs: flush eof/cowblocks if we can't reserve quota for inode creation Darrick J. Wong

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210202153908.GH3336100@bfoster \
    --to=bfoster@redhat.com \
    --cc=david@fromorbit.com \
    --cc=djwong@kernel.org \
    --cc=hch@infradead.org \
    --cc=linux-xfs@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox