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

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
......@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment