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: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
Darrick J. Wong 2020-05-21 13:08:48 -07:00
parent 8921a0fda5
commit a91bf9928e

View File

@ -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)
return 0;
}
if (!xfs_inode_matches_eofb(ip, eofb))
return 0;
/*
* If the caller is waiting, return -EAGAIN to keep the background
@ -1737,25 +1755,13 @@ 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)
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;
}
if (!xfs_inode_matches_eofb(ip, eofb))
return 0;
/* Free the CoW blocks */
xfs_ilock(ip, XFS_IOLOCK_EXCL);