Commit 85c5b270 authored by Darrick J. Wong's avatar Darrick J. Wong
Browse files

xfs: refactor xfs_icache_free_{eof,cow}blocks call sites



In anticipation of more restructuring of the eof/cowblocks gc code,
refactor calling of those two functions into a single internal helper
function, then present a new standard interface to purge speculative
block preallocations and start shifting higher level code to use that.

Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
parent 38899f80
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -718,8 +718,7 @@ xfs_file_buffered_aio_write(

		xfs_iunlock(ip, iolock);
		eofb.eof_flags = XFS_EOF_FLAGS_SYNC;
		xfs_icache_free_eofblocks(ip->i_mount, &eofb);
		xfs_icache_free_cowblocks(ip->i_mount, &eofb);
		xfs_blockgc_free_space(ip->i_mount, &eofb);
		goto write_retry;
	}

+33 −6
Original line number Diff line number Diff line
@@ -1645,6 +1645,38 @@ xfs_start_block_reaping(
	xfs_queue_cowblocks(mp);
}

/* Scan all incore inodes for block preallocations that we can remove. */
static inline int
xfs_blockgc_scan(
	struct xfs_mount	*mp,
	struct xfs_eofblocks	*eofb)
{
	int			error;

	error = xfs_icache_free_eofblocks(mp, eofb);
	if (error)
		return error;

	error = xfs_icache_free_cowblocks(mp, eofb);
	if (error)
		return error;

	return 0;
}

/*
 * Try to free space in the filesystem by purging eofblocks and cowblocks.
 */
int
xfs_blockgc_free_space(
	struct xfs_mount	*mp,
	struct xfs_eofblocks	*eofb)
{
	trace_xfs_blockgc_free_space(mp, eofb, _RET_IP_);

	return xfs_blockgc_scan(mp, eofb);
}

/*
 * 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
@@ -1665,7 +1697,6 @@ xfs_blockgc_free_dquots(
{
	struct xfs_eofblocks	eofb = {0};
	bool			do_work = false;
	int			error;

	if (!udqp && !gdqp && !pdqp)
		return 0;
@@ -1697,11 +1728,7 @@ xfs_blockgc_free_dquots(
	if (!do_work)
		return 0;

	error = xfs_icache_free_eofblocks(mp, &eofb);
	if (error)
		return error;

	return xfs_icache_free_cowblocks(mp, &eofb);
	return xfs_blockgc_free_space(mp, &eofb);
}

/* Run cow/eofblocks scans on the quotas attached to the inode. */
+1 −0
Original line number Diff line number Diff line
@@ -58,6 +58,7 @@ int xfs_blockgc_free_dquots(struct xfs_mount *mp, 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);
int xfs_blockgc_free_space(struct xfs_mount *mp, struct xfs_eofblocks *eofb);

void xfs_inode_set_eofblocks_tag(struct xfs_inode *ip);
void xfs_inode_clear_eofblocks_tag(struct xfs_inode *ip);
+1 −0
Original line number Diff line number Diff line
@@ -3928,6 +3928,7 @@ DEFINE_EVENT(xfs_eofblocks_class, name, \
		 unsigned long caller_ip), \
	TP_ARGS(mp, eofb, caller_ip))
DEFINE_EOFBLOCKS_EVENT(xfs_ioc_free_eofblocks);
DEFINE_EOFBLOCKS_EVENT(xfs_blockgc_free_space);

#endif /* _TRACE_XFS_H */