The branch main has been updated by mckusick:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=aa90fbed151de512ab6e59f75df009533a15751f

commit aa90fbed151de512ab6e59f75df009533a15751f
Author:     Kirk McKusick <mckus...@freebsd.org>
AuthorDate: 2025-01-28 01:39:45 +0000
Commit:     Kirk McKusick <mckus...@freebsd.org>
CommitDate: 2025-01-28 01:39:45 +0000

    Standardize the definition of a UFS dinode.
    
    Each program that operates on UFS on-disk inodes defines its own
    version of a dinode. They all (of necessity) define the same
    layout but use different names. This change adds a definition of
    a dinode (a union of a UFS1 on-disk inode and a UFS2 on-disk inode)
    as well as a dinodep (a union of a pointer to a UFS1 on-disk inode
    and a pointer to a UFS2 on-disk inode) in sys/ufs/ufs/dinode.h.
    It then deletes the definitions of dinode and dinodep in all the
    programs that operate on them and instead uses these standard
    definitions.
    
    No functional change intended.
    
    MFC-after: 1 week
---
 lib/libufs/libufs.h             |  8 ----
 sbin/dump/traverse.c            |  4 --
 sbin/fsck_ffs/fsck.h            |  4 --
 sbin/fsck_ffs/inode.c           | 12 ++++--
 sbin/newfs/mkfs.c               |  4 --
 sbin/quotacheck/quotacheck.c    |  4 --
 stand/libsa/ufs.c               | 11 ++----
 sys/ufs/ufs/dinode.h            | 20 ++++++++--
 sys/ufs/ufs/inode.h             |  9 ++---
 usr.sbin/makefs/ffs.c           | 22 +++++------
 usr.sbin/makefs/ffs/ufs_inode.h | 81 +++++++++++++++++++----------------------
 usr.sbin/quot/quot.c            |  4 --
 12 files changed, 82 insertions(+), 101 deletions(-)

diff --git a/lib/libufs/libufs.h b/lib/libufs/libufs.h
index 45ac97f43c06..b91866164e64 100644
--- a/lib/libufs/libufs.h
+++ b/lib/libufs/libufs.h
@@ -37,14 +37,6 @@
  */
 #define LIBUFS_BUFALIGN        128
 
-/*
- * libufs structures.
- */
-union dinodep {
-       struct ufs1_dinode *dp1;
-       struct ufs2_dinode *dp2;
-};
-
 /*
  * userland ufs disk.
  */
diff --git a/sbin/dump/traverse.c b/sbin/dump/traverse.c
index ccc2d0a625e9..d3bb671644e3 100644
--- a/sbin/dump/traverse.c
+++ b/sbin/dump/traverse.c
@@ -51,10 +51,6 @@
 
 #include "dump.h"
 
-union dinode {
-       struct ufs1_dinode dp1;
-       struct ufs2_dinode dp2;
-};
 #define        DIP(dp, field) \
        ((sblock->fs_magic == FS_UFS1_MAGIC) ? \
        (dp)->dp1.field : (dp)->dp2.field)
diff --git a/sbin/fsck_ffs/fsck.h b/sbin/fsck_ffs/fsck.h
index 312142eab9a7..32d1d93e05c8 100644
--- a/sbin/fsck_ffs/fsck.h
+++ b/sbin/fsck_ffs/fsck.h
@@ -75,10 +75,6 @@
 #define        INOBUFSIZE      64*1024 /* size of buffer to read inodes in 
pass1 */
 #define        ZEROBUFSIZE     (dev_bsize * 128) /* size of zero buffer used 
by -Z */
 
-union dinode {
-       struct ufs1_dinode dp1;
-       struct ufs2_dinode dp2;
-};
 #define        DIP(dp, field) \
        ((sblock.fs_magic == FS_UFS1_MAGIC) ? \
        (dp)->dp1.field : (dp)->dp2.field)
diff --git a/sbin/fsck_ffs/inode.c b/sbin/fsck_ffs/inode.c
index 5b004cd29c90..dca479f43831 100644
--- a/sbin/fsck_ffs/inode.c
+++ b/sbin/fsck_ffs/inode.c
@@ -429,6 +429,7 @@ void
 ginode(ino_t inumber, struct inode *ip)
 {
        ufs2_daddr_t iblk;
+       union dinodep dpp;
        struct ufs2_dinode *dp;
 
        if (inumber < UFS_ROOTINO || inumber >= maxino)
@@ -466,11 +467,12 @@ ginode(ino_t inumber, struct inode *ip)
        if (sblock.fs_magic == FS_UFS1_MAGIC) {
                ip->i_dp = (union dinode *)
                    &ip->i_bp->b_un.b_dinode1[inumber - ip->i_bp->b_index];
+               dpp.dp1 = (struct ufs1_dinode *)ip->i_dp;
                return;
        }
        ip->i_dp = (union dinode *)
            &ip->i_bp->b_un.b_dinode2[inumber - ip->i_bp->b_index];
-       dp = (struct ufs2_dinode *)ip->i_dp;
+       dpp.dp2 = dp = (struct ufs2_dinode *)ip->i_dp;
        /* Do not check hash of inodes being created */
        if (dp->di_mode != 0 && ffs_verify_dinode_ckhash(&sblock, dp)) {
                pwarn("INODE CHECK-HASH FAILED");
@@ -520,6 +522,7 @@ getnextinode(ino_t inumber, int rebuiltcg)
        mode_t mode;
        ufs2_daddr_t ndb, blk;
        union dinode *dp;
+       union dinodep dpp;
        struct inode ip;
        static caddr_t nextinop;
 
@@ -550,10 +553,13 @@ getnextinode(ino_t inumber, int rebuiltcg)
                nextinop = inobuf.b_un.b_buf;
        }
        dp = (union dinode *)nextinop;
-       if (sblock.fs_magic == FS_UFS1_MAGIC)
+       if (sblock.fs_magic == FS_UFS1_MAGIC) {
                nextinop += sizeof(struct ufs1_dinode);
-       else
+               dpp.dp1 = (struct ufs1_dinode *)dp;
+       } else {
                nextinop += sizeof(struct ufs2_dinode);
+               dpp.dp2 = (struct ufs2_dinode *)dp;
+       }
        if ((ckhashadd & CK_INODE) != 0) {
                ffs_update_dinode_ckhash(&sblock, (struct ufs2_dinode *)dp);
                dirty(&inobuf);
diff --git a/sbin/newfs/mkfs.c b/sbin/newfs/mkfs.c
index db1fe2991f6d..3715ef58ad0f 100644
--- a/sbin/newfs/mkfs.c
+++ b/sbin/newfs/mkfs.c
@@ -89,10 +89,6 @@ static struct        csum *fscs;
 #define        sblock  disk.d_fs
 #define        acg     disk.d_cg
 
-union dinode {
-       struct ufs1_dinode dp1;
-       struct ufs2_dinode dp2;
-};
 #define DIP(dp, field) \
        ((sblock.fs_magic == FS_UFS1_MAGIC) ? \
        (dp)->dp1.field : (dp)->dp2.field)
diff --git a/sbin/quotacheck/quotacheck.c b/sbin/quotacheck/quotacheck.c
index 1fb4789ae348..1871d2efc25a 100644
--- a/sbin/quotacheck/quotacheck.c
+++ b/sbin/quotacheck/quotacheck.c
@@ -77,10 +77,6 @@ union {
 long dev_bsize = 1;
 ino_t maxino;
 
-union dinode {
-       struct ufs1_dinode dp1;
-       struct ufs2_dinode dp2;
-};
 #define        DIP(dp, field) \
        ((sblock.fs_magic == FS_UFS1_MAGIC) ? \
        (dp)->dp1.field : (dp)->dp2.field)
diff --git a/stand/libsa/ufs.c b/stand/libsa/ufs.c
index 2c3b3764bd74..e1d540ed2321 100644
--- a/stand/libsa/ufs.c
+++ b/stand/libsa/ufs.c
@@ -110,10 +110,7 @@ struct fs_ops ufs_fsops = {
 struct file {
        off_t           f_seekp;        /* seek pointer */
        struct fs       *f_fs;          /* pointer to super-block */
-       union dinode {
-               struct ufs1_dinode di1;
-               struct ufs2_dinode di2;
-       }               f_di;           /* copy of on-disk inode */
+       union dinode    f_dp;           /* copy of on-disk inode */
        int             f_nindir[UFS_NIADDR];
                                        /* number of blocks mapped by
                                           indirect block at level i */
@@ -129,7 +126,7 @@ struct file {
 };
 #define DIP(fp, field) \
        ((fp)->f_fs->fs_magic == FS_UFS1_MAGIC ? \
-       (fp)->f_di.di1.field : (fp)->f_di.di2.field)
+       (fp)->f_dp.dp1.field : (fp)->f_dp.dp2.field)
 
 typedef struct ufs_mnt {
        char                    *um_dev;
@@ -185,10 +182,10 @@ read_inode(ino_t inumber, struct open_file *f)
        }
 
        if (fp->f_fs->fs_magic == FS_UFS1_MAGIC)
-               fp->f_di.di1 = ((struct ufs1_dinode *)buf)
+               fp->f_dp.dp1 = ((struct ufs1_dinode *)buf)
                    [ino_to_fsbo(fs, inumber)];
        else
-               fp->f_di.di2 = ((struct ufs2_dinode *)buf)
+               fp->f_dp.dp2 = ((struct ufs2_dinode *)buf)
                    [ino_to_fsbo(fs, inumber)];
 
        /*
diff --git a/sys/ufs/ufs/dinode.h b/sys/ufs/ufs/dinode.h
index 673e6f2555f1..5265326b0b5b 100644
--- a/sys/ufs/ufs/dinode.h
+++ b/sys/ufs/ufs/dinode.h
@@ -111,12 +111,13 @@ typedef int64_t ufs_time_t;
 #define        IFWHT           0160000         /* Whiteout. */
 
 /*
- * A dinode contains all the meta-data associated with a UFS2 file.
- * This structure defines the on-disk format of a dinode. Since
+ * Each UFS filesystem version defines the on-disk format of its dinode.
+ *
+ * A UFS2 dinode contains all the meta-data associated with a UFS2 file.
+ * This structure defines the on-disk format of a UFS2 dinode. Since
  * this structure describes an on-disk structure, all its fields
  * are defined by types with precise widths.
  */
-
 #define        UFS_NXADDR      2               /* External addresses in inode. 
*/
 #define        UFS_NDADDR      12              /* Direct addresses in inode. */
 #define        UFS_NIADDR      3               /* Indirect addresses in inode. 
*/
@@ -210,4 +211,17 @@ struct ufs1_dinode {
 
 #define        UFS_LINK_MAX    65500   /* leave a few spare for special values 
*/
 
+/*
+ * These structures hold or reference an on-disk dinode.
+ */
+union dinode {
+       struct ufs1_dinode dp1;
+       struct ufs2_dinode dp2;
+};
+
+union dinodep {
+       struct ufs1_dinode *dp1;
+       struct ufs2_dinode *dp2;
+};
+
 #endif /* _UFS_UFS_DINODE_H_ */
diff --git a/sys/ufs/ufs/inode.h b/sys/ufs/ufs/inode.h
index 85d3c4898318..a8a91e67b34a 100644
--- a/sys/ufs/ufs/inode.h
+++ b/sys/ufs/ufs/inode.h
@@ -88,10 +88,7 @@ struct inode {
        /*
         * The real copy of the on-disk inode.
         */
-       union {
-               struct ufs1_dinode *din1;       /* UFS1 on-disk dinode. */
-               struct ufs2_dinode *din2;       /* UFS2 on-disk dinode. */
-       } dinode_u;
+       union dinodep i_dp;     /* On-disk dinode */
 
        ino_t     i_number;     /* The identity of the inode. */
        uint32_t  i_flag;       /* flags, see below */
@@ -204,8 +201,8 @@ struct inode {
 
 #define        i_dirhash i_un.dirhash
 #define        i_snapblklist i_un.snapblklist
-#define        i_din1 dinode_u.din1
-#define        i_din2 dinode_u.din2
+#define        i_din1 i_dp.dp1
+#define        i_din2 i_dp.dp2
 
 #define        ITOUMP(ip)      ((ip)->i_ump)
 #define        ITODEV(ip)      (ITOUMP(ip)->um_dev)
diff --git a/usr.sbin/makefs/ffs.c b/usr.sbin/makefs/ffs.c
index ebfda7f929e4..aa5574c5201f 100644
--- a/usr.sbin/makefs/ffs.c
+++ b/usr.sbin/makefs/ffs.c
@@ -106,7 +106,7 @@
 #undef DIP
 #define DIP(dp, field) \
        ((ffs_opts->version == 1) ? \
-       (dp)->ffs1_din.di_##field : (dp)->ffs2_din.di_##field)
+       (dp)->dp1.di_##field : (dp)->dp2.di_##field)
 
 /*
  * Various file system defaults (cribbed from newfs(8)).
@@ -853,10 +853,10 @@ ffs_populate_dir(const char *dir, fsnode *root, fsinfo_t 
*fsopts)
 
                                /* build on-disk inode */
                if (ffs_opts->version == 1)
-                       membuf = ffs_build_dinode1(&din.ffs1_din, &dirbuf, cur,
+                       membuf = ffs_build_dinode1(&din.dp1, &dirbuf, cur,
                            root, fsopts);
                else
-                       membuf = ffs_build_dinode2(&din.ffs2_din, &dirbuf, cur,
+                       membuf = ffs_build_dinode2(&din.dp2, &dirbuf, cur,
                            root, fsopts);
 
                if (debug & DEBUG_FS_POPULATE_NODE) {
@@ -942,11 +942,11 @@ ffs_write_file(union dinode *din, uint32_t ino, void 
*buf, fsinfo_t *fsopts)
        in.i_number = ino;
        in.i_size = DIP(din, size);
        if (ffs_opts->version == 1)
-               memcpy(&in.i_din.ffs1_din, &din->ffs1_din,
-                   sizeof(in.i_din.ffs1_din));
+               memcpy(&in.i_din.dp1, &din->dp1,
+                   sizeof(in.i_din.dp1));
        else
-               memcpy(&in.i_din.ffs2_din, &din->ffs2_din,
-                   sizeof(in.i_din.ffs2_din));
+               memcpy(&in.i_din.dp2, &din->dp2,
+                   sizeof(in.i_din.dp2));
 
        if (DIP(din, size) == 0)
                goto write_inode_and_leave;             /* mmm, cheating */
@@ -1176,16 +1176,16 @@ ffs_write_inode(union dinode *dp, uint32_t ino, const 
fsinfo_t *fsopts)
        ffs_rdfs(d, fs->fs_bsize, buf, fsopts);
        if (fsopts->needswap) {
                if (ffs_opts->version == 1)
-                       ffs_dinode1_swap(&dp->ffs1_din,
+                       ffs_dinode1_swap(&dp->dp1,
                            &dp1[ino_to_fsbo(fs, ino)]);
                else
-                       ffs_dinode2_swap(&dp->ffs2_din,
+                       ffs_dinode2_swap(&dp->dp2,
                            &dp2[ino_to_fsbo(fs, ino)]);
        } else {
                if (ffs_opts->version == 1)
-                       dp1[ino_to_fsbo(fs, ino)] = dp->ffs1_din;
+                       dp1[ino_to_fsbo(fs, ino)] = dp->dp1;
                else
-                       dp2[ino_to_fsbo(fs, ino)] = dp->ffs2_din;
+                       dp2[ino_to_fsbo(fs, ino)] = dp->dp2;
        }
        ffs_wtfs(d, fs->fs_bsize, buf, fsopts);
        free(buf);
diff --git a/usr.sbin/makefs/ffs/ufs_inode.h b/usr.sbin/makefs/ffs/ufs_inode.h
index 050392624739..c960caea5c1e 100644
--- a/usr.sbin/makefs/ffs/ufs_inode.h
+++ b/usr.sbin/makefs/ffs/ufs_inode.h
@@ -37,11 +37,6 @@
  * SUCH DAMAGE.
  */
 
-union dinode {
-       struct ufs1_dinode ffs1_din;
-       struct ufs2_dinode ffs2_din;
-};
-
 struct inode {
        ino_t           i_number;       /* The identity of the inode. */
        struct vnode    *i_devvp;       /* vnode pointer (contains fsopts) */
@@ -50,45 +45,45 @@ struct inode {
        uint64_t        i_size;
 };
 
-#define        i_ffs1_atime            i_din.ffs1_din.di_atime
-#define        i_ffs1_atimensec        i_din.ffs1_din.di_atimensec
-#define        i_ffs1_blocks           i_din.ffs1_din.di_blocks
-#define        i_ffs1_ctime            i_din.ffs1_din.di_ctime
-#define        i_ffs1_ctimensec        i_din.ffs1_din.di_ctimensec
-#define        i_ffs1_db               i_din.ffs1_din.di_db
-#define        i_ffs1_flags            i_din.ffs1_din.di_flags
-#define        i_ffs1_gen              i_din.ffs1_din.di_gen
-#define        i_ffs11_gid             i_din.ffs1_din.di_gid
-#define        i_ffs1_ib               i_din.ffs1_din.di_ib
-#define        i_ffs1_mode             i_din.ffs1_din.di_mode
-#define        i_ffs1_mtime            i_din.ffs1_din.di_mtime
-#define        i_ffs1_mtimensec        i_din.ffs1_din.di_mtimensec
-#define        i_ffs1_nlink            i_din.ffs1_din.di_nlink
-#define        i_ffs1_rdev             i_din.ffs1_din.di_rdev
-#define        i_ffs1_shortlink        i_din.ffs1_din.di_shortlink
-#define        i_ffs1_size             i_din.ffs1_din.di_size
-#define        i_ffs1_uid              i_din.ffs1_din.di_uid
+#define        i_ffs1_atime            i_din.dp1.di_atime
+#define        i_ffs1_atimensec        i_din.dp1.di_atimensec
+#define        i_ffs1_blocks           i_din.dp1.di_blocks
+#define        i_ffs1_ctime            i_din.dp1.di_ctime
+#define        i_ffs1_ctimensec        i_din.dp1.di_ctimensec
+#define        i_ffs1_db               i_din.dp1.di_db
+#define        i_ffs1_flags            i_din.dp1.di_flags
+#define        i_ffs1_gen              i_din.dp1.di_gen
+#define        i_ffs11_gid             i_din.dp1.di_gid
+#define        i_ffs1_ib               i_din.dp1.di_ib
+#define        i_ffs1_mode             i_din.dp1.di_mode
+#define        i_ffs1_mtime            i_din.dp1.di_mtime
+#define        i_ffs1_mtimensec        i_din.dp1.di_mtimensec
+#define        i_ffs1_nlink            i_din.dp1.di_nlink
+#define        i_ffs1_rdev             i_din.dp1.di_rdev
+#define        i_ffs1_shortlink        i_din.dp1.di_shortlink
+#define        i_ffs1_size             i_din.dp1.di_size
+#define        i_ffs1_uid              i_din.dp1.di_uid
 
-#define        i_ffs2_atime            i_din.ffs2_din.di_atime
-#define        i_ffs2_atimensec        i_din.ffs2_din.di_atimensec
-#define        i_ffs2_blocks           i_din.ffs2_din.di_blocks
-#define        i_ffs2_ctime            i_din.ffs2_din.di_ctime
-#define        i_ffs2_ctimensec        i_din.ffs2_din.di_ctimensec
-#define        i_ffs2_birthtime        i_din.ffs2_din.di_birthtime
-#define        i_ffs2_birthnsec        i_din.ffs2_din.di_birthnsec
-#define        i_ffs2_db               i_din.ffs2_din.di_db
-#define        i_ffs2_flags            i_din.ffs2_din.di_flags
-#define        i_ffs2_gen              i_din.ffs2_din.di_gen
-#define        i_ffs21_gid             i_din.ffs2_din.di_gid
-#define        i_ffs2_ib               i_din.ffs2_din.di_ib
-#define        i_ffs2_mode             i_din.ffs2_din.di_mode
-#define        i_ffs2_mtime            i_din.ffs2_din.di_mtime
-#define        i_ffs2_mtimensec        i_din.ffs2_din.di_mtimensec
-#define        i_ffs2_nlink            i_din.ffs2_din.di_nlink
-#define        i_ffs2_rdev             i_din.ffs2_din.di_rdev
-#define        i_ffs2_shortlink        i_din.ffs2_din.di_shortlink
-#define        i_ffs2_size             i_din.ffs2_din.di_size
-#define        i_ffs2_uid              i_din.ffs2_din.di_uid
+#define        i_ffs2_atime            i_din.dp2.di_atime
+#define        i_ffs2_atimensec        i_din.dp2.di_atimensec
+#define        i_ffs2_blocks           i_din.dp2.di_blocks
+#define        i_ffs2_ctime            i_din.dp2.di_ctime
+#define        i_ffs2_ctimensec        i_din.dp2.di_ctimensec
+#define        i_ffs2_birthtime        i_din.dp2.di_birthtime
+#define        i_ffs2_birthnsec        i_din.dp2.di_birthnsec
+#define        i_ffs2_db               i_din.dp2.di_db
+#define        i_ffs2_flags            i_din.dp2.di_flags
+#define        i_ffs2_gen              i_din.dp2.di_gen
+#define        i_ffs21_gid             i_din.dp2.di_gid
+#define        i_ffs2_ib               i_din.dp2.di_ib
+#define        i_ffs2_mode             i_din.dp2.di_mode
+#define        i_ffs2_mtime            i_din.dp2.di_mtime
+#define        i_ffs2_mtimensec        i_din.dp2.di_mtimensec
+#define        i_ffs2_nlink            i_din.dp2.di_nlink
+#define        i_ffs2_rdev             i_din.dp2.di_rdev
+#define        i_ffs2_shortlink        i_din.dp2.di_shortlink
+#define        i_ffs2_size             i_din.dp2.di_size
+#define        i_ffs2_uid              i_din.dp2.di_uid
 
 #undef DIP
 #define DIP(ip, field) \
diff --git a/usr.sbin/quot/quot.c b/usr.sbin/quot/quot.c
index 7ca8110bef76..4152c498371a 100644
--- a/usr.sbin/quot/quot.c
+++ b/usr.sbin/quot/quot.c
@@ -97,10 +97,6 @@ static void  quot(char *, char *);
        (((fs)->fs_magic == FS_UFS1_MAGIC ? sizeof(struct ufs1_dinode) : \
        sizeof(struct ufs2_dinode)) * INOCNT(fs))
 
-union dinode {
-       struct ufs1_dinode dp1;
-       struct ufs2_dinode dp2;
-};
 #define        DIP(fs, dp, field) \
        (((fs)->fs_magic == FS_UFS1_MAGIC) ? \
        (dp)->dp1.field : (dp)->dp2.field)

Reply via email to