xfs: refactor eofb matching into a single helper
authorDarrick J. Wong <darrick.wong@oracle.com>
Thu, 21 May 2020 20:08:48 +0000 (13:08 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Wed, 27 May 2020 15:49:27 +0000 (08:49 -0700)
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>
fs/xfs/xfs_icache.c

index bd06edbac5ceddf7c98e30524a5e9de00e985f57..d10424a0015a07f54241e10d13d63ea63215e3d9 100644 (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);