]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
xfs: cleanup xchk_directory_data_bestfree
authorChristoph Hellwig <hch@lst.de>
Fri, 8 Nov 2019 23:05:33 +0000 (15:05 -0800)
committerDarrick J. Wong <darrick.wong@oracle.com>
Mon, 11 Nov 2019 00:54:23 +0000 (16:54 -0800)
Use an offset as the main means for iteration, and only do pointer
arithmetics to find the data/unused entries.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
fs/xfs/scrub/dir.c

index 4f201bd853e42542fa280cdd53046337d257bbbc..f07f6882877db52a6dedb6eec4fce3a83bb7fe5e 100644 (file)
@@ -330,14 +330,13 @@ xchk_directory_data_bestfree(
        struct xfs_dir2_data_free       *bf;
        struct xfs_mount                *mp = sc->mp;
        const struct xfs_dir_ops        *d_ops;
-       char                            *ptr;
-       char                            *endptr;
        u16                             tag;
        unsigned int                    nr_bestfrees = 0;
        unsigned int                    nr_frees = 0;
        unsigned int                    smallest_bestfree;
        int                             newlen;
-       int                             offset;
+       unsigned int                    offset;
+       unsigned int                    end;
        int                             error;
 
        d_ops = sc->ip->d_ops;
@@ -371,13 +370,13 @@ xchk_directory_data_bestfree(
                        xchk_fblock_set_corrupt(sc, XFS_DATA_FORK, lblk);
                        goto out_buf;
                }
-               dup = (struct xfs_dir2_data_unused *)(bp->b_addr + offset);
+               dup = bp->b_addr + offset;
                tag = be16_to_cpu(*xfs_dir2_data_unused_tag_p(dup));
 
                /* bestfree doesn't match the entry it points at? */
                if (dup->freetag != cpu_to_be16(XFS_DIR2_DATA_FREE_TAG) ||
                    be16_to_cpu(dup->length) != be16_to_cpu(dfp->length) ||
-                   tag != ((char *)dup - (char *)bp->b_addr)) {
+                   tag != offset) {
                        xchk_fblock_set_corrupt(sc, XFS_DATA_FORK, lblk);
                        goto out_buf;
                }
@@ -393,30 +392,30 @@ xchk_directory_data_bestfree(
        }
 
        /* Make sure the bestfrees are actually the best free spaces. */
-       ptr = (char *)d_ops->data_entry_p(bp->b_addr);
-       endptr = xfs_dir3_data_endp(mp->m_dir_geo, bp->b_addr);
+       offset = d_ops->data_entry_offset;
+       end = xfs_dir3_data_endp(mp->m_dir_geo, bp->b_addr) - bp->b_addr;
 
        /* Iterate the entries, stopping when we hit or go past the end. */
-       while (ptr < endptr) {
-               dup = (struct xfs_dir2_data_unused *)ptr;
+       while (offset < end) {
+               dup = bp->b_addr + offset;
+
                /* Skip real entries */
                if (dup->freetag != cpu_to_be16(XFS_DIR2_DATA_FREE_TAG)) {
-                       struct xfs_dir2_data_entry      *dep;
+                       struct xfs_dir2_data_entry *dep = bp->b_addr + offset;
 
-                       dep = (struct xfs_dir2_data_entry *)ptr;
                        newlen = d_ops->data_entsize(dep->namelen);
                        if (newlen <= 0) {
                                xchk_fblock_set_corrupt(sc, XFS_DATA_FORK,
                                                lblk);
                                goto out_buf;
                        }
-                       ptr += newlen;
+                       offset += newlen;
                        continue;
                }
 
                /* Spot check this free entry */
                tag = be16_to_cpu(*xfs_dir2_data_unused_tag_p(dup));
-               if (tag != ((char *)dup - (char *)bp->b_addr)) {
+               if (tag != offset) {
                        xchk_fblock_set_corrupt(sc, XFS_DATA_FORK, lblk);
                        goto out_buf;
                }
@@ -435,13 +434,13 @@ xchk_directory_data_bestfree(
                        xchk_fblock_set_corrupt(sc, XFS_DATA_FORK, lblk);
                        goto out_buf;
                }
-               ptr += newlen;
-               if (ptr <= endptr)
+               offset += newlen;
+               if (offset <= end)
                        nr_frees++;
        }
 
        /* We're required to fill all the space. */
-       if (ptr != endptr)
+       if (offset != end)
                xchk_fblock_set_corrupt(sc, XFS_DATA_FORK, lblk);
 
        /* Did we see at least as many free slots as there are bestfrees? */