mirror of
https://github.com/torvalds/linux.git
synced 2024-11-26 22:21:42 +00:00
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:
parent
8921a0fda5
commit
a91bf9928e
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user