Index | Thread | Search

From:
Rafael Sadowski <rafael@sizeofvoid.org>
Subject:
Standardize the definition of a UFS dinode
To:
tech@openbsd.org
Date:
Wed, 4 Jun 2025 16:43:47 +0200

Download raw body.

Thread
  • Rafael Sadowski:

    Standardize the definition of a UFS dinode

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)
in sys/ufs/ufs/dinode.h.

This is based on Kirk McKusick's commit
aa90fbed151de512ab6e59f75df009533a15751f in FreeBSD.

Unfortunately "union dinode_u" can't be standardize because it also
includes ext2fs_dinode.

Feedback? OK?

diff --git a/sbin/dump/traverse.c b/sbin/dump/traverse.c
index 083225c3f8d..40a5122f512 100644
--- a/sbin/dump/traverse.c
+++ b/sbin/dump/traverse.c
@@ -53,10 +53,6 @@
 
 extern struct disklabel lab;
 
-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 8af2e0a7759..0869a4b6e7c 100644
--- a/sbin/fsck_ffs/fsck.h
+++ b/sbin/fsck_ffs/fsck.h
@@ -46,11 +46,6 @@
 #define	MAXBUFSPACE	40*1024	/* maximum space to allocate to buffers */
 #define	INOBUFSIZE	56*1024	/* size of buffer to read inodes in pass1 */
 
-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/growfs/growfs.c b/sbin/growfs/growfs.c
index 17adf7dc20f..1337edc96a9 100644
--- a/sbin/growfs/growfs.c
+++ b/sbin/growfs/growfs.c
@@ -96,10 +96,6 @@ static char	ablk[MAXBSIZE];		/* a block */
 
 static struct csum	*fscs;	/* cylinder summary */
 
-union dinode {
-	struct ufs1_dinode dp1;
-	struct ufs2_dinode dp2;
-};
 #define	DIP(dp, field) \
 	((sblock.fs_magic == FS_UFS1_MAGIC) ? \
 	(uint32_t)(dp)->dp1.field : (dp)->dp2.field)
diff --git a/sbin/newfs/mkfs.c b/sbin/newfs/mkfs.c
index 321b83c8557..89db6435802 100644
--- a/sbin/newfs/mkfs.c
+++ b/sbin/newfs/mkfs.c
@@ -118,11 +118,6 @@ union cg_u {
 } *cgun;
 #define acg	cgun->cg
 
-union dinode {
-	struct ufs1_dinode dp1;
-	struct ufs2_dinode dp2;
-};
-
 int	fsi, fso;
 
 static caddr_t iobuf;
diff --git a/sbin/quotacheck/quotacheck.c b/sbin/quotacheck/quotacheck.c
index f2423511b1d..bf791121002 100644
--- a/sbin/quotacheck/quotacheck.c
+++ b/sbin/quotacheck/quotacheck.c
@@ -75,10 +75,6 @@ union {
 
 long 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/sys/ufs/ufs/dinode.h b/sys/ufs/ufs/dinode.h
index 7a2d55b45f2..bb5db0af695 100644
--- a/sys/ufs/ufs/dinode.h
+++ b/sys/ufs/ufs/dinode.h
@@ -55,8 +55,10 @@ typedef u_int32_t	ufsino_t;
 #define	ROOTINO	((ufsino_t)2)
 
 /*
- * A dinode contains all the meta-data associated with a UFS 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.
  */
@@ -114,6 +116,15 @@ struct ufs2_dinode {
 	int64_t		di_spare[3];	/* 232: Reserved; currently unused */
 };
 
+/*
+ * These structures hold or reference an on-disk dinode.
+ */
+union dinode {
+	struct ufs1_dinode dp1;
+	struct ufs2_dinode dp2;
+};
+
+
 /*
  * The di_db fields may be overlaid with other information for
  * file types that do not have associated disk storage. Block
diff --git a/usr.sbin/makefs/ffs.c b/usr.sbin/makefs/ffs.c
index b055c62a598..b4ae55c57ea 100644
--- a/usr.sbin/makefs/ffs.c
+++ b/usr.sbin/makefs/ffs.c
@@ -95,7 +95,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)).
@@ -739,10 +739,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 (membuf != NULL) {
@@ -802,11 +802,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 */
@@ -992,9 +992,9 @@ ffs_write_inode(union dinode *dp, uint32_t ino, const fsinfo_t *fsopts)
 	d = fsbtodb(fs, ino_to_fsba(fs, ino));
 	ffs_rdfs(d, fs->fs_bsize, buf, fsopts);
 	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 1247ca5cbbb..4f72c864ee3 100644
--- a/usr.sbin/makefs/ffs/ufs_inode.h
+++ b/usr.sbin/makefs/ffs/ufs_inode.h
@@ -38,10 +38,6 @@
  *	@(#)inode.h	8.9 (Berkeley) 5/14/95
  */
 
-union dinode {
-	struct ufs1_dinode ffs1_din;
-	struct ufs2_dinode ffs2_din;
-};
 
 struct inode {
 	ino_t		i_number;	/* The identity of the inode. */
@@ -51,45 +47,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.db
-#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.db
+#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.db
-#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.db
+#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 16f5949f836..61c58b1cd19 100644
--- a/usr.sbin/quot/quot.c
+++ b/usr.sbin/quot/quot.c
@@ -65,10 +65,6 @@ static int headerlen;
 			    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)