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

xfs: refactor eofb matching into a single helper



Refactor the two eofb-matching logics into a single helper so that we
don't repeat ourselves.

Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
parent 8921a0fd
Loading
Loading
Loading
Loading
+34 −28
Original line number Diff line number Diff line
@@ -1456,6 +1456,36 @@ xfs_inode_match_id_union(
	return 0;
}

/*
 * Is this inode @ip eligible for eof/cow block reclamation, given some
 * filtering parameters @eofb?  The inode is eligible if @eofb is null or
 * if the predicate functions match.
 */
static bool
xfs_inode_matches_eofb(
	struct xfs_inode	*ip,
	struct xfs_eofblocks	*eofb)
{
	int			match;

	if (!eofb)
		return true;

	if (eofb->eof_flags & XFS_EOF_FLAGS_UNION)
		match = xfs_inode_match_id_union(ip, eofb);
	else
		match = xfs_inode_match_id(ip, eofb);
	if (!match)
		return false;

	/* skip the inode if the file size is too small */
	if ((eofb->eof_flags & XFS_EOF_FLAGS_MINFILESIZE) &&
	    XFS_ISIZE(ip) < eofb->eof_min_file_size)
		return false;

	return true;
}

STATIC int
xfs_inode_free_eofblocks(
	struct xfs_inode	*ip,
@@ -1463,7 +1493,6 @@ xfs_inode_free_eofblocks(
{
	struct xfs_eofblocks	*eofb = args;
	bool			wait;
	int			match;
	int			ret;

	wait = eofb && (eofb->eof_flags & XFS_EOF_FLAGS_SYNC);
@@ -1482,19 +1511,8 @@ xfs_inode_free_eofblocks(
	if (!wait && mapping_tagged(VFS_I(ip)->i_mapping, PAGECACHE_TAG_DIRTY))
		return 0;

	if (eofb) {
		if (eofb->eof_flags & XFS_EOF_FLAGS_UNION)
			match = xfs_inode_match_id_union(ip, eofb);
		else
			match = xfs_inode_match_id(ip, eofb);
		if (!match)
			return 0;

		/* skip the inode if the file size is too small */
		if (eofb->eof_flags & XFS_EOF_FLAGS_MINFILESIZE &&
		    XFS_ISIZE(ip) < eofb->eof_min_file_size)
	if (!xfs_inode_matches_eofb(ip, eofb))
		return 0;
	}

	/*
	 * If the caller is waiting, return -EAGAIN to keep the background
@@ -1737,26 +1755,14 @@ xfs_inode_free_cowblocks(
	void			*args)
{
	struct xfs_eofblocks	*eofb = args;
	int			match;
	int			ret = 0;

	if (!xfs_prep_free_cowblocks(ip))
		return 0;

	if (eofb) {
		if (eofb->eof_flags & XFS_EOF_FLAGS_UNION)
			match = xfs_inode_match_id_union(ip, eofb);
		else
			match = xfs_inode_match_id(ip, eofb);
		if (!match)
	if (!xfs_inode_matches_eofb(ip, eofb))
		return 0;

		/* skip the inode if the file size is too small */
		if (eofb->eof_flags & XFS_EOF_FLAGS_MINFILESIZE &&
		    XFS_ISIZE(ip) < eofb->eof_min_file_size)
			return 0;
	}

	/* Free the CoW blocks */
	xfs_ilock(ip, XFS_IOLOCK_EXCL);
	xfs_ilock(ip, XFS_MMAPLOCK_EXCL);