From: "Darrick J. Wong" <djwong@kernel.org> To: djwong@kernel.org Cc: linux-xfs@vger.kernel.org, hch@infradead.org Subject: [PATCH 3/5] xfs: separate the dqrele_all inode grab logic from xfs_inode_walk_ag_grab Date: Mon, 31 May 2021 15:41:07 -0700 [thread overview] Message-ID: <162250086766.490412.9229536536315438431.stgit@locust> (raw) In-Reply-To: <162250085103.490412.4291071116538386696.stgit@locust> From: Darrick J. Wong <djwong@kernel.org> Disentangle the dqrele_all inode grab code from the "generic" inode walk grabbing code, and and use the opportunity to document why the dqrele grab function does what it does. Since dqrele_all is the only user of XFS_ICI_NO_TAG, rename it to something more specific for what we're doing. Signed-off-by: Darrick J. Wong <djwong@kernel.org> --- fs/xfs/xfs_icache.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++--- fs/xfs/xfs_icache.h | 4 ++- 2 files changed, 62 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index 34b8b5fbd60d..5501318b5db0 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -26,6 +26,8 @@ #include <linux/iversion.h> +static bool xfs_dqrele_inode_grab(struct xfs_inode *ip); + /* * Allocate and initialise an xfs_inode. */ @@ -765,6 +767,22 @@ xfs_inode_walk_ag_grab( return false; } +static inline bool +xfs_grabbed_for_walk( + int tag, + struct xfs_inode *ip, + int iter_flags) +{ + switch (tag) { + case XFS_ICI_BLOCKGC_TAG: + return xfs_inode_walk_ag_grab(ip, iter_flags); + case XFS_ICI_DQRELE_NONTAG: + return xfs_dqrele_inode_grab(ip); + default: + return false; + } +} + /* * For a given per-AG structure @pag, grab, @execute, and rele all incore * inodes with the given radix tree @tag. @@ -796,7 +814,7 @@ xfs_inode_walk_ag( rcu_read_lock(); - if (tag == XFS_ICI_NO_TAG) + if (tag == XFS_ICI_DQRELE_NONTAG) nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, (void **)batch, first_index, XFS_LOOKUP_BATCH); @@ -818,7 +836,7 @@ xfs_inode_walk_ag( for (i = 0; i < nr_found; i++) { struct xfs_inode *ip = batch[i]; - if (done || !xfs_inode_walk_ag_grab(ip, iter_flags)) + if (done || !xfs_grabbed_for_walk(tag, ip, iter_flags)) batch[i] = NULL; /* @@ -881,7 +899,7 @@ xfs_inode_walk_get_perag( xfs_agnumber_t agno, int tag) { - if (tag == XFS_ICI_NO_TAG) + if (tag == XFS_ICI_DQRELE_NONTAG) return xfs_perag_get(mp, agno); return xfs_perag_get_tag(mp, agno, tag); } @@ -917,6 +935,44 @@ xfs_inode_walk( return last_error; } +/* Decide if we want to grab this inode to drop its dquots. */ +static bool +xfs_dqrele_inode_grab( + struct xfs_inode *ip) +{ + bool ret = false; + + ASSERT(rcu_read_lock_held()); + + /* Check for stale RCU freed inode */ + spin_lock(&ip->i_flags_lock); + if (!ip->i_ino) + goto out_unlock; + + /* + * Skip inodes that are anywhere in the reclaim machinery because we + * drop dquots before tagging an inode for reclamation. + */ + if (ip->i_flags & (XFS_IRECLAIM | XFS_IRECLAIMABLE)) + goto out_unlock; + + /* + * The inode looks alive; try to grab a VFS reference so that it won't + * get destroyed. If we got the reference, return true to say that + * we grabbed the inode. + * + * If we can't get the reference, then we know the inode had its VFS + * state torn down and hasn't yet entered the reclaim machinery. Since + * we also know that dquots are detached from an inode before it enters + * reclaim, we can skip the inode. + */ + ret = igrab(VFS_I(ip)) != NULL; + +out_unlock: + spin_unlock(&ip->i_flags_lock); + return ret; +} + /* Drop this inode's dquots. */ static int xfs_dqrele_inode( @@ -964,7 +1020,7 @@ xfs_dqrele_all_inodes( eofb.eof_flags |= XFS_EOFB_DROP_PDQUOT; return xfs_inode_walk(mp, XFS_INODE_WALK_INEW_WAIT, xfs_dqrele_inode, - &eofb, XFS_ICI_NO_TAG); + &eofb, XFS_ICI_DQRELE_NONTAG); } /* diff --git a/fs/xfs/xfs_icache.h b/fs/xfs/xfs_icache.h index 77029e92ba4c..fcfcdad7f977 100644 --- a/fs/xfs/xfs_icache.h +++ b/fs/xfs/xfs_icache.h @@ -29,8 +29,8 @@ struct xfs_eofblocks { /* * tags for inode radix tree */ -#define XFS_ICI_NO_TAG (-1) /* special flag for an untagged lookup - in xfs_inode_walk */ +#define XFS_ICI_DQRELE_NONTAG (-1) /* quotaoff dqdetach inode walk uses + untagged lookups */ #define XFS_ICI_RECLAIM_TAG 0 /* inode is to be reclaimed */ /* Inode has speculative preallocations (posteof or cow) to clean. */ #define XFS_ICI_BLOCKGC_TAG 1
next prev parent reply other threads:[~2021-05-31 22:41 UTC|newest] Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-05-31 22:40 [PATCHSET v2 0/5] xfs: clean up quotaoff inode walks Darrick J. Wong 2021-05-31 22:40 ` [PATCH 1/5] xfs: move the quotaoff dqrele inode walk into xfs_icache.c Darrick J. Wong 2021-05-31 22:41 ` [PATCH 2/5] xfs: detach inode dquots at the end of inactivation Darrick J. Wong 2021-06-01 0:09 ` Dave Chinner 2021-05-31 22:41 ` Darrick J. Wong [this message] 2021-06-01 0:20 ` [PATCH 3/5] xfs: separate the dqrele_all inode grab logic from xfs_inode_walk_ag_grab Dave Chinner 2021-06-01 19:50 ` Darrick J. Wong 2021-06-01 21:40 ` Dave Chinner 2021-06-01 23:15 ` Darrick J. Wong 2021-05-31 22:41 ` [PATCH 4/5] xfs: drop inactive dquots before inactivating inodes Darrick J. Wong 2021-06-01 0:35 ` Dave Chinner 2021-06-01 19:53 ` Darrick J. Wong 2021-05-31 22:41 ` [PATCH 5/5] xfs: move xfs_inew_wait call into xfs_dqrele_inode Darrick J. Wong 2021-06-01 0:47 ` Dave Chinner
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=162250086766.490412.9229536536315438431.stgit@locust \ --to=djwong@kernel.org \ --cc=hch@infradead.org \ --cc=linux-xfs@vger.kernel.org \ --subject='Re: [PATCH 3/5] xfs: separate the dqrele_all inode grab logic from xfs_inode_walk_ag_grab' \ /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
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.