]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
xfs: refactor the directory data block bestfree checks
authorDarrick J. Wong <darrick.wong@oracle.com>
Mon, 6 Nov 2017 19:37:46 +0000 (11:37 -0800)
committerDarrick J. Wong <darrick.wong@oracle.com>
Thu, 9 Nov 2017 17:10:45 +0000 (09:10 -0800)
In a directory data block, the zeroth bestfree item must point to the
longest free space.  Therefore, when we check the bestfree block's
records against the data blocks, we only need to compare with bf[0] and
don't need the loop.

The weird loop was most probably the result of an earlier refactoring
gone bad.

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

index d4cd7661633d2d01533b516392a2c2ceb1e019ef..c8ca3fd6744587e2096434e293b7f780afe54176 100644 (file)
@@ -435,25 +435,15 @@ xfs_scrub_directory_check_freesp(
        struct xfs_buf                  *dbp,
        unsigned int                    len)
 {
-       struct xfs_dir2_data_free       *bf;
        struct xfs_dir2_data_free       *dfp;
-       int                             offset;
 
-       if (len == 0)
-               return;
+       dfp = sc->ip->d_ops->data_bestfree_p(dbp->b_addr);
 
-       bf = sc->ip->d_ops->data_bestfree_p(dbp->b_addr);
-       for (dfp = &bf[0]; dfp < &bf[XFS_DIR2_DATA_FD_COUNT]; dfp++) {
-               offset = be16_to_cpu(dfp->offset);
-               if (offset == 0)
-                       break;
-               if (len == be16_to_cpu(dfp->length))
-                       return;
-               /* Didn't find the best length in the bestfree data */
-               break;
-       }
+       if (len != be16_to_cpu(dfp->length))
+               xfs_scrub_fblock_set_corrupt(sc, XFS_DATA_FORK, lblk);
 
-       xfs_scrub_fblock_set_corrupt(sc, XFS_DATA_FORK, lblk);
+       if (len > 0 && be16_to_cpu(dfp->offset) == 0)
+               xfs_scrub_fblock_set_corrupt(sc, XFS_DATA_FORK, lblk);
 }
 
 /* Check free space info in a directory leaf1 block. */