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( ...@@ -1456,6 +1456,36 @@ xfs_inode_match_id_union(
return 0; 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 STATIC int
xfs_inode_free_eofblocks( xfs_inode_free_eofblocks(
struct xfs_inode *ip, struct xfs_inode *ip,
...@@ -1463,7 +1493,6 @@ xfs_inode_free_eofblocks( ...@@ -1463,7 +1493,6 @@ xfs_inode_free_eofblocks(
{ {
struct xfs_eofblocks *eofb = args; struct xfs_eofblocks *eofb = args;
bool wait; bool wait;
int match;
int ret; int ret;
wait = eofb && (eofb->eof_flags & XFS_EOF_FLAGS_SYNC); wait = eofb && (eofb->eof_flags & XFS_EOF_FLAGS_SYNC);
...@@ -1482,19 +1511,8 @@ xfs_inode_free_eofblocks( ...@@ -1482,19 +1511,8 @@ xfs_inode_free_eofblocks(
if (!wait && mapping_tagged(VFS_I(ip)->i_mapping, PAGECACHE_TAG_DIRTY)) if (!wait && mapping_tagged(VFS_I(ip)->i_mapping, PAGECACHE_TAG_DIRTY))
return 0; return 0;
if (eofb) { if (!xfs_inode_matches_eofb(ip, 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; return 0;
}
/* /*
* If the caller is waiting, return -EAGAIN to keep the background * If the caller is waiting, return -EAGAIN to keep the background
...@@ -1737,26 +1755,14 @@ xfs_inode_free_cowblocks( ...@@ -1737,26 +1755,14 @@ xfs_inode_free_cowblocks(
void *args) void *args)
{ {
struct xfs_eofblocks *eofb = args; struct xfs_eofblocks *eofb = args;
int match;
int ret = 0; int ret = 0;
if (!xfs_prep_free_cowblocks(ip)) if (!xfs_prep_free_cowblocks(ip))
return 0; return 0;
if (eofb) { if (!xfs_inode_matches_eofb(ip, 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; 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 */ /* Free the CoW blocks */
xfs_ilock(ip, XFS_IOLOCK_EXCL); xfs_ilock(ip, XFS_IOLOCK_EXCL);
xfs_ilock(ip, XFS_MMAPLOCK_EXCL); xfs_ilock(ip, XFS_MMAPLOCK_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