xfs: directory bestfree check should release buffers
authorDarrick J. Wong <darrick.wong@oracle.com>
Wed, 25 Mar 2020 03:10:56 +0000 (20:10 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Thu, 26 Mar 2020 15:19:24 +0000 (08:19 -0700)
When we're checking bestfree information in directory blocks, always
drop the block buffer at the end of the function.  We should always
release resources when we're done using them.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
fs/xfs/scrub/dir.c

index ef7cc8e..fe2a6e0 100644 (file)
@@ -503,7 +503,7 @@ xchk_directory_leaf1_bestfree(
        /* Read the free space block. */
        error = xfs_dir3_leaf_read(sc->tp, sc->ip, lblk, &bp);
        if (!xchk_fblock_process_error(sc, XFS_DATA_FORK, lblk, &error))
-               goto out;
+               return error;
        xchk_buffer_recheck(sc, bp);
 
        leaf = bp->b_addr;
@@ -568,9 +568,10 @@ xchk_directory_leaf1_bestfree(
                xchk_directory_check_freesp(sc, lblk, dbp, best);
                xfs_trans_brelse(sc->tp, dbp);
                if (sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT)
-                       goto out;
+                       break;
        }
 out:
+       xfs_trans_brelse(sc->tp, bp);
        return error;
 }
 
@@ -592,7 +593,7 @@ xchk_directory_free_bestfree(
        /* Read the free space block */
        error = xfs_dir2_free_read(sc->tp, sc->ip, lblk, &bp);
        if (!xchk_fblock_process_error(sc, XFS_DATA_FORK, lblk, &error))
-               goto out;
+               return error;
        xchk_buffer_recheck(sc, bp);
 
        if (xfs_sb_version_hascrc(&sc->mp->m_sb)) {
@@ -615,7 +616,7 @@ xchk_directory_free_bestfree(
                                0, &dbp);
                if (!xchk_fblock_process_error(sc, XFS_DATA_FORK, lblk,
                                &error))
-                       break;
+                       goto out;
                xchk_directory_check_freesp(sc, lblk, dbp, best);
                xfs_trans_brelse(sc->tp, dbp);
        }
@@ -623,6 +624,7 @@ xchk_directory_free_bestfree(
        if (freehdr.nused + stale != freehdr.nvalid)
                xchk_fblock_set_corrupt(sc, XFS_DATA_FORK, lblk);
 out:
+       xfs_trans_brelse(sc->tp, bp);
        return error;
 }