Module Name:    src
Committed By:   dholland
Date:           Wed Aug 19 20:33:29 UTC 2015

Modified Files:
        src/sbin/fsck_lfs: inode.c lfs.c lfs_user.h pass6.c segwrite.c vnode.c
        src/sbin/newfs_lfs: make_lfs.c
        src/sys/ufs/lfs: lfs_accessors.h lfs_inode.c lfs_inode.h lfs_rfw.c
            lfs_segment.c lfs_vfsops.c lfs_vnops.c

Log Message:
Part two of dinodes; use the same union everywhere.
(previously the ufs-derived code had things set up slightly different)

Remove a bunch of associated mess.


To generate a diff of this commit:
cvs rdiff -u -r1.59 -r1.60 src/sbin/fsck_lfs/inode.c
cvs rdiff -u -r1.56 -r1.57 src/sbin/fsck_lfs/lfs.c
cvs rdiff -u -r1.10 -r1.11 src/sbin/fsck_lfs/lfs_user.h
cvs rdiff -u -r1.42 -r1.43 src/sbin/fsck_lfs/pass6.c
cvs rdiff -u -r1.41 -r1.42 src/sbin/fsck_lfs/segwrite.c
cvs rdiff -u -r1.14 -r1.15 src/sbin/fsck_lfs/vnode.c
cvs rdiff -u -r1.43 -r1.44 src/sbin/newfs_lfs/make_lfs.c
cvs rdiff -u -r1.13 -r1.14 src/sys/ufs/lfs/lfs_accessors.h
cvs rdiff -u -r1.144 -r1.145 src/sys/ufs/lfs/lfs_inode.c
cvs rdiff -u -r1.9 -r1.10 src/sys/ufs/lfs/lfs_inode.h
cvs rdiff -u -r1.29 -r1.30 src/sys/ufs/lfs/lfs_rfw.c
cvs rdiff -u -r1.256 -r1.257 src/sys/ufs/lfs/lfs_segment.c
cvs rdiff -u -r1.340 -r1.341 src/sys/ufs/lfs/lfs_vfsops.c
cvs rdiff -u -r1.286 -r1.287 src/sys/ufs/lfs/lfs_vnops.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sbin/fsck_lfs/inode.c
diff -u src/sbin/fsck_lfs/inode.c:1.59 src/sbin/fsck_lfs/inode.c:1.60
--- src/sbin/fsck_lfs/inode.c:1.59	Wed Aug 12 18:28:00 2015
+++ src/sbin/fsck_lfs/inode.c	Wed Aug 19 20:33:29 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: inode.c,v 1.59 2015/08/12 18:28:00 dholland Exp $	 */
+/* $NetBSD: inode.c,v 1.60 2015/08/19 20:33:29 dholland Exp $	 */
 
 /*-
  * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
@@ -119,8 +119,7 @@ ginode(ino_t ino)
 		seg_table[segno].su_nbytes += DINOSIZE(fs);
 		brelse(bp, 0);
 	}
-	// XXX bogus cast
-	return (union lfs_dinode *)(VTOI(vp)->i_din.ffs1_din);
+	return VTOI(vp)->i_din;
 }
 
 /*
@@ -621,8 +620,7 @@ allocino(ino_t request, int type)
         vp = lfs_valloc(fs, ino);
 	if (vp == NULL)
 		return (0);
-	// XXX bogus cast
-	dp = (union lfs_dinode *)(VTOI(vp)->i_din.ffs1_din);
+	dp = VTOI(vp)->i_din;
 	bp = getblk(vp, 0, lfs_sb_getfsize(fs));
 	VOP_BWRITE(bp);
 	lfs_dino_setmode(fs, dp, type);

Index: src/sbin/fsck_lfs/lfs.c
diff -u src/sbin/fsck_lfs/lfs.c:1.56 src/sbin/fsck_lfs/lfs.c:1.57
--- src/sbin/fsck_lfs/lfs.c:1.56	Wed Aug 12 18:28:00 2015
+++ src/sbin/fsck_lfs/lfs.c	Wed Aug 19 20:33:29 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: lfs.c,v 1.56 2015/08/12 18:28:00 dholland Exp $ */
+/* $NetBSD: lfs.c,v 1.57 2015/08/19 20:33:29 dholland Exp $ */
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -356,9 +356,7 @@ lfs_raw_vget(struct lfs * fs, ino_t ino,
 
 	ip = ecalloc(1, sizeof(*ip));
 
-	dip = ecalloc(1, sizeof(*dip));
-	// XXX bogus cast
-	ip->i_din.ffs1_din = (struct lfs32_dinode *)dip;
+	ip->i_din = dip = ecalloc(1, sizeof(*dip));
 
 	/* Initialize the inode -- from lfs_vcreate. */
 	ip->inode_ext.lfs = ecalloc(1, sizeof(*ip->inode_ext.lfs));
@@ -381,12 +379,7 @@ lfs_raw_vget(struct lfs * fs, ino_t ino,
 			free(vp);
 			return NULL;
 		}
-		// XXX this should go away
-		if (fs->lfs_is64) {
-			memcpy(ip->i_din.ffs2_din, &dip->u_64, sizeof(dip->u_64));
-		} else {
-			memcpy(ip->i_din.ffs1_din, &dip->u_32, sizeof(dip->u_32));
-		}
+		lfs_copy_dinode(fs, ip->i_din, dip);
 		brelse(bp, 0);
 	}
 	ip->i_number = ino;

Index: src/sbin/fsck_lfs/lfs_user.h
diff -u src/sbin/fsck_lfs/lfs_user.h:1.10 src/sbin/fsck_lfs/lfs_user.h:1.11
--- src/sbin/fsck_lfs/lfs_user.h:1.10	Wed Aug 12 18:28:00 2015
+++ src/sbin/fsck_lfs/lfs_user.h	Wed Aug 19 20:33:29 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: lfs_user.h,v 1.10 2015/08/12 18:28:00 dholland Exp $ */
+/* $NetBSD: lfs_user.h,v 1.11 2015/08/19 20:33:29 dholland Exp $ */
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -72,8 +72,7 @@ typedef int32_t ulfs_daddr_t;
 
 /* Convert between inode pointers and vnode pointers. */
 #define	VTOI(vp)	((struct inode *)(vp)->v_data)
-// XXX bogus cast
-#define VTOD(vp)	((union lfs_dinode *)(VTOI(vp)->i_din.ffs1_din))
+#define VTOD(vp)	(VTOI(vp)->i_din)
 
 #define sbdirty()	++fsdirty
 

Index: src/sbin/fsck_lfs/pass6.c
diff -u src/sbin/fsck_lfs/pass6.c:1.42 src/sbin/fsck_lfs/pass6.c:1.43
--- src/sbin/fsck_lfs/pass6.c:1.42	Wed Aug 12 18:28:00 2015
+++ src/sbin/fsck_lfs/pass6.c	Wed Aug 19 20:33:29 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: pass6.c,v 1.42 2015/08/12 18:28:00 dholland Exp $	 */
+/* $NetBSD: pass6.c,v 1.43 2015/08/19 20:33:29 dholland Exp $	 */
 
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -448,12 +448,7 @@ readdress_inode(union lfs_dinode *dp, ul
 
 	/* Copy over preexisting in-core inode, if any */
 	vp = vget(fs, thisino);
-	/* XXX this is lame */
-	if (fs->lfs_is64) {
-		memcpy(VTOI(vp)->i_din.ffs2_din, &dp->u_64, sizeof(dp->u_64));
-	} else {
-		memcpy(VTOI(vp)->i_din.ffs1_din, &dp->u_32, sizeof(dp->u_32));
-	}
+	lfs_copy_dinode(fs, VTOI(vp)->i_din, dp);
 
 	/* Finally account the inode itself */
 	sn = lfs_dtosn(fs, odaddr);

Index: src/sbin/fsck_lfs/segwrite.c
diff -u src/sbin/fsck_lfs/segwrite.c:1.41 src/sbin/fsck_lfs/segwrite.c:1.42
--- src/sbin/fsck_lfs/segwrite.c:1.41	Wed Aug 12 18:28:00 2015
+++ src/sbin/fsck_lfs/segwrite.c	Wed Aug 19 20:33:29 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: segwrite.c,v 1.41 2015/08/12 18:28:00 dholland Exp $ */
+/* $NetBSD: segwrite.c,v 1.42 2015/08/19 20:33:29 dholland Exp $ */
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -291,6 +291,7 @@ lfs_writeinode(struct lfs * fs, struct s
 		sp->sum_bytes_left -= sizeof(ulfs_daddr_t);
 		ndx = lfs_sb_getsumsize(fs) / sizeof(ulfs_daddr_t) -
 		    sp->ninodes / LFS_INOPB(fs) - 1;
+		/* XXX ondisk32 */
 		((ulfs_daddr_t *) (sp->segsum))[ndx] = daddr;
 	}
 	/* Update the inode times and copy the inode onto the inode page. */
@@ -309,23 +310,13 @@ lfs_writeinode(struct lfs * fs, struct s
 	 * already been gathered.
 	 */
 	if (ip->i_number == LFS_IFILE_INUM && sp->idp) {
-		// XXX weak
-		if (fs->lfs_is64) {
-			sp->idp->u_64 = *ip->i_din.ffs2_din;
-		} else {
-			sp->idp->u_32 = *ip->i_din.ffs1_din;
-		}
+		lfs_copy_dinode(fs, sp->idp, ip->i_din);
 		ip->i_lfs_osize = ip->i_ffs1_size;
 		return 0;
 	}
 	bp = sp->ibp;
 	cdp = DINO_IN_BLOCK(fs, bp->b_data, sp->ninodes % LFS_INOPB(fs));
-	// XXX weak
-	if (fs->lfs_is64) {
-		cdp->u_64 = *ip->i_din.ffs2_din;
-	} else {
-		cdp->u_32 = *ip->i_din.ffs1_din;
-	}
+	lfs_copy_dinode(fs, cdp, ip->i_din);
 
 	/* If all blocks are goig to disk, update the "size on disk" */
 	ip->i_lfs_osize = ip->i_ffs1_size;

Index: src/sbin/fsck_lfs/vnode.c
diff -u src/sbin/fsck_lfs/vnode.c:1.14 src/sbin/fsck_lfs/vnode.c:1.15
--- src/sbin/fsck_lfs/vnode.c:1.14	Sat Jun  8 02:16:03 2013
+++ src/sbin/fsck_lfs/vnode.c	Wed Aug 19 20:33:29 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: vnode.c,v 1.14 2013/06/08 02:16:03 dholland Exp $ */
+/* $NetBSD: vnode.c,v 1.15 2015/08/19 20:33:29 dholland Exp $ */
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -141,7 +141,7 @@ vnode_destroy(struct uvnode *tossvp)
 		buf_destroy(bp);
 	}
 	free(VTOI(tossvp)->inode_ext.lfs);
-	free(VTOI(tossvp)->i_din.ffs1_din);
+	free(VTOI(tossvp)->i_din);
 	memset(VTOI(tossvp), 0, sizeof(struct inode));
 	free(tossvp->v_data);
 	memset(tossvp, 0, sizeof(*tossvp));

Index: src/sbin/newfs_lfs/make_lfs.c
diff -u src/sbin/newfs_lfs/make_lfs.c:1.43 src/sbin/newfs_lfs/make_lfs.c:1.44
--- src/sbin/newfs_lfs/make_lfs.c:1.43	Wed Aug 12 18:28:01 2015
+++ src/sbin/newfs_lfs/make_lfs.c	Wed Aug 19 20:33:29 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: make_lfs.c,v 1.43 2015/08/12 18:28:01 dholland Exp $	*/
+/*	$NetBSD: make_lfs.c,v 1.44 2015/08/19 20:33:29 dholland Exp $	*/
 
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -62,7 +62,7 @@
 #if 0
 static char sccsid[] = "@(#)lfs.c	8.5 (Berkeley) 5/24/95";
 #else
-__RCSID("$NetBSD: make_lfs.c,v 1.43 2015/08/12 18:28:01 dholland Exp $");
+__RCSID("$NetBSD: make_lfs.c,v 1.44 2015/08/19 20:33:29 dholland Exp $");
 #endif
 #endif /* not lint */
 
@@ -700,18 +700,17 @@ make_lfs(int devfd, uint secsize, struct
 	/*
 	 * Initialize the Ifile inode.  Do this before we do anything
 	 * with the Ifile or segment tables.
+	 *
+	 * XXX: is there some reason this allocates a new dinode? we
+	 * already have an empty one generated by vget.
 	 */
 	dip = malloc(sizeof(*dip));
 	if (dip == NULL)
 		err(1, NULL);
-	// XXX lame
-	if (fs->lfs_is64) {
-		VTOI(fs->lfs_ivnode)->i_din.ffs2_din = &dip->u_64;
-	} else {
-		VTOI(fs->lfs_ivnode)->i_din.ffs1_din = &dip->u_32;
-	}
-		
 	memset(dip, 0, sizeof(*dip));
+
+	VTOI(fs->lfs_ivnode)->i_din = dip;
+		
 	lfs_dino_setmode(fs, dip, LFS_IFREG | 0600);
 	lfs_dino_setflags(fs, dip, SF_IMMUTABLE);
 	make_dinode(LFS_IFILE_INUM, dip,
@@ -775,8 +774,7 @@ make_lfs(int devfd, uint secsize, struct
 
 	/* Initialize root directory */
 	vp = lfs_raw_vget(fs, ULFS_ROOTINO, devfd, 0x0);
-	// XXX bogus cast
-	dip = (union lfs_dinode *)VTOI(vp)->i_din.ffs1_din;
+	dip = VTOI(vp)->i_din;
 	make_dinode(ULFS_ROOTINO, dip, howmany(LFS_DIRBLKSIZ, lfs_sb_getfsize(fs)), fs);
 	lfs_dino_setmode(fs, dip, LFS_IFDIR | UMASK);
 	VTOI(vp)->i_lfs_osize = LFS_DIRBLKSIZ;

Index: src/sys/ufs/lfs/lfs_accessors.h
diff -u src/sys/ufs/lfs/lfs_accessors.h:1.13 src/sys/ufs/lfs/lfs_accessors.h:1.14
--- src/sys/ufs/lfs/lfs_accessors.h:1.13	Wed Aug 12 18:28:01 2015
+++ src/sys/ufs/lfs/lfs_accessors.h	Wed Aug 19 20:33:29 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_accessors.h,v 1.13 2015/08/12 18:28:01 dholland Exp $	*/
+/*	$NetBSD: lfs_accessors.h,v 1.14 2015/08/19 20:33:29 dholland Exp $	*/
 
 /*  from NetBSD: lfs.h,v 1.165 2015/07/24 06:59:32 dholland Exp  */
 /*  from NetBSD: dinode.h,v 1.22 2013/01/22 09:39:18 dholland Exp  */
@@ -179,6 +179,23 @@
 #define DINO_IN_BLOCK(fs, base, ix) \
 	((union lfs_dinode *)((char *)(base) + DINOSIZE(fs) * (ix)))
 
+static __unused inline void
+lfs_copy_dinode(STRUCT_LFS *fs,
+    union lfs_dinode *dst, const union lfs_dinode *src)
+{
+	/*
+	 * We can do structure assignment of the structs, but not of
+	 * the whole union, as the union is the size of the (larger)
+	 * 64-bit struct and on a 32-bit fs the upper half of it might
+	 * be off the end of a buffer or otherwise invalid.
+	 */
+	if (fs->lfs_is64) {
+		dst->u_64 = src->u_64;
+	} else {
+		dst->u_32 = src->u_32;
+	}
+}
+
 #define LFS_DEF_DINO_ACCESSOR(type, type32, field) \
 	static __unused inline type				\
 	lfs_dino_get##field(STRUCT_LFS *fs, union lfs_dinode *dip) \

Index: src/sys/ufs/lfs/lfs_inode.c
diff -u src/sys/ufs/lfs/lfs_inode.c:1.144 src/sys/ufs/lfs/lfs_inode.c:1.145
--- src/sys/ufs/lfs/lfs_inode.c:1.144	Wed Aug 12 18:28:01 2015
+++ src/sys/ufs/lfs/lfs_inode.c	Wed Aug 19 20:33:29 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_inode.c,v 1.144 2015/08/12 18:28:01 dholland Exp $	*/
+/*	$NetBSD: lfs_inode.c,v 1.145 2015/08/19 20:33:29 dholland Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc.
@@ -60,7 +60,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lfs_inode.c,v 1.144 2015/08/12 18:28:01 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_inode.c,v 1.145 2015/08/19 20:33:29 dholland Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_quota.h"
@@ -100,7 +100,6 @@ static int lfs_vtruncbuf(struct vnode *,
 union lfs_dinode *
 lfs_ifind(struct lfs *fs, ino_t ino, struct buf *bp)
 {
-	char *base = bp->b_data;
 	union lfs_dinode *ldip;
 	unsigned num, i;
 
@@ -112,12 +111,12 @@ lfs_ifind(struct lfs *fs, ino_t ino, str
 	 */
 	num = LFS_INOPB(fs);
 	for (i = num; i-- > 0; ) {
-		ldip = (union lfs_dinode *)(base + i * DINOSIZE(fs));
+		ldip = DINO_IN_BLOCK(fs, bp->b_data, i);
 		if (lfs_dino_getinumber(fs, ldip) == ino)
 			return (ldip);
 	}
 
-	printf("searched %u entries\n", num);
+	printf("searched %u entries for %ju\n", num, (uintmax_t)ino);
 	printf("offset is 0x%jx (seg %d)\n", (uintmax_t)lfs_sb_getoffset(fs),
 	       lfs_dtosn(fs, lfs_sb_getoffset(fs)));
 	printf("block is 0x%jx (seg %d)\n",

Index: src/sys/ufs/lfs/lfs_inode.h
diff -u src/sys/ufs/lfs/lfs_inode.h:1.9 src/sys/ufs/lfs/lfs_inode.h:1.10
--- src/sys/ufs/lfs/lfs_inode.h:1.9	Wed Aug 12 18:28:01 2015
+++ src/sys/ufs/lfs/lfs_inode.h	Wed Aug 19 20:33:29 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_inode.h,v 1.9 2015/08/12 18:28:01 dholland Exp $	*/
+/*	$NetBSD: lfs_inode.h,v 1.10 2015/08/19 20:33:29 dholland Exp $	*/
 /*  from NetBSD: ulfs_inode.h,v 1.5 2013/06/06 00:51:50 dholland Exp  */
 /*  from NetBSD: inode.h,v 1.64 2012/11/19 00:36:21 jakllsch Exp  */
 
@@ -152,56 +152,53 @@ struct inode {
 	/*
 	 * The on-disk dinode itself.
 	 */
-	union {
-		struct	lfs32_dinode *ffs1_din;	/* 128 bytes of the on-disk dinode. */
-		struct	lfs64_dinode *ffs2_din;
-	} i_din;
+	union lfs_dinode *i_din;
 };
 
-#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_ffs1_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_size		i_din.ffs1_din->di_size
-#define	i_ffs1_uid		i_din.ffs1_din->di_uid
-#define	i_ffs1_modrev		i_din.ffs1_din->di_modrev
-
-#define	i_ffs2_atime		i_din.ffs2_din->di_atime
-#define	i_ffs2_atimensec	i_din.ffs2_din->di_atimensec
-#define	i_ffs2_birthtime	i_din.ffs2_din->di_birthtime
-#define	i_ffs2_birthnsec	i_din.ffs2_din->di_birthnsec
-#define	i_ffs2_blocks		i_din.ffs2_din->di_blocks
-#define	i_ffs2_blksize		i_din.ffs2_din->di_blksize
-#define	i_ffs2_ctime		i_din.ffs2_din->di_ctime
-#define	i_ffs2_ctimensec	i_din.ffs2_din->di_ctimensec
-#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_ffs2_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_size		i_din.ffs2_din->di_size
-#define	i_ffs2_uid		i_din.ffs2_din->di_uid
-#define	i_ffs2_kernflags	i_din.ffs2_din->di_kernflags
-#define	i_ffs2_extsize		i_din.ffs2_din->di_extsize
-#define	i_ffs2_extb		i_din.ffs2_din->di_extb
-#define	i_ffs2_inumber		i_din.ffs2_din->di_inumber
-#define	i_ffs2_modrev		i_din.ffs2_din->di_modrev
+#define	i_ffs1_atime		i_din->u_32.di_atime
+#define	i_ffs1_atimensec	i_din->u_32.di_atimensec
+#define	i_ffs1_blocks		i_din->u_32.di_blocks
+#define	i_ffs1_ctime		i_din->u_32.di_ctime
+#define	i_ffs1_ctimensec	i_din->u_32.di_ctimensec
+#define	i_ffs1_db		i_din->u_32.di_db
+#define	i_ffs1_flags		i_din->u_32.di_flags
+#define	i_ffs1_gen		i_din->u_32.di_gen
+#define	i_ffs1_gid		i_din->u_32.di_gid
+#define	i_ffs1_ib		i_din->u_32.di_ib
+#define	i_ffs1_mode		i_din->u_32.di_mode
+#define	i_ffs1_mtime		i_din->u_32.di_mtime
+#define	i_ffs1_mtimensec	i_din->u_32.di_mtimensec
+#define	i_ffs1_nlink		i_din->u_32.di_nlink
+#define	i_ffs1_rdev		i_din->u_32.di_rdev
+#define	i_ffs1_size		i_din->u_32.di_size
+#define	i_ffs1_uid		i_din->u_32.di_uid
+#define	i_ffs1_modrev		i_din->u_32.di_modrev
+
+#define	i_ffs2_atime		i_din->u_64.di_atime
+#define	i_ffs2_atimensec	i_din->u_64.di_atimensec
+#define	i_ffs2_birthtime	i_din->u_64.di_birthtime
+#define	i_ffs2_birthnsec	i_din->u_64.di_birthnsec
+#define	i_ffs2_blocks		i_din->u_64.di_blocks
+#define	i_ffs2_blksize		i_din->u_64.di_blksize
+#define	i_ffs2_ctime		i_din->u_64.di_ctime
+#define	i_ffs2_ctimensec	i_din->u_64.di_ctimensec
+#define	i_ffs2_db		i_din->u_64.di_db
+#define	i_ffs2_flags		i_din->u_64.di_flags
+#define	i_ffs2_gen		i_din->u_64.di_gen
+#define	i_ffs2_gid		i_din->u_64.di_gid
+#define	i_ffs2_ib		i_din->u_64.di_ib
+#define	i_ffs2_mode		i_din->u_64.di_mode
+#define	i_ffs2_mtime		i_din->u_64.di_mtime
+#define	i_ffs2_mtimensec	i_din->u_64.di_mtimensec
+#define	i_ffs2_nlink		i_din->u_64.di_nlink
+#define	i_ffs2_rdev		i_din->u_64.di_rdev
+#define	i_ffs2_size		i_din->u_64.di_size
+#define	i_ffs2_uid		i_din->u_64.di_uid
+#define	i_ffs2_kernflags	i_din->u_64.di_kernflags
+#define	i_ffs2_extsize		i_din->u_64.di_extsize
+#define	i_ffs2_extb		i_din->u_64.di_extb
+#define	i_ffs2_inumber		i_din->u_64.di_inumber
+#define	i_ffs2_modrev		i_din->u_64.di_modrev
 
 /* These flags are kept in i_flag. */
 #define	IN_ACCESS	0x0001		/* Access time update request. */

Index: src/sys/ufs/lfs/lfs_rfw.c
diff -u src/sys/ufs/lfs/lfs_rfw.c:1.29 src/sys/ufs/lfs/lfs_rfw.c:1.30
--- src/sys/ufs/lfs/lfs_rfw.c:1.29	Wed Aug 12 18:28:01 2015
+++ src/sys/ufs/lfs/lfs_rfw.c	Wed Aug 19 20:33:29 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_rfw.c,v 1.29 2015/08/12 18:28:01 dholland Exp $	*/
+/*	$NetBSD: lfs_rfw.c,v 1.30 2015/08/19 20:33:29 dholland Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lfs_rfw.c,v 1.29 2015/08/12 18:28:01 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_rfw.c,v 1.30 2015/08/19 20:33:29 dholland Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_quota.h"
@@ -250,6 +250,61 @@ update_meta(struct lfs *fs, ino_t ino, i
 	return 0;
 }
 
+/*
+ * Copy some the fields of the dinode as needed by update_inoblk().
+ */
+static void
+update_inoblk_copy_dinode(struct lfs *fs,
+    union lfs_dinode *dstu, const union lfs_dinode *srcu)
+{
+	if (fs->lfs_is64) {
+		struct lfs64_dinode *dst = &dstu->u_64;
+		const struct lfs64_dinode *src = &srcu->u_64;
+		unsigned i;
+
+		/*
+		 * Copy everything but the block pointers and di_blocks.
+		 * XXX what about di_extb?
+		 */
+		dst->di_mode = src->di_mode;
+		dst->di_nlink = src->di_nlink;
+		dst->di_uid = src->di_uid;
+		dst->di_gid = src->di_gid;
+		dst->di_blksize = src->di_blksize;
+		dst->di_size = src->di_size;
+		dst->di_atime = src->di_atime;
+		dst->di_mtime = src->di_mtime;
+		dst->di_ctime = src->di_ctime;
+		dst->di_birthtime = src->di_birthtime;
+		dst->di_mtimensec = src->di_mtimensec;
+		dst->di_atimensec = src->di_atimensec;
+		dst->di_ctimensec = src->di_ctimensec;
+		dst->di_birthnsec = src->di_birthnsec;
+		dst->di_gen = src->di_gen;
+		dst->di_kernflags = src->di_kernflags;
+		dst->di_flags = src->di_flags;
+		dst->di_extsize = src->di_extsize;
+		dst->di_modrev = src->di_modrev;
+		dst->di_inumber = src->di_inumber;
+		for (i = 0; i < __arraycount(src->di_spare); i++) {
+			dst->di_spare[i] = src->di_spare[i];
+		}
+	} else {
+		struct lfs32_dinode *dst = &dstu->u_32;
+		const struct lfs32_dinode *src = &srcu->u_32;
+
+		/* Get mode, link count, size, and times */
+		memcpy(dst, src, offsetof(struct lfs32_dinode, di_db[0]));
+
+		/* Then the rest, except di_blocks */
+		dst->di_flags = src->di_flags;
+		dst->di_gen = src->di_gen;
+		dst->di_uid = src->di_uid;
+		dst->di_gid = src->di_gid;
+		dst->di_modrev = src->di_modrev;
+	}
+}
+
 static int
 update_inoblk(struct lfs *fs, daddr_t offset, kauth_cred_t cred,
 	      struct lwp *l)
@@ -278,7 +333,7 @@ update_inoblk(struct lfs *fs, daddr_t of
 	}
 	num = LFS_INOPB(fs);
 	for (i = num; i-- > 0; ) {
-		dip = (union lfs_dinode *)((char *)dbp->b_data + i * DINOSIZE(fs));
+		dip = DINO_IN_BLOCK(fs, dbp->b_data, i);
 		if (lfs_dino_getinumber(fs, dip) > LFS_IFILE_INUM) {
 			error = lfs_rf_valloc(fs, lfs_dino_getinumber(fs, dip),
 					      lfs_dino_getgen(fs, dip),
@@ -292,31 +347,8 @@ update_inoblk(struct lfs *fs, daddr_t of
 			if (lfs_dino_getsize(fs, dip) != ip->i_size)
 				lfs_truncate(vp, lfs_dino_getsize(fs, dip), 0,
 					     NOCRED);
-			/* Get mode, link count, size, and times */
-			/* XXX: ugly, simplify */
-			if (fs->lfs_is64) {
-				/*
-				 * XXX what about di_extb?
-				 */
-				memcpy(ip->i_din.ffs2_din, dip,
-				       offsetof(struct lfs64_dinode, di_db[0]));
-				/* Then the rest, except di_blocks */
-				ip->i_ffs2_modrev = dip->u_64.di_modrev;
-				ip->i_ffs2_inumber = dip->u_64.di_inumber;
-				memset(ip->i_din.ffs2_din->di_spare, 0,
-				       sizeof(ip->i_din.ffs2_din->di_spare));
-			} else {
-				memcpy(ip->i_din.ffs1_din, dip,
-				       offsetof(struct lfs32_dinode, di_db[0]));
-				/* Then the rest, except di_blocks */
-				ip->i_ffs1_flags = dip->u_32.di_flags;
-				ip->i_ffs1_gen = dip->u_32.di_gen;
-				ip->i_ffs1_uid = dip->u_32.di_uid;
-				ip->i_ffs1_gid = dip->u_32.di_gid;
-				ip->i_ffs1_modrev = dip->u_32.di_modrev;
-			}
+			update_inoblk_copy_dinode(fs, ip->i_din, dip);
 
-			/* Then the rest, except di_blocks */
 			ip->i_flags = lfs_dino_getflags(fs, dip);
 			ip->i_gen = lfs_dino_getgen(fs, dip);
 			ip->i_uid = lfs_dino_getuid(fs, dip);

Index: src/sys/ufs/lfs/lfs_segment.c
diff -u src/sys/ufs/lfs/lfs_segment.c:1.256 src/sys/ufs/lfs/lfs_segment.c:1.257
--- src/sys/ufs/lfs/lfs_segment.c:1.256	Wed Aug 12 18:28:01 2015
+++ src/sys/ufs/lfs/lfs_segment.c	Wed Aug 19 20:33:29 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_segment.c,v 1.256 2015/08/12 18:28:01 dholland Exp $	*/
+/*	$NetBSD: lfs_segment.c,v 1.257 2015/08/19 20:33:29 dholland Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc.
@@ -60,7 +60,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lfs_segment.c,v 1.256 2015/08/12 18:28:01 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_segment.c,v 1.257 2015/08/19 20:33:29 dholland Exp $");
 
 #define _VFS_VNODE_PRIVATE	/* XXX: check for VI_MARKER, this has to go */
 
@@ -1163,22 +1163,14 @@ lfs_writeinode(struct lfs *fs, struct se
 	 * already been gathered.
 	 */
 	if (ip->i_number == LFS_IFILE_INUM && sp->idp) {
-		if (fs->lfs_is64) {
-			sp->idp->u_64 = *ip->i_din.ffs2_din;
-		} else {
-			sp->idp->u_32 = *ip->i_din.ffs1_din;
-		}
+		lfs_copy_dinode(fs, sp->idp, ip->i_din);
 		ip->i_lfs_osize = ip->i_size;
 		return 0;
 	}
 
 	bp = sp->ibp;
-	cdp = (union lfs_dinode *)((char *)bp->b_data + DINOSIZE(fs) * (sp->ninodes % LFS_INOPB(fs)));
-	if (fs->lfs_is64) {
-		cdp->u_64 = *ip->i_din.ffs2_din;
-	} else {
-		cdp->u_32 = *ip->i_din.ffs1_din;
-	}
+	cdp = DINO_IN_BLOCK(fs, bp->b_data, sp->ninodes % LFS_INOPB(fs));
+	lfs_copy_dinode(fs, cdp, ip->i_din);
 
 	/*
 	 * This inode is on its way to disk; clear its VU_DIROP status when

Index: src/sys/ufs/lfs/lfs_vfsops.c
diff -u src/sys/ufs/lfs/lfs_vfsops.c:1.340 src/sys/ufs/lfs/lfs_vfsops.c:1.341
--- src/sys/ufs/lfs/lfs_vfsops.c:1.340	Wed Aug 12 18:28:01 2015
+++ src/sys/ufs/lfs/lfs_vfsops.c	Wed Aug 19 20:33:29 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_vfsops.c,v 1.340 2015/08/12 18:28:01 dholland Exp $	*/
+/*	$NetBSD: lfs_vfsops.c,v 1.341 2015/08/19 20:33:29 dholland Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2002, 2003, 2007, 2007
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lfs_vfsops.c,v 1.340 2015/08/12 18:28:01 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_vfsops.c,v 1.341 2015/08/19 20:33:29 dholland Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_lfs.h"
@@ -1488,12 +1488,7 @@ lfs_init_vnode(struct ulfsmount *ump, in
 	memset(dp, 0, sizeof(*dp));
 	ip->inode_ext.lfs = pool_get(&lfs_inoext_pool, PR_WAITOK);
 	memset(ip->inode_ext.lfs, 0, sizeof(*ip->inode_ext.lfs));
-	// XXX this should go away
-	if (fs->lfs_is64) {
-		ip->i_din.ffs2_din = &dp->u_64;
-	} else {
-		ip->i_din.ffs1_din = &dp->u_32;
-	}
+	ip->i_din = dp;
 	ip->i_ump = ump;
 	ip->i_vnode = vp;
 	ip->i_dev = ump->um_dev;
@@ -1519,8 +1514,7 @@ lfs_deinit_vnode(struct ulfsmount *ump, 
 	struct inode *ip = VTOI(vp);
 
 	pool_put(&lfs_inoext_pool, ip->inode_ext.lfs);
-	// XXX bogus cast
-	pool_put(&lfs_dinode_pool, (union lfs_dinode *)ip->i_din.ffs1_din);
+	pool_put(&lfs_dinode_pool, ip->i_din);
 	pool_put(&lfs_inode_pool, ip);
 	vp->v_data = NULL;
 }
@@ -1588,10 +1582,10 @@ lfs_loadvnode(struct mount *mp, struct v
 	    ump->um_cleaner_hint->bi_lbn == LFS_UNUSED_LBN) {
 		dip = ump->um_cleaner_hint->bi_bp;
 		if (fs->lfs_is64) {
-			error = copyin(dip, ip->i_din.ffs2_din,
+			error = copyin(dip, &ip->i_din->u_64,
 				       sizeof(struct lfs64_dinode));
 		} else {
-			error = copyin(dip, ip->i_din.ffs1_din,
+			error = copyin(dip, &ip->i_din->u_32,
 				       sizeof(struct lfs32_dinode));
 		}
 		if (error) {
@@ -1662,11 +1656,7 @@ again:
 #endif /* DEBUG */
 		panic("lfs_loadvnode: dinode not found");
 	}
-	if (fs->lfs_is64) {
-		*ip->i_din.ffs2_din = dip->u_64;
-	} else {
-		*ip->i_din.ffs1_din = dip->u_32;
-	}
+	lfs_copy_dinode(fs, ip->i_din, dip);
 	brelse(bp, 0);
 
 out:	
@@ -2240,15 +2230,13 @@ lfs_vinit(struct mount *mp, struct vnode
 			    i == 0)
 				continue;
 			if (ip->i_ffs1_db[i] != 0) {
-				// XXX bogus cast
-				lfs_dump_dinode(fs, (union lfs_dinode *)ip->i_din.ffs1_din);
+				lfs_dump_dinode(fs, ip->i_din);
 				panic("inconsistent inode (direct)");
 			}
 		}
 		for ( ; i < ULFS_NDADDR + ULFS_NIADDR; i++) {
 			if (ip->i_ffs1_ib[i - ULFS_NDADDR] != 0) {
-				// XXX bogus cast
-				lfs_dump_dinode(fs, (union lfs_dinode *)ip->i_din.ffs1_din);
+				lfs_dump_dinode(fs, ip->i_din);
 				panic("inconsistent inode (indirect)");
 			}
 		}
@@ -2261,8 +2249,7 @@ lfs_vinit(struct mount *mp, struct vnode
 #ifdef DIAGNOSTIC
 	if (vp->v_type == VNON) {
 # ifdef DEBUG
-		// XXX bogus cast
-		lfs_dump_dinode(fs, (union lfs_dinode *)ip->i_din.ffs1_din);
+		lfs_dump_dinode(fs, ip->i_din);
 # endif
 		panic("lfs_vinit: ino %llu is type VNON! (ifmt=%o)\n",
 		      (unsigned long long)ip->i_number,

Index: src/sys/ufs/lfs/lfs_vnops.c
diff -u src/sys/ufs/lfs/lfs_vnops.c:1.286 src/sys/ufs/lfs/lfs_vnops.c:1.287
--- src/sys/ufs/lfs/lfs_vnops.c:1.286	Wed Aug 12 18:28:01 2015
+++ src/sys/ufs/lfs/lfs_vnops.c	Wed Aug 19 20:33:29 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_vnops.c,v 1.286 2015/08/12 18:28:01 dholland Exp $	*/
+/*	$NetBSD: lfs_vnops.c,v 1.287 2015/08/19 20:33:29 dholland Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc.
@@ -125,7 +125,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.286 2015/08/12 18:28:01 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.287 2015/08/19 20:33:29 dholland Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_compat_netbsd.h"
@@ -1357,7 +1357,7 @@ lfs_reclaim(void *v)
 	}
 	mutex_exit(&lfs_lock);
 
-	pool_put(&lfs_dinode_pool, ip->i_din.ffs1_din);
+	pool_put(&lfs_dinode_pool, ip->i_din);
 	lfs_deregister_all(vp);
 	pool_put(&lfs_inoext_pool, ip->inode_ext.lfs);
 	ip->inode_ext.lfs = NULL;
@@ -2108,8 +2108,7 @@ lfs_dump_vop(void *v)
 #ifdef DDB
 	vfs_vnode_print(ap->a_vp, 0, printf);
 #endif
-	// XXX bogus cast
-	lfs_dump_dinode(fs, (union lfs_dinode *)ip->i_din.ffs1_din);
+	lfs_dump_dinode(fs, ip->i_din);
 }
 #endif
 

Reply via email to