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;
>
next prev 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