summaryrefslogtreecommitdiff
path: root/fs/xfs/xfs_icache.c
diff options
context:
space:
mode:
authorDarrick J. Wong <djwong@kernel.org>2021-01-23 03:48:36 +0300
committerDarrick J. Wong <djwong@kernel.org>2021-02-03 20:18:49 +0300
commit111068f80eac00173816c2e822c52c316b650df3 (patch)
treec41f02db7838a1a33e58ee687d6df2335f48ea0d /fs/xfs/xfs_icache.c
parent3d4feec00673d34fbbfe0277d2e0ed1f51d20cb2 (diff)
downloadlinux-111068f80eac00173816c2e822c52c316b650df3.tar.xz
xfs: pass flags and return gc errors from xfs_blockgc_free_quota
Change the signature of xfs_blockgc_free_quota in preparation for the next few patches. Callers can now pass EOF_FLAGS into the function to control scan parameters; and the function will now pass back any corruption errors seen while scanning, though for our retry loops we'll just try again unconditionally. Signed-off-by: Darrick J. Wong <djwong@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Brian Foster <bfoster@redhat.com>
Diffstat (limited to 'fs/xfs/xfs_icache.c')
-rw-r--r--fs/xfs/xfs_icache.c26
1 files changed, 17 insertions, 9 deletions
diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c
index aba901d5637b..4a074aa12b52 100644
--- a/fs/xfs/xfs_icache.c
+++ b/fs/xfs/xfs_icache.c
@@ -1650,20 +1650,26 @@ xfs_start_block_reaping(
* 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.
+ *
+ * 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.
*/
-bool
+int
xfs_blockgc_free_quota(
- struct xfs_inode *ip)
+ struct xfs_inode *ip,
+ unsigned int eof_flags)
{
struct xfs_eofblocks eofb = {0};
struct xfs_dquot *dq;
bool do_work = false;
+ int error;
/*
- * Run a sync scan to increase effectiveness and use the union filter to
- * cover all applicable quotas in a single scan.
+ * 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 | XFS_EOF_FLAGS_SYNC;
+ 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);
@@ -1693,9 +1699,11 @@ xfs_blockgc_free_quota(
}
if (!do_work)
- return false;
+ return 0;
- xfs_icache_free_eofblocks(ip->i_mount, &eofb);
- xfs_icache_free_cowblocks(ip->i_mount, &eofb);
- return true;
+ error = xfs_icache_free_eofblocks(ip->i_mount, &eofb);
+ if (error)
+ return error;
+
+ return xfs_icache_free_cowblocks(ip->i_mount, &eofb);
}