]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: devirtualize ->sf_get_ino and ->sf_put_ino
authorChristoph Hellwig <hch@lst.de>
Wed, 22 Jan 2020 16:29:42 +0000 (11:29 -0500)
committerEric Sandeen <sandeen@redhat.com>
Wed, 22 Jan 2020 16:29:42 +0000 (11:29 -0500)
Source kernel commit: 93b1e96a42006813e58e5052718f7b24a9312258

Replace the ->sf_get_ino and ->sf_put_ino dir ops methods with directly
called xfs_dir2_sf_get_ino and xfs_dir2_sf_put_ino helpers that take care
of the difference between the directory format with and without the file
type field.  Also move xfs_dir2_sf_get_parent_ino and
xfs_dir2_sf_put_parent_ino to xfs_dir2_sf.c with the rest of the
low-level short form entry handling and use XFS_MAXINUMBER istead of
opencoded constants.

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>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
db/check.c
db/metadump.c
libxfs/libxfs_api_defs.h
libxfs/xfs_da_format.c
libxfs/xfs_dir2.h
libxfs/xfs_dir2_block.c
libxfs/xfs_dir2_priv.h
libxfs/xfs_dir2_sf.c
logprint/log_misc.c
repair/dir2.c
repair/phase6.c

index 35e4bea471cfad9d21b33fe0f616a369264c397d..7098defabb5033394447206a83cb617b9c0c6867 100644 (file)
@@ -3638,7 +3638,7 @@ process_sf_dir_v2(
                        error++;
                        break;
                }
-               lino = M_DIROPS(mp)->sf_get_ino(sf, sfe);
+               lino = libxfs_dir2_sf_get_ino(mp, sf, sfe);
                if (lino > XFS_DIR2_MAX_SHORT_INUM)
                        i8++;
                cid = find_inode(lino, 1);
index 324647275f90cd6e4d1377dfced8dd8ef22c1ec1..01518377d4c94bedb8d7414dd4bdab162e04e874 100644 (file)
@@ -1282,7 +1282,7 @@ process_sf_dir(
 
                if (obfuscate)
                        generate_obfuscated_name(
-                                        M_DIROPS(mp)->sf_get_ino(sfp, sfep),
+                                        libxfs_dir2_sf_get_ino(mp, sfp, sfep),
                                         namelen, &sfep->name[0]);
 
                sfep = (xfs_dir2_sf_entry_t *)((char *)sfep +
index 443e0ec86d6c388daf58e116bbcbf6def730da8c..3ec24798500a4f32beb3e21669937d0ae7ea555c 100644 (file)
@@ -89,6 +89,8 @@
 #define xfs_dir2_sf_put_parent_ino     libxfs_dir2_sf_put_parent_ino
 #define xfs_dir2_sf_entsize            libxfs_dir2_sf_entsize
 #define xfs_dir2_sf_nextentry          libxfs_dir2_sf_nextentry
+#define xfs_dir2_sf_get_ino            libxfs_dir2_sf_get_ino
+#define xfs_dir2_sf_put_ino            libxfs_dir2_sf_put_ino
 #define xfs_dir2_namecheck             libxfs_dir2_namecheck
 #define xfs_da_get_buf                 libxfs_da_get_buf
 
index fe93f5405e62d936bbb8bea0b1aa96f5847caeb6..c58efe0cec22134d8ebfb15cd77a15674a2d0d5c 100644 (file)
@@ -58,94 +58,6 @@ xfs_dir3_sfe_put_ftype(
        sfep->name[sfep->namelen] = ftype;
 }
 
-/*
- * Inode numbers in short-form directories can come in two versions,
- * either 4 bytes or 8 bytes wide.  These helpers deal with the
- * two forms transparently by looking at the headers i8count field.
- *
- * For 64-bit inode number the most significant byte must be zero.
- */
-static xfs_ino_t
-xfs_dir2_sf_get_ino(
-       struct xfs_dir2_sf_hdr  *hdr,
-       uint8_t                 *from)
-{
-       if (hdr->i8count)
-               return get_unaligned_be64(from) & 0x00ffffffffffffffULL;
-       else
-               return get_unaligned_be32(from);
-}
-
-static void
-xfs_dir2_sf_put_ino(
-       struct xfs_dir2_sf_hdr  *hdr,
-       uint8_t                 *to,
-       xfs_ino_t               ino)
-{
-       ASSERT((ino & 0xff00000000000000ULL) == 0);
-
-       if (hdr->i8count)
-               put_unaligned_be64(ino, to);
-       else
-               put_unaligned_be32(ino, to);
-}
-
-xfs_ino_t
-xfs_dir2_sf_get_parent_ino(
-       struct xfs_dir2_sf_hdr  *hdr)
-{
-       return xfs_dir2_sf_get_ino(hdr, hdr->parent);
-}
-
-void
-xfs_dir2_sf_put_parent_ino(
-       struct xfs_dir2_sf_hdr  *hdr,
-       xfs_ino_t               ino)
-{
-       xfs_dir2_sf_put_ino(hdr, hdr->parent, ino);
-}
-
-/*
- * In short-form directory entries the inode numbers are stored at variable
- * offset behind the entry name. If the entry stores a filetype value, then it
- * sits between the name and the inode number. Hence the inode numbers may only
- * be accessed through the helpers below.
- */
-static xfs_ino_t
-xfs_dir2_sfe_get_ino(
-       struct xfs_dir2_sf_hdr  *hdr,
-       struct xfs_dir2_sf_entry *sfep)
-{
-       return xfs_dir2_sf_get_ino(hdr, &sfep->name[sfep->namelen]);
-}
-
-static void
-xfs_dir2_sfe_put_ino(
-       struct xfs_dir2_sf_hdr  *hdr,
-       struct xfs_dir2_sf_entry *sfep,
-       xfs_ino_t               ino)
-{
-       xfs_dir2_sf_put_ino(hdr, &sfep->name[sfep->namelen], ino);
-}
-
-static xfs_ino_t
-xfs_dir3_sfe_get_ino(
-       struct xfs_dir2_sf_hdr  *hdr,
-       struct xfs_dir2_sf_entry *sfep)
-{
-       return xfs_dir2_sf_get_ino(hdr, &sfep->name[sfep->namelen + 1]);
-}
-
-static void
-xfs_dir3_sfe_put_ino(
-       struct xfs_dir2_sf_hdr  *hdr,
-       struct xfs_dir2_sf_entry *sfep,
-       xfs_ino_t               ino)
-{
-       xfs_dir2_sf_put_ino(hdr, &sfep->name[sfep->namelen + 1], ino);
-}
-
-
 /*
  * Directory data block operations
  */
@@ -361,8 +273,6 @@ xfs_dir3_data_unused_p(struct xfs_dir2_data_hdr *hdr)
 static const struct xfs_dir_ops xfs_dir2_ops = {
        .sf_get_ftype = xfs_dir2_sfe_get_ftype,
        .sf_put_ftype = xfs_dir2_sfe_put_ftype,
-       .sf_get_ino = xfs_dir2_sfe_get_ino,
-       .sf_put_ino = xfs_dir2_sfe_put_ino,
 
        .data_entsize = xfs_dir2_data_entsize,
        .data_get_ftype = xfs_dir2_data_get_ftype,
@@ -388,8 +298,6 @@ static const struct xfs_dir_ops xfs_dir2_ops = {
 static const struct xfs_dir_ops xfs_dir2_ftype_ops = {
        .sf_get_ftype = xfs_dir3_sfe_get_ftype,
        .sf_put_ftype = xfs_dir3_sfe_put_ftype,
-       .sf_get_ino = xfs_dir3_sfe_get_ino,
-       .sf_put_ino = xfs_dir3_sfe_put_ino,
 
        .data_entsize = xfs_dir3_data_entsize,
        .data_get_ftype = xfs_dir3_data_get_ftype,
@@ -415,8 +323,6 @@ static const struct xfs_dir_ops xfs_dir2_ftype_ops = {
 static const struct xfs_dir_ops xfs_dir3_ops = {
        .sf_get_ftype = xfs_dir3_sfe_get_ftype,
        .sf_put_ftype = xfs_dir3_sfe_put_ftype,
-       .sf_get_ino = xfs_dir3_sfe_get_ino,
-       .sf_put_ino = xfs_dir3_sfe_put_ino,
 
        .data_entsize = xfs_dir3_data_entsize,
        .data_get_ftype = xfs_dir3_data_get_ftype,
index c99f0ad6607aad1ac96f93c79c41e26fd0cbc3dc..049d844d6a181c79121805e06973a934083ca21f 100644 (file)
@@ -35,11 +35,6 @@ struct xfs_dir_ops {
        uint8_t (*sf_get_ftype)(struct xfs_dir2_sf_entry *sfep);
        void    (*sf_put_ftype)(struct xfs_dir2_sf_entry *sfep,
                                uint8_t ftype);
-       xfs_ino_t (*sf_get_ino)(struct xfs_dir2_sf_hdr *hdr,
-                               struct xfs_dir2_sf_entry *sfep);
-       void    (*sf_put_ino)(struct xfs_dir2_sf_hdr *hdr,
-                             struct xfs_dir2_sf_entry *sfep,
-                             xfs_ino_t ino);
 
        int     (*data_entsize)(int len);
        uint8_t (*data_get_ftype)(struct xfs_dir2_data_entry *dep);
index e5599e767337bcc8ef6cfc231821f9acbf2cf41f..63e07cc9e5e7da49f698a1d26c27b45d8f173ec5 100644 (file)
@@ -1205,7 +1205,7 @@ xfs_dir2_sf_to_block(
                 * Copy a real entry.
                 */
                dep = (xfs_dir2_data_entry_t *)((char *)hdr + newoffset);
-               dep->inumber = cpu_to_be64(dp->d_ops->sf_get_ino(sfp, sfep));
+               dep->inumber = cpu_to_be64(xfs_dir2_sf_get_ino(mp, sfp, sfep));
                dep->namelen = sfep->namelen;
                dp->d_ops->data_put_ftype(dep, dp->d_ops->sf_get_ftype(sfep));
                memcpy(dep->name, sfep->name, dep->namelen);
index 4631ebb9d8e584178d26da71615c08276fc8ad5c..0271a6b206257830b2ba81cb6d50922963e7b5fa 100644 (file)
@@ -145,6 +145,10 @@ extern int xfs_dir2_free_read(struct xfs_trans *tp, struct xfs_inode *dp,
                xfs_dablk_t fbno, struct xfs_buf **bpp);
 
 /* xfs_dir2_sf.c */
+xfs_ino_t xfs_dir2_sf_get_ino(struct xfs_mount *mp, struct xfs_dir2_sf_hdr *hdr,
+               struct xfs_dir2_sf_entry *sfep);
+void xfs_dir2_sf_put_ino(struct xfs_mount *mp, struct xfs_dir2_sf_hdr *hdr,
+               struct xfs_dir2_sf_entry *sfep, xfs_ino_t ino);
 xfs_ino_t xfs_dir2_sf_get_parent_ino(struct xfs_dir2_sf_hdr *hdr);
 void xfs_dir2_sf_put_parent_ino(struct xfs_dir2_sf_hdr *hdr, xfs_ino_t ino);
 struct xfs_dir2_sf_entry *xfs_dir2_sf_nextentry(struct xfs_mount *mp,
index bf5c65492577b2312b3ba4a8c2968f246082ad4c..0d8f692b600e88bd2b341c169a19b74be67b75b8 100644 (file)
@@ -62,6 +62,70 @@ xfs_dir2_sf_nextentry(
        return (void *)sfep + xfs_dir2_sf_entsize(mp, hdr, sfep->namelen);
 }
 
+/*
+ * In short-form directory entries the inode numbers are stored at variable
+ * offset behind the entry name. If the entry stores a filetype value, then it
+ * sits between the name and the inode number.  The actual inode numbers can
+ * come in two formats as well, either 4 bytes or 8 bytes wide.
+ */
+xfs_ino_t
+xfs_dir2_sf_get_ino(
+       struct xfs_mount                *mp,
+       struct xfs_dir2_sf_hdr          *hdr,
+       struct xfs_dir2_sf_entry        *sfep)
+{
+       uint8_t                         *from = sfep->name + sfep->namelen;
+
+       if (xfs_sb_version_hasftype(&mp->m_sb))
+               from++;
+
+       if (!hdr->i8count)
+               return get_unaligned_be32(from);
+       return get_unaligned_be64(from) & XFS_MAXINUMBER;
+}
+
+void
+xfs_dir2_sf_put_ino(
+       struct xfs_mount                *mp,
+       struct xfs_dir2_sf_hdr          *hdr,
+       struct xfs_dir2_sf_entry        *sfep,
+       xfs_ino_t                       ino)
+{
+       uint8_t                         *to = sfep->name + sfep->namelen;
+
+       ASSERT(ino <= XFS_MAXINUMBER);
+
+       if (xfs_sb_version_hasftype(&mp->m_sb))
+               to++;
+
+       if (hdr->i8count)
+               put_unaligned_be64(ino, to);
+       else
+               put_unaligned_be32(ino, to);
+}
+
+xfs_ino_t
+xfs_dir2_sf_get_parent_ino(
+       struct xfs_dir2_sf_hdr  *hdr)
+{
+       if (!hdr->i8count)
+               return get_unaligned_be32(hdr->parent);
+       return get_unaligned_be64(hdr->parent) & XFS_MAXINUMBER;
+}
+
+void
+xfs_dir2_sf_put_parent_ino(
+       struct xfs_dir2_sf_hdr          *hdr,
+       xfs_ino_t                       ino)
+{
+       ASSERT(ino <= XFS_MAXINUMBER);
+
+       if (hdr->i8count)
+               put_unaligned_be64(ino, hdr->parent);
+       else
+               put_unaligned_be32(ino, hdr->parent);
+}
+
 /*
  * Given a block directory (dp/block), calculate its size as a shortform (sf)
  * directory and a header for the sf directory, if it will fit it the
@@ -239,7 +303,7 @@ xfs_dir2_block_to_sf(
                                (xfs_dir2_data_aoff_t)
                                ((char *)dep - (char *)hdr));
                        memcpy(sfep->name, dep->name, dep->namelen);
-                       dp->d_ops->sf_put_ino(sfp, sfep,
+                       xfs_dir2_sf_put_ino(mp, sfp, sfep,
                                              be64_to_cpu(dep->inumber));
                        dp->d_ops->sf_put_ftype(sfep,
                                        dp->d_ops->data_get_ftype(dep));
@@ -406,7 +470,7 @@ xfs_dir2_sf_addname_easy(
        sfep->namelen = args->namelen;
        xfs_dir2_sf_put_offset(sfep, offset);
        memcpy(sfep->name, args->name, sfep->namelen);
-       dp->d_ops->sf_put_ino(sfp, sfep, args->inumber);
+       xfs_dir2_sf_put_ino(mp, sfp, sfep, args->inumber);
        dp->d_ops->sf_put_ftype(sfep, args->filetype);
 
        /*
@@ -496,7 +560,7 @@ xfs_dir2_sf_addname_hard(
        sfep->namelen = args->namelen;
        xfs_dir2_sf_put_offset(sfep, offset);
        memcpy(sfep->name, args->name, sfep->namelen);
-       dp->d_ops->sf_put_ino(sfp, sfep, args->inumber);
+       xfs_dir2_sf_put_ino(mp, sfp, sfep, args->inumber);
        dp->d_ops->sf_put_ftype(sfep, args->filetype);
        sfp->count++;
        if (args->inumber > XFS_DIR2_MAX_SHORT_INUM && !objchange)
@@ -613,7 +677,7 @@ xfs_dir2_sf_check(
             i < sfp->count;
             i++, sfep = xfs_dir2_sf_nextentry(dp->i_mount, sfp, sfep)) {
                ASSERT(xfs_dir2_sf_get_offset(sfep) >= offset);
-               ino = dp->d_ops->sf_get_ino(sfp, sfep);
+               ino = xfs_dir2_sf_get_ino(dp->i_mount, sfp, sfep);
                i8count += ino > XFS_DIR2_MAX_SHORT_INUM;
                offset =
                        xfs_dir2_sf_get_offset(sfep) +
@@ -705,7 +769,7 @@ xfs_dir2_sf_verify(
                        return __this_address;
 
                /* Check the inode number. */
-               ino = dops->sf_get_ino(sfp, sfep);
+               ino = xfs_dir2_sf_get_ino(mp, sfp, sfep);
                i8count += ino > XFS_DIR2_MAX_SHORT_INUM;
                error = xfs_dir_ino_validate(mp, ino);
                if (error)
@@ -848,7 +912,7 @@ xfs_dir2_sf_lookup(
                                                                sfep->namelen);
                if (cmp != XFS_CMP_DIFFERENT && cmp != args->cmpresult) {
                        args->cmpresult = cmp;
-                       args->inumber = dp->d_ops->sf_get_ino(sfp, sfep);
+                       args->inumber = xfs_dir2_sf_get_ino(mp, sfp, sfep);
                        args->filetype = dp->d_ops->sf_get_ftype(sfep);
                        if (cmp == XFS_CMP_EXACT)
                                return -EEXIST;
@@ -901,7 +965,7 @@ xfs_dir2_sf_removename(
             i++, sfep = xfs_dir2_sf_nextentry(mp, sfp, sfep)) {
                if (xfs_da_compname(args, sfep->name, sfep->namelen) ==
                                                                XFS_CMP_EXACT) {
-                       ASSERT(dp->d_ops->sf_get_ino(sfp, sfep) ==
+                       ASSERT(xfs_dir2_sf_get_ino(mp, sfp, sfep) ==
                               args->inumber);
                        break;
                }
@@ -1016,9 +1080,10 @@ xfs_dir2_sf_replace(
                     i++, sfep = xfs_dir2_sf_nextentry(mp, sfp, sfep)) {
                        if (xfs_da_compname(args, sfep->name, sfep->namelen) ==
                                                                XFS_CMP_EXACT) {
-                               ino = dp->d_ops->sf_get_ino(sfp, sfep);
+                               ino = xfs_dir2_sf_get_ino(mp, sfp, sfep);
                                ASSERT(args->inumber != ino);
-                               dp->d_ops->sf_put_ino(sfp, sfep, args->inumber);
+                               xfs_dir2_sf_put_ino(mp, sfp, sfep,
+                                               args->inumber);
                                dp->d_ops->sf_put_ftype(sfep, args->filetype);
                                break;
                        }
@@ -1123,8 +1188,8 @@ xfs_dir2_sf_toino4(
                sfep->namelen = oldsfep->namelen;
                memcpy(sfep->offset, oldsfep->offset, sizeof(sfep->offset));
                memcpy(sfep->name, oldsfep->name, sfep->namelen);
-               dp->d_ops->sf_put_ino(sfp, sfep,
-                                     dp->d_ops->sf_get_ino(oldsfp, oldsfep));
+               xfs_dir2_sf_put_ino(mp, sfp, sfep,
+                               xfs_dir2_sf_get_ino(mp, oldsfp, oldsfep));
                dp->d_ops->sf_put_ftype(sfep, dp->d_ops->sf_get_ftype(oldsfep));
        }
        /*
@@ -1195,8 +1260,8 @@ xfs_dir2_sf_toino8(
                sfep->namelen = oldsfep->namelen;
                memcpy(sfep->offset, oldsfep->offset, sizeof(sfep->offset));
                memcpy(sfep->name, oldsfep->name, sfep->namelen);
-               dp->d_ops->sf_put_ino(sfp, sfep,
-                                     dp->d_ops->sf_get_ino(oldsfp, oldsfep));
+               xfs_dir2_sf_put_ino(mp, sfp, sfep,
+                               xfs_dir2_sf_get_ino(mp, oldsfp, oldsfep));
                dp->d_ops->sf_put_ftype(sfep, dp->d_ops->sf_get_ftype(oldsfep));
        }
        /*
index 149f5bf30c0b9d5ca155e11ffec53007f7a0e1af..5b41bc8cbd6a1c6533f9ef5949ccb3ffe87c00ce 100644 (file)
@@ -489,7 +489,7 @@ xlog_print_dir2_sf(
        count = sfp->count;
        sfep = xfs_dir2_sf_firstentry(sfp);
        for (i = 0; i < count; i++) {
-               ino = M_DIROPS(log->l_mp)->sf_get_ino(sfp, sfep);
+               ino = libxfs_dir2_sf_get_ino(log->l_mp, sfp, sfep);
                memmove(namebuf, (sfep->name), sfep->namelen);
                namebuf[sfep->namelen] = '\0';
                printf(_("%s ino 0x%llx namelen %d\n"),
index 2679f190c5c0636e9c8001a437d348d9e3571bc6..b8a45461005801344b6cb3858204abe4fa250509 100644 (file)
@@ -93,8 +93,8 @@ process_sf_dir2_fixi8(
                xfs_dir2_sf_put_offset(newsfep,
                        xfs_dir2_sf_get_offset(oldsfep));
                memmove(newsfep->name, oldsfep->name, newsfep->namelen);
-               ino = M_DIROPS(mp)->sf_get_ino(oldsfp, oldsfep);
-               M_DIROPS(mp)->sf_put_ino(newsfp, newsfep, ino);
+               ino = libxfs_dir2_sf_get_ino(mp, oldsfp, oldsfep);
+               libxfs_dir2_sf_put_ino(mp, newsfp, newsfep, ino);
                oldsfep = libxfs_dir2_sf_nextentry(mp, oldsfp, oldsfep);
                newsfep = libxfs_dir2_sf_nextentry(mp, newsfp, newsfep);
        }
@@ -200,7 +200,7 @@ process_sf_dir2(
                sfep = next_sfep;
                junkit = 0;
                bad_sfnamelen = 0;
-               lino = M_DIROPS(mp)->sf_get_ino(sfp, sfep);
+               lino = libxfs_dir2_sf_get_ino(mp, sfp, sfep);
                /*
                 * if entry points to self, junk it since only '.' or '..'
                 * should do that and shortform dirs don't contain either
index 12a00a3bd69eb3125761ed5e2ac78c573d4b7821..7350e976192e33405fa5ea08177c5dfd76bfa230 100644 (file)
@@ -2588,7 +2588,7 @@ shortform_dir2_entry_check(xfs_mount_t    *mp,
                        sfep = next_sfep, i++)  {
                bad_sfnamelen = 0;
 
-               lino = M_DIROPS(mp)->sf_get_ino(sfp, sfep);
+               lino = libxfs_dir2_sf_get_ino(mp, sfp, sfep);
 
                namelen = sfep->namelen;