From: Christoph Hellwig <hch@lst.de>
To: linux-xfs@vger.kernel.org
Subject: [PATCH 1/3] xfs: use s_inodes in xfs_qm_dqrele_all_inodes
Date: Wed, 24 Mar 2021 08:03:05 +0100 [thread overview]
Message-ID: <20210324070307.908462-2-hch@lst.de> (raw)
In-Reply-To: <20210324070307.908462-1-hch@lst.de>
Using xfs_inode_walk in xfs_qm_dqrele_all_inodes is complete overkill,
given that function simplify wants to iterate all live inodes known
to the VFS. Just iterate over the s_inodes list.
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
fs/xfs/xfs_icache.c | 2 +-
fs/xfs/xfs_icache.h | 2 ++
fs/xfs/xfs_qm_syscalls.c | 56 +++++++++++++++++++++++++---------------
3 files changed, 38 insertions(+), 22 deletions(-)
diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c
index 1d7720a0c068b7..c0d084e3526a9c 100644
--- a/fs/xfs/xfs_icache.c
+++ b/fs/xfs/xfs_icache.c
@@ -233,7 +233,7 @@ xfs_inode_clear_reclaim_tag(
xfs_perag_clear_reclaim_tag(pag);
}
-static void
+void
xfs_inew_wait(
struct xfs_inode *ip)
{
diff --git a/fs/xfs/xfs_icache.h b/fs/xfs/xfs_icache.h
index d1fddb1524200b..d70d93c2bb1084 100644
--- a/fs/xfs/xfs_icache.h
+++ b/fs/xfs/xfs_icache.h
@@ -78,4 +78,6 @@ int xfs_icache_inode_is_allocated(struct xfs_mount *mp, struct xfs_trans *tp,
void xfs_blockgc_stop(struct xfs_mount *mp);
void xfs_blockgc_start(struct xfs_mount *mp);
+void xfs_inew_wait(struct xfs_inode *ip);
+
#endif
diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c
index ca1b57d291dc90..88dfd520ae91de 100644
--- a/fs/xfs/xfs_qm_syscalls.c
+++ b/fs/xfs/xfs_qm_syscalls.c
@@ -748,41 +748,27 @@ xfs_qm_scall_getquota_next(
return error;
}
-STATIC int
+static void
xfs_dqrele_inode(
struct xfs_inode *ip,
- void *args)
+ uint flags)
{
- uint *flags = args;
-
- /* skip quota inodes */
- if (ip == ip->i_mount->m_quotainfo->qi_uquotaip ||
- ip == ip->i_mount->m_quotainfo->qi_gquotaip ||
- ip == ip->i_mount->m_quotainfo->qi_pquotaip) {
- ASSERT(ip->i_udquot == NULL);
- ASSERT(ip->i_gdquot == NULL);
- ASSERT(ip->i_pdquot == NULL);
- return 0;
- }
-
xfs_ilock(ip, XFS_ILOCK_EXCL);
- if ((*flags & XFS_UQUOTA_ACCT) && ip->i_udquot) {
+ if ((flags & XFS_UQUOTA_ACCT) && ip->i_udquot) {
xfs_qm_dqrele(ip->i_udquot);
ip->i_udquot = NULL;
}
- if ((*flags & XFS_GQUOTA_ACCT) && ip->i_gdquot) {
+ if ((flags & XFS_GQUOTA_ACCT) && ip->i_gdquot) {
xfs_qm_dqrele(ip->i_gdquot);
ip->i_gdquot = NULL;
}
- if ((*flags & XFS_PQUOTA_ACCT) && ip->i_pdquot) {
+ if ((flags & XFS_PQUOTA_ACCT) && ip->i_pdquot) {
xfs_qm_dqrele(ip->i_pdquot);
ip->i_pdquot = NULL;
}
xfs_iunlock(ip, XFS_ILOCK_EXCL);
- return 0;
}
-
/*
* Go thru all the inodes in the file system, releasing their dquots.
*
@@ -794,7 +780,35 @@ xfs_qm_dqrele_all_inodes(
struct xfs_mount *mp,
uint flags)
{
+ struct super_block *sb = mp->m_super;
+ struct inode *inode, *old_inode = NULL;
+
ASSERT(mp->m_quotainfo);
- xfs_inode_walk(mp, XFS_INODE_WALK_INEW_WAIT, xfs_dqrele_inode,
- &flags, XFS_ICI_NO_TAG);
+
+ spin_lock(&sb->s_inode_list_lock);
+ list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
+ struct xfs_inode *ip = XFS_I(inode);
+
+ if (XFS_FORCED_SHUTDOWN(mp))
+ break;
+ if (xfs_is_quota_inode(&mp->m_sb, ip->i_ino))
+ continue;
+ if (xfs_iflags_test(ip, XFS_IRECLAIMABLE | XFS_IRECLAIM))
+ continue;
+ if (!igrab(inode))
+ continue;
+ spin_unlock(&sb->s_inode_list_lock);
+
+ iput(old_inode);
+ old_inode = inode;
+
+ if (xfs_iflags_test(ip, XFS_INEW))
+ xfs_inew_wait(ip);
+ xfs_dqrele_inode(ip, flags);
+
+ spin_lock(&sb->s_inode_list_lock);
+ }
+ spin_unlock(&sb->s_inode_list_lock);
+
+ iput(old_inode);
}
--
2.30.1
next prev parent reply other threads:[~2021-03-24 7:03 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-24 7:03 simplify the blockgc iwalk infrastructure Christoph Hellwig
2021-03-24 7:03 ` Christoph Hellwig [this message]
2021-03-24 17:50 ` [PATCH 1/3] xfs: use s_inodes in xfs_qm_dqrele_all_inodes Darrick J. Wong
2021-03-24 7:03 ` [PATCH 2/3] xfs: simplify the perage inode walk infrastructure Christoph Hellwig
2021-03-24 17:57 ` Darrick J. Wong
2021-03-24 17:59 ` Christoph Hellwig
2021-03-25 4:30 ` Darrick J. Wong
2021-03-24 7:03 ` [PATCH 3/3] xfs: pass struct xfs_eofblocks to the inode scan callback Christoph Hellwig
2021-03-24 18:03 ` 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=20210324070307.908462-2-hch@lst.de \
--to=hch@lst.de \
--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 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.