Module Name:    src
Committed By:   dholland
Date:           Wed Aug 12 18:28:01 UTC 2015

Modified Files:
        src/libexec/lfs_cleanerd: coalesce.c lfs_cleanerd.c
        src/sbin/dump: dump.h
        src/sbin/dump_lfs: lfs_inode.c
        src/sbin/fsck_lfs: dir.c extern.h fsck.h fsck_vars.h inode.c lfs.c
            lfs_user.h pass1.c pass2.c pass4.c pass6.c segwrite.c setup.c
            utilities.c vars.c
        src/sbin/newfs_lfs: make_lfs.c
        src/sys/lib/libsa: lfsv1.c lfsv2.c ufs.c
        src/sys/ufs/lfs: lfs.h lfs_accessors.h lfs_alloc.c lfs_bio.c
            lfs_debug.c lfs_extern.h lfs_inode.c lfs_inode.h lfs_rfw.c
            lfs_segment.c lfs_syscalls.c lfs_vfsops.c lfs_vnops.c ulfs_inode.h
        src/usr.sbin/dumplfs: dumplfs.c

Log Message:
Hack up dinode usage to be 64 vs. 32 as needed. Part 1.

(This part changes the native lfs code; the ufs-derived code already
has 64 vs. 32 logic, but as aspects of it are unsafe, and don't
entirely interoperate cleanly with the lfs 64/32 stuff, pass 2 will be
rehashing that.)


To generate a diff of this commit:
cvs rdiff -u -r1.31 -r1.32 src/libexec/lfs_cleanerd/coalesce.c
cvs rdiff -u -r1.49 -r1.50 src/libexec/lfs_cleanerd/lfs_cleanerd.c
cvs rdiff -u -r1.52 -r1.53 src/sbin/dump/dump.h
cvs rdiff -u -r1.24 -r1.25 src/sbin/dump_lfs/lfs_inode.c
cvs rdiff -u -r1.35 -r1.36 src/sbin/fsck_lfs/dir.c
cvs rdiff -u -r1.11 -r1.12 src/sbin/fsck_lfs/extern.h
cvs rdiff -u -r1.20 -r1.21 src/sbin/fsck_lfs/fsck.h
cvs rdiff -u -r1.13 -r1.14 src/sbin/fsck_lfs/fsck_vars.h
cvs rdiff -u -r1.58 -r1.59 src/sbin/fsck_lfs/inode.c
cvs rdiff -u -r1.55 -r1.56 src/sbin/fsck_lfs/lfs.c
cvs rdiff -u -r1.9 -r1.10 src/sbin/fsck_lfs/lfs_user.h
cvs rdiff -u -r1.41 -r1.42 src/sbin/fsck_lfs/pass1.c \
    src/sbin/fsck_lfs/pass6.c
cvs rdiff -u -r1.25 -r1.26 src/sbin/fsck_lfs/pass2.c \
    src/sbin/fsck_lfs/pass4.c
cvs rdiff -u -r1.40 -r1.41 src/sbin/fsck_lfs/segwrite.c \
    src/sbin/fsck_lfs/utilities.c
cvs rdiff -u -r1.54 -r1.55 src/sbin/fsck_lfs/setup.c
cvs rdiff -u -r1.17 -r1.18 src/sbin/fsck_lfs/vars.c
cvs rdiff -u -r1.42 -r1.43 src/sbin/newfs_lfs/make_lfs.c
cvs rdiff -u -r1.13 -r1.14 src/sys/lib/libsa/lfsv1.c \
    src/sys/lib/libsa/lfsv2.c
cvs rdiff -u -r1.71 -r1.72 src/sys/lib/libsa/ufs.c
cvs rdiff -u -r1.179 -r1.180 src/sys/ufs/lfs/lfs.h
cvs rdiff -u -r1.12 -r1.13 src/sys/ufs/lfs/lfs_accessors.h
cvs rdiff -u -r1.126 -r1.127 src/sys/ufs/lfs/lfs_alloc.c
cvs rdiff -u -r1.133 -r1.134 src/sys/ufs/lfs/lfs_bio.c
cvs rdiff -u -r1.51 -r1.52 src/sys/ufs/lfs/lfs_debug.c
cvs rdiff -u -r1.109 -r1.110 src/sys/ufs/lfs/lfs_extern.h
cvs rdiff -u -r1.143 -r1.144 src/sys/ufs/lfs/lfs_inode.c
cvs rdiff -u -r1.8 -r1.9 src/sys/ufs/lfs/lfs_inode.h
cvs rdiff -u -r1.28 -r1.29 src/sys/ufs/lfs/lfs_rfw.c
cvs rdiff -u -r1.255 -r1.256 src/sys/ufs/lfs/lfs_segment.c
cvs rdiff -u -r1.168 -r1.169 src/sys/ufs/lfs/lfs_syscalls.c
cvs rdiff -u -r1.339 -r1.340 src/sys/ufs/lfs/lfs_vfsops.c
cvs rdiff -u -r1.285 -r1.286 src/sys/ufs/lfs/lfs_vnops.c
cvs rdiff -u -r1.14 -r1.15 src/sys/ufs/lfs/ulfs_inode.h
cvs rdiff -u -r1.53 -r1.54 src/usr.sbin/dumplfs/dumplfs.c

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

Modified files:

Index: src/libexec/lfs_cleanerd/coalesce.c
diff -u src/libexec/lfs_cleanerd/coalesce.c:1.31 src/libexec/lfs_cleanerd/coalesce.c:1.32
--- src/libexec/lfs_cleanerd/coalesce.c:1.31	Wed Aug 12 18:25:51 2015
+++ src/libexec/lfs_cleanerd/coalesce.c	Wed Aug 12 18:28:00 2015
@@ -1,4 +1,4 @@
-/*      $NetBSD: coalesce.c,v 1.31 2015/08/12 18:25:51 dholland Exp $  */
+/*      $NetBSD: coalesce.c,v 1.32 2015/08/12 18:28:00 dholland Exp $  */
 
 /*-
  * Copyright (c) 2002, 2005 The NetBSD Foundation, Inc.
@@ -109,13 +109,14 @@ const char *coalesce_return[] = {
 	"No such error"
 };
 
-static struct ulfs1_dinode *
+static union lfs_dinode *
 get_dinode(struct clfs *fs, ino_t ino)
 {
 	IFILE *ifp;
 	daddr_t daddr;
 	struct ubuf *bp;
-	struct ulfs1_dinode *dip, *r;
+	union lfs_dinode *dip, *r;
+	unsigned i;
 
 	lfs_ientry(&ifp, fs, ino, &bp);
 	daddr = lfs_if_getdaddr(fs, ifp);
@@ -125,16 +126,26 @@ get_dinode(struct clfs *fs, ino_t ino)
 		return NULL;
 
 	bread(fs->clfs_devvp, daddr, lfs_sb_getibsize(fs), 0, &bp);
-	for (dip = (struct ulfs1_dinode *)bp->b_data;
-	     dip < (struct ulfs1_dinode *)(bp->b_data + lfs_sb_getibsize(fs)); dip++)
-		if (dip->di_inumber == ino) {
-			r = (struct ulfs1_dinode *)malloc(sizeof(*r));
+	for (i = 0; i < LFS_INOPB(fs); i++) {
+		dip = DINO_IN_BLOCK(fs, bp->b_data, i);
+		if (lfs_dino_getinumber(fs, dip) == ino) {
+			r = malloc(sizeof(*r));
 			if (r == NULL)
 				break;
-			memcpy(r, dip, sizeof(*r));
+			/*
+			 * Don't just assign the union, as if we're
+			 * 32-bit and it's the last inode in the block
+			 * that will run off the end of the buffer.
+			 */
+			if (fs->lfs_is64) {
+				r->u_64 = dip->u_64;
+			} else {
+				r->u_32 = dip->u_32;
+			}
 			brelse(bp, 0);
 			return r;
 		}
+	}
 	brelse(bp, 0);
 	return NULL;
 }
@@ -149,7 +160,7 @@ clean_inode(struct clfs *fs, ino_t ino)
 	BLOCK_INFO *bip = NULL, *tbip;
 	CLEANERINFO cip;
 	struct ubuf *bp;
-	struct ulfs1_dinode *dip;
+	union lfs_dinode *dip;
 	struct clfs_seguse *sup;
 	struct lfs_fcntl_markv /* {
 		BLOCK_INFO *blkiov;
@@ -166,7 +177,7 @@ clean_inode(struct clfs *fs, ino_t ino)
 		return COALESCE_NOINODE;
 
 	/* Compute file block size, set up for bmapv */
-	onb = nb = lfs_lblkno(fs, dip->di_size);
+	onb = nb = lfs_lblkno(fs, lfs_dino_getsize(fs, dip));
 
 	/* XXX for now, don't do any file small enough to have fragments */
 	if (nb < ULFS_NDADDR) {
@@ -176,16 +187,17 @@ clean_inode(struct clfs *fs, ino_t ino)
 
 	/* Sanity checks */
 #if 0	/* di_size is uint64_t -- this is a noop */
-	if (dip->di_size < 0) {
-		dlog("ino %d, negative size (%" PRId64 ")", ino, dip->di_size);
+	if (lfs_dino_getsize(fs, dip) < 0) {
+		dlog("ino %d, negative size (%" PRId64 ")", ino,
+		     lfs_dino_getsize(fs, dip));
 		free(dip);
 		return COALESCE_BADSIZE;
 	}
 #endif
-	if (nb > dip->di_blocks) {
+	if (nb > lfs_dino_getblocks(fs, dip)) {
 		dlog("ino %ju, computed blocks %jd > held blocks %ju",
 		     (uintmax_t)ino, (intmax_t)nb,
-		     (uintmax_t)dip->di_blocks);
+		     (uintmax_t)lfs_dino_getblocks(fs, dip));
 		free(dip);
 		return COALESCE_BADBLOCKSIZE;
 	}
@@ -220,7 +232,7 @@ clean_inode(struct clfs *fs, ino_t ino)
 		memset(bip + i, 0, sizeof(BLOCK_INFO));
 		bip[i].bi_inode = ino;
 		bip[i].bi_lbn = i;
-		bip[i].bi_version = dip->di_gen;
+		bip[i].bi_version = lfs_dino_getgen(fs, dip);
 		/* Don't set the size, but let lfs_bmap fill it in */
 	}
 	/*

Index: src/libexec/lfs_cleanerd/lfs_cleanerd.c
diff -u src/libexec/lfs_cleanerd/lfs_cleanerd.c:1.49 src/libexec/lfs_cleanerd/lfs_cleanerd.c:1.50
--- src/libexec/lfs_cleanerd/lfs_cleanerd.c:1.49	Wed Aug 12 18:27:01 2015
+++ src/libexec/lfs_cleanerd/lfs_cleanerd.c	Wed Aug 12 18:28:00 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: lfs_cleanerd.c,v 1.49 2015/08/12 18:27:01 dholland Exp $	 */
+/* $NetBSD: lfs_cleanerd.c,v 1.50 2015/08/12 18:28:00 dholland Exp $	 */
 
 /*-
  * Copyright (c) 2005 The NetBSD Foundation, Inc.
@@ -420,7 +420,7 @@ parse_pseg(struct clfs *fs, daddr_t dadd
 	daddr_t idaddr, odaddr;
 	FINFO *fip;
 	struct ubuf *ifbp;
-	struct ulfs1_dinode *dip;
+	union lfs_dinode *dip;
 	u_int32_t ck, vers;
 	int fic, inoc, obic;
 	size_t sumstart;
@@ -489,16 +489,16 @@ parse_pseg(struct clfs *fs, daddr_t dadd
 		if (inoc < lfs_ss_getninos(fs, ssp) && *iaddrp == daddr) {
 			cp = fd_ptrget(fs->clfs_devvp, daddr);
 			ck = lfs_cksum_part(cp, sizeof(u_int32_t), ck);
-			dip = (struct ulfs1_dinode *)cp;
 			for (i = 0; i < lfs_sb_getinopb(fs); i++) {
-				if (dip[i].di_inumber == 0)
+				dip = DINO_IN_BLOCK(fs, cp, i);
+				if (lfs_dino_getinumber(fs, dip) == 0)
 					break;
 
 				/*
 				 * Check currency before adding it
 				 */
 #ifndef REPAIR_ZERO_FINFO
-				lfs_ientry(&ifp, fs, dip[i].di_inumber, &ifbp);
+				lfs_ientry(&ifp, fs, lfs_dino_getinumber(fs, dip), &ifbp);
 				idaddr = lfs_if_getdaddr(fs, ifp);
 				brelse(ifbp, 0);
 				if (idaddr != daddr)
@@ -518,13 +518,13 @@ parse_pseg(struct clfs *fs, daddr_t dadd
 					*bipp = bip;
 					return 0x0;
 				}
-				bip[*bic - 1].bi_inode = dip[i].di_inumber;
+				bip[*bic - 1].bi_inode = lfs_dino_getinumber(fs, dip);
 				bip[*bic - 1].bi_lbn = LFS_UNUSED_LBN;
 				bip[*bic - 1].bi_daddr = daddr;
 				bip[*bic - 1].bi_segcreate = lfs_ss_getcreate(fs, ssp);
-				bip[*bic - 1].bi_version = dip[i].di_gen;
-				bip[*bic - 1].bi_bp = &(dip[i]);
-				bip[*bic - 1].bi_size = LFS_DINODE1_SIZE;
+				bip[*bic - 1].bi_version = lfs_dino_getgen(fs, dip);
+				bip[*bic - 1].bi_bp = dip;
+				bip[*bic - 1].bi_size = DINOSIZE(fs);
 			}
 			inoc += i;
 			daddr += lfs_btofsb(fs, lfs_sb_getibsize(fs));

Index: src/sbin/dump/dump.h
diff -u src/sbin/dump/dump.h:1.52 src/sbin/dump/dump.h:1.53
--- src/sbin/dump/dump.h:1.52	Tue Jul 28 05:09:34 2015
+++ src/sbin/dump/dump.h	Wed Aug 12 18:28:00 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: dump.h,v 1.52 2015/07/28 05:09:34 dholland Exp $	*/
+/*	$NetBSD: dump.h,v 1.53 2015/08/12 18:28:00 dholland Exp $	*/
 
 /*-
  * Copyright (c) 1980, 1993
@@ -43,8 +43,8 @@ union dinode {
 	struct ufs1_dinode dp1;
 	struct ufs2_dinode dp2;
 #ifdef DUMP_LFS
-	struct ulfs1_dinode dlp1;
-	struct ulfs2_dinode dlp2;
+	struct lfs32_dinode dlp32;
+	struct lfs64_dinode dlp64;
 #endif
 };
 #define DIP(dp, field) \

Index: src/sbin/dump_lfs/lfs_inode.c
diff -u src/sbin/dump_lfs/lfs_inode.c:1.24 src/sbin/dump_lfs/lfs_inode.c:1.25
--- src/sbin/dump_lfs/lfs_inode.c:1.24	Wed Aug 12 18:25:52 2015
+++ src/sbin/dump_lfs/lfs_inode.c	Wed Aug 12 18:28:00 2015
@@ -1,4 +1,4 @@
-/*      $NetBSD: lfs_inode.c,v 1.24 2015/08/12 18:25:52 dholland Exp $ */
+/*      $NetBSD: lfs_inode.c,v 1.25 2015/08/12 18:28:00 dholland Exp $ */
 
 /*-
  * Copyright (c) 1980, 1991, 1993, 1994
@@ -39,7 +39,7 @@ __COPYRIGHT("@(#) Copyright (c) 1980, 19
 #if 0
 static char sccsid[] = "@(#)main.c      8.6 (Berkeley) 5/1/95";
 #else
-__RCSID("$NetBSD: lfs_inode.c,v 1.24 2015/08/12 18:25:52 dholland Exp $");
+__RCSID("$NetBSD: lfs_inode.c,v 1.25 2015/08/12 18:28:00 dholland Exp $");
 #endif
 #endif /* not lint */
 
@@ -196,7 +196,7 @@ fs_mapinodes(ino_t maxino, u_int64_t *ta
 #define T_UNITS (LFS_NINDIR(fs)*LFS_NINDIR(fs))
 
 static daddr_t
-lfs_bmap(struct lfs *fs, struct ulfs1_dinode *idinode, daddr_t lbn)
+lfs_bmap(struct lfs *fs, union lfs_dinode *idinode, daddr_t lbn)
 {
 	daddr_t residue, up;
 	int off=0;
@@ -204,7 +204,7 @@ lfs_bmap(struct lfs *fs, struct ulfs1_di
 
 	up = UNASSIGNED;	/* XXXGCC -Wunitialized [sh3] */
 	
-	if(lbn > 0 && lbn > lfs_lblkno(fs, idinode->di_size)) {
+	if(lbn > 0 && lbn > lfs_lblkno(fs, lfs_dino_getsize(fs, idinode))) {
 		return UNASSIGNED;
 	}
 	/*
@@ -217,13 +217,13 @@ lfs_bmap(struct lfs *fs, struct ulfs1_di
 		lbn *= -1;
 		if (lbn == ULFS_NDADDR) {
 			/* printf("lbn %d: single indir base\n", -lbn); */
-			return idinode->di_ib[0]; /* single indirect */
+			return lfs_dino_getib(fs, idinode, 0); /* single indirect */
 		} else if(lbn == BASE_DINDIR+1) {
 			/* printf("lbn %d: double indir base\n", -lbn); */
-			return idinode->di_ib[1]; /* double indirect */
+			return lfs_dino_getib(fs, idinode, 1); /* double indirect */
 		} else if(lbn == BASE_TINDIR+2) {
 			/* printf("lbn %d: triple indir base\n", -lbn); */
-			return idinode->di_ib[2]; /* triple indirect */
+			return lfs_dino_getib(fs, idinode, 2); /* triple indirect */
 		}
 
 		/*
@@ -233,7 +233,7 @@ lfs_bmap(struct lfs *fs, struct ulfs1_di
 		residue = (lbn-ULFS_NDADDR) % LFS_NINDIR(fs);
 		if(residue == 1) {
 			/* Double indirect.  Parent is the triple. */
-			up = idinode->di_ib[2];
+			up = lfs_dino_getib(fs, idinode, 2);
 			off = (lbn-2-BASE_TINDIR)/(LFS_NINDIR(fs)*LFS_NINDIR(fs));
 			if(up == UNASSIGNED || up == LFS_UNUSED_DADDR)
 				return UNASSIGNED;
@@ -260,7 +260,7 @@ lfs_bmap(struct lfs *fs, struct ulfs1_di
 	} else {
 		/* Direct block.  Its parent must be a single indirect. */
 		if (lbn < ULFS_NDADDR)
-			return idinode->di_db[lbn];
+			return lfs_dino_getdb(fs, idinode, lbn);
 		else {
 			/* Parent is an indirect block. */
 			up = -(((lbn-ULFS_NDADDR) / D_UNITS) * D_UNITS + ULFS_NDADDR);
@@ -284,14 +284,18 @@ lfs_ientry(ino_t ino)
 	daddr_t lbn;
 	daddr_t blkno;
 	union dinode *dp;
-	struct ulfs1_dinode *ldp;
+	union lfs_dinode *ldp;
 	unsigned index;
     
 	lbn = ino/lfs_sb_getifpb(sblock) + lfs_sb_getcleansz(sblock) + lfs_sb_getsegtabsz(sblock);
 	dp = getino(lfs_sb_getifile(sblock));
-	/* XXX XXX this is horribly unsafe */
-	ldp = (struct ulfs1_dinode *)dp;
-	blkno = lfs_bmap(sblock, ldp ,lbn);
+	/* XXX this is foolish */
+	if (sblock->lfs_is64) {
+		ldp = (union lfs_dinode *)&dp->dlp64;
+	} else {
+		ldp = (union lfs_dinode *)&dp->dlp32;
+	}
+	blkno = lfs_bmap(sblock, ldp, lbn);
 	if (blkno != ifblkno)
 		bread(LFS_FSBTODB(sblock, blkno), ifileblock,
 		    lfs_sb_getbsize(sblock));
@@ -306,14 +310,18 @@ lfs_ientry(ino_t ino)
 }
 
 /* Search a block for a specific dinode. */
-static struct ulfs1_dinode *
-lfs_ifind(struct lfs *fs, ino_t ino, struct ulfs1_dinode *dip)
+static union lfs_dinode *
+lfs_ifind(struct lfs *fs, ino_t ino, void *block)
 {
-	int cnt;
+	union lfs_dinode *dip;
+	unsigned i, num;
 
-	for (cnt = 0; cnt < LFS_INOPB(fs); cnt++)
-		if(dip[cnt].di_inumber == ino)
-			return &(dip[cnt]);
+	num = LFS_INOPB(fs);
+	for (i = num; i-- > 0; ) {
+		dip = DINO_IN_BLOCK(fs, block, i);
+		if (lfs_dino_getinumber(fs, dip) == ino)
+			return dip;
+	}
 	return NULL;
 }
 
@@ -322,19 +330,32 @@ getino(ino_t inum)
 {
 	static daddr_t inoblkno;
 	daddr_t blkno;
-	static struct ulfs1_dinode inoblock[MAXBSIZE / sizeof (struct ulfs1_dinode)];
+	static union {
+		char space[MAXBSIZE];
+		struct lfs64_dinode u_64[MAXBSIZE/sizeof(struct lfs64_dinode)];
+		struct lfs32_dinode u_32[MAXBSIZE/sizeof(struct lfs32_dinode)];
+	} inoblock;
 	static union dinode ifile_dinode; /* XXX fill this in */
 	static union dinode empty_dinode; /* Always stays zeroed */
-	struct ulfs1_dinode *dp;
+	union lfs_dinode *dp;
+	ino_t inum2;
 
 	if(inum == lfs_sb_getifile(sblock)) {
 		/* Load the ifile inode if not already */
-		if(ifile_dinode.dlp1.di_inumber == 0) {
+		inum2 = sblock->lfs_is64 ?
+			ifile_dinode.dlp64.di_inumber :
+			ifile_dinode.dlp32.di_inumber;
+		if (inum2 == 0) {
 			blkno = lfs_sb_getidaddr(sblock);
-			bread(LFS_FSBTODB(sblock, blkno), (char *)inoblock, 
+			bread(LFS_FSBTODB(sblock, blkno), inoblock.space,
 				(int)lfs_sb_getbsize(sblock));
-			dp = lfs_ifind(sblock, inum, inoblock);
-			ifile_dinode.dlp1 = *dp; /* Structure copy */
+			dp = lfs_ifind(sblock, inum, inoblock.space);
+			/* Structure copy */
+			if (sblock->lfs_is64) {
+				ifile_dinode.dlp64 = dp->u_64;
+			} else {
+				ifile_dinode.dlp32 = dp->u_32;
+			}
 		}
 		return &ifile_dinode;
 	}
@@ -345,15 +366,10 @@ getino(ino_t inum)
 		return &empty_dinode;
 
 	if(blkno != inoblkno) {
-		bread(LFS_FSBTODB(sblock, blkno), (char *)inoblock, 
+		bread(LFS_FSBTODB(sblock, blkno), inoblock.space,
 			(int)lfs_sb_getbsize(sblock));
-#ifdef notyet
-		if (needswap)
-			for (i = 0; i < MAXINOPB; i++)
-				ffs_dinode_swap(&inoblock[i], &inoblock[i]);
-#endif
 	}
-	return (void *)lfs_ifind(sblock, inum, inoblock);
+	return (void *)lfs_ifind(sblock, inum, inoblock.space);
 }
 
 /*

Index: src/sbin/fsck_lfs/dir.c
diff -u src/sbin/fsck_lfs/dir.c:1.35 src/sbin/fsck_lfs/dir.c:1.36
--- src/sbin/fsck_lfs/dir.c:1.35	Tue Jul 28 05:09:34 2015
+++ src/sbin/fsck_lfs/dir.c	Wed Aug 12 18:28:00 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: dir.c,v 1.35 2015/07/28 05:09:34 dholland Exp $	 */
+/* $NetBSD: dir.c,v 1.36 2015/08/12 18:28:00 dholland Exp $	 */
 
 /*
  * Copyright (c) 1980, 1986, 1993
@@ -81,7 +81,7 @@ struct lfs_odirtemplate odirhead = {
 	.dotdot_name = ".."
 };
 
-static int expanddir(struct uvnode *, struct ulfs1_dinode *, char *);
+static int expanddir(struct uvnode *, union lfs_dinode *, char *);
 static void freedir(ino_t, ino_t);
 static struct lfs_direct *fsck_readdir(struct uvnode *, struct inodesc *);
 static int lftempname(char *, ino_t);
@@ -327,19 +327,25 @@ void
 adjust(struct inodesc *idesc, short lcnt)
 {
 	struct uvnode *vp;
-	struct ulfs1_dinode *dp;
+	union lfs_dinode *dp;
+
+	/*
+	 * XXX: (1) since lcnt is apparently a delta, rename it; (2)
+	 * why is it a value to *subtract*? that is unnecessarily
+	 * confusing.
+	 */
 
 	vp = vget(fs, idesc->id_number);
 	dp = VTOD(vp);
-	if (dp->di_nlink == lcnt) {
+	if (lfs_dino_getnlink(fs, dp) == lcnt) {
 		if (linkup(idesc->id_number, (ino_t) 0) == 0)
 			clri(idesc, "UNREF", 0);
 	} else {
 		pwarn("LINK COUNT %s", (lfdir == idesc->id_number) ? lfname :
-		    ((dp->di_mode & LFS_IFMT) == LFS_IFDIR ? "DIR" : "FILE"));
+		    ((lfs_dino_getmode(fs, dp) & LFS_IFMT) == LFS_IFDIR ? "DIR" : "FILE"));
 		pinode(idesc->id_number);
 		printf(" COUNT %d SHOULD BE %d",
-		    dp->di_nlink, dp->di_nlink - lcnt);
+		    lfs_dino_getnlink(fs, dp), lfs_dino_getnlink(fs, dp) - lcnt);
 		if (preen) {
 			if (lcnt < 0) {
 				printf("\n");
@@ -348,7 +354,8 @@ adjust(struct inodesc *idesc, short lcnt
 			printf(" (ADJUSTED)\n");
 		}
 		if (preen || reply("ADJUST") == 1) {
-			dp->di_nlink -= lcnt;
+			lfs_dino_setnlink(fs, dp,
+			    lfs_dino_getnlink(fs, dp) - lcnt);
 			inodirty(VTOI(vp));
 		}
 	}
@@ -395,7 +402,7 @@ chgino(struct inodesc *idesc)
 int
 linkup(ino_t orphan, ino_t parentdir)
 {
-	struct ulfs1_dinode *dp;
+	union lfs_dinode *dp;
 	int lostdir;
 	ino_t oldlfdir;
 	struct inodesc idesc;
@@ -405,10 +412,10 @@ linkup(ino_t orphan, ino_t parentdir)
 	memset(&idesc, 0, sizeof(struct inodesc));
 	vp = vget(fs, orphan);
 	dp = VTOD(vp);
-	lostdir = (dp->di_mode & LFS_IFMT) == LFS_IFDIR;
+	lostdir = (lfs_dino_getmode(fs, dp) & LFS_IFMT) == LFS_IFDIR;
 	pwarn("UNREF %s ", lostdir ? "DIR" : "FILE");
 	pinode(orphan);
-	if (preen && dp->di_size == 0)
+	if (preen && lfs_dino_getsize(fs, dp) == 0)
 		return (0);
 	if (preen)
 		printf(" (RECONNECTED)\n");
@@ -447,7 +454,7 @@ linkup(ino_t orphan, ino_t parentdir)
 	}
 	vp = vget(fs, lfdir);
 	dp = VTOD(vp);
-	if ((dp->di_mode & LFS_IFMT) != LFS_IFDIR) {
+	if ((lfs_dino_getmode(fs, dp) & LFS_IFMT) != LFS_IFDIR) {
 		pfatal("lost+found IS NOT A DIRECTORY");
 		if (reply("REALLOCATE") == 0)
 			return (0);
@@ -523,10 +530,11 @@ changeino(ino_t dir, const char *name, i
 int
 makeentry(ino_t parent, ino_t ino, const char *name)
 {
-	struct ulfs1_dinode *dp;
+	union lfs_dinode *dp;
 	struct inodesc idesc;
 	char pathbuf[MAXPATHLEN + 1];
 	struct uvnode *vp;
+	uint64_t size;
 
 	if (parent < ULFS_ROOTINO || parent >= maxino ||
 	    ino < ULFS_ROOTINO || ino >= maxino)
@@ -540,8 +548,10 @@ makeentry(ino_t parent, ino_t ino, const
 	idesc.id_name = name;
 	vp = vget(fs, parent);
 	dp = VTOD(vp);
-	if (dp->di_size % LFS_DIRBLKSIZ) {
-		dp->di_size = roundup(dp->di_size, LFS_DIRBLKSIZ);
+	size = lfs_dino_getsize(fs, dp);
+	if (size % LFS_DIRBLKSIZ) {
+		size = roundup(size, LFS_DIRBLKSIZ);
+		lfs_dino_setsize(fs, dp, size);
 		inodirty(VTOI(vp));
 	}
 	if ((ckinode(dp, &idesc) & ALTERED) != 0)
@@ -558,22 +568,25 @@ makeentry(ino_t parent, ino_t ino, const
  * Attempt to expand the size of a directory
  */
 static int
-expanddir(struct uvnode *vp, struct ulfs1_dinode *dp, char *name)
+expanddir(struct uvnode *vp, union lfs_dinode *dp, char *name)
 {
 	daddr_t lastbn;
 	struct ubuf *bp;
 	char *cp, firstblk[LFS_DIRBLKSIZ];
 
-	lastbn = lfs_lblkno(fs, dp->di_size);
-	if (lastbn >= ULFS_NDADDR - 1 || dp->di_db[lastbn] == 0 || dp->di_size == 0)
+	lastbn = lfs_lblkno(fs, lfs_dino_getsize(fs, dp));
+	if (lastbn >= ULFS_NDADDR - 1 || lfs_dino_getdb(fs, dp, lastbn) == 0 ||
+	    lfs_dino_getsize(fs, dp) == 0)
 		return (0);
-	dp->di_db[lastbn + 1] = dp->di_db[lastbn];
-	dp->di_db[lastbn] = 0;
+	lfs_dino_setdb(fs, dp, lastbn + 1, lfs_dino_getdb(fs, dp, lastbn));
+	lfs_dino_setdb(fs, dp, lastbn, 0);
 	bp = getblk(vp, lastbn, lfs_sb_getbsize(fs));
 	VOP_BWRITE(bp);
-	dp->di_size += lfs_sb_getbsize(fs);
-	dp->di_blocks += lfs_btofsb(fs, lfs_sb_getbsize(fs));
-	bread(vp, dp->di_db[lastbn + 1],
+	lfs_dino_setsize(fs, dp,
+	    lfs_dino_getsize(fs, dp) + lfs_sb_getbsize(fs));
+	lfs_dino_setblocks(fs, dp,
+	    lfs_dino_getblocks(fs, dp) + lfs_btofsb(fs, lfs_sb_getbsize(fs)));
+	bread(vp, lfs_dino_getdb(fs, dp, lastbn + 1),
 	    (long) lfs_dblksize(fs, dp, lastbn + 1), 0, &bp);
 	if (bp->b_flags & B_ERROR)
 		goto bad;
@@ -587,7 +600,7 @@ expanddir(struct uvnode *vp, struct ulfs
 	    cp += LFS_DIRBLKSIZ)
 		memcpy(cp, &emptydir, sizeof emptydir);
 	VOP_BWRITE(bp);
-	bread(vp, dp->di_db[lastbn + 1],
+	bread(vp, lfs_dino_getdb(fs, dp, lastbn + 1),
 	    (long) lfs_dblksize(fs, dp, lastbn + 1), 0, &bp);
 	if (bp->b_flags & B_ERROR)
 		goto bad;
@@ -601,10 +614,12 @@ expanddir(struct uvnode *vp, struct ulfs
 	inodirty(VTOI(vp));
 	return (1);
 bad:
-	dp->di_db[lastbn] = dp->di_db[lastbn + 1];
-	dp->di_db[lastbn + 1] = 0;
-	dp->di_size -= lfs_sb_getbsize(fs);
-	dp->di_blocks -= lfs_btofsb(fs, lfs_sb_getbsize(fs));
+	lfs_dino_setdb(fs, dp, lastbn, lfs_dino_getdb(fs, dp, lastbn + 1));
+	lfs_dino_setdb(fs, dp, lastbn + 1, 0);
+	lfs_dino_setsize(fs, dp,
+	    lfs_dino_getsize(fs, dp) - lfs_sb_getbsize(fs));
+	lfs_dino_setblocks(fs, dp,
+	    lfs_dino_getblocks(fs, dp) - lfs_btofsb(fs, lfs_sb_getbsize(fs)));
 	return (0);
 }
 
@@ -616,7 +631,7 @@ allocdir(ino_t parent, ino_t request, in
 {
 	ino_t ino;
 	char *cp;
-	struct ulfs1_dinode *dp;
+	union lfs_dinode *dp;
 	struct ubuf *bp;
 	struct lfs_dirtemplate *dirp;
 	struct uvnode *vp;
@@ -627,7 +642,7 @@ allocdir(ino_t parent, ino_t request, in
 	dirp->dotdot_ino = parent;
 	vp = vget(fs, ino);
 	dp = VTOD(vp);
-	bread(vp, dp->di_db[0], lfs_sb_getfsize(fs), 0, &bp);
+	bread(vp, lfs_dino_getdb(fs, dp, 0), lfs_sb_getfsize(fs), 0, &bp);
 	if (bp->b_flags & B_ERROR) {
 		brelse(bp, 0);
 		freeino(ino);
@@ -639,10 +654,10 @@ allocdir(ino_t parent, ino_t request, in
 	    cp += LFS_DIRBLKSIZ)
 		memcpy(cp, &emptydir, sizeof emptydir);
 	VOP_BWRITE(bp);
-	dp->di_nlink = 2;
+	lfs_dino_setnlink(fs, dp, 2);
 	inodirty(VTOI(vp));
 	if (ino == ULFS_ROOTINO) {
-		lncntp[ino] = dp->di_nlink;
+		lncntp[ino] = lfs_dino_getnlink(fs, dp);
 		cacheino(dp, ino);
 		return (ino);
 	}
@@ -653,12 +668,12 @@ allocdir(ino_t parent, ino_t request, in
 	cacheino(dp, ino);
 	statemap[ino] = statemap[parent];
 	if (statemap[ino] == DSTATE) {
-		lncntp[ino] = dp->di_nlink;
+		lncntp[ino] = lfs_dino_getnlink(fs, dp);
 		lncntp[parent]++;
 	}
 	vp = vget(fs, parent);
 	dp = VTOD(vp);
-	dp->di_nlink++;
+	lfs_dino_setnlink(fs, dp, lfs_dino_getnlink(fs, dp) + 1);
 	inodirty(VTOI(vp));
 	return (ino);
 }

Index: src/sbin/fsck_lfs/extern.h
diff -u src/sbin/fsck_lfs/extern.h:1.11 src/sbin/fsck_lfs/extern.h:1.12
--- src/sbin/fsck_lfs/extern.h:1.11	Sat Jun  8 02:12:56 2013
+++ src/sbin/fsck_lfs/extern.h	Wed Aug 12 18:28:00 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: extern.h,v 1.11 2013/06/08 02:12:56 dholland Exp $	 */
+/* $NetBSD: extern.h,v 1.12 2015/08/12 18:28:00 dholland Exp $	 */
 
 /*
  * Copyright (c) 1994 James A. Jegers
@@ -28,13 +28,13 @@ void adjust(struct inodesc *, short);
 int allocblk(long);
 int allocdir(ino_t, ino_t, int);
 void blkerror(ino_t, const char *, daddr_t);
-void cacheino(struct ulfs1_dinode *, ino_t);
+void cacheino(union lfs_dinode *, ino_t);
 int changeino(ino_t, const char *, ino_t);
 struct fstab;
 void checkinode(ino_t, struct inodesc *);
 int chkrange(daddr_t, int);
 void ckfini(int);
-int ckinode(struct ulfs1_dinode *, struct inodesc *);
+int ckinode(union lfs_dinode *, struct inodesc *);
 void clri(struct inodesc *, const char *, int);
 int dircheck(struct inodesc *, struct lfs_direct *);
 void direrror(ino_t, const char *);
@@ -47,7 +47,7 @@ void flush(int, struct ubufarea *);
 void freeblk(daddr_t, long);
 void freeino(ino_t);
 void freeinodebuf(void);
-int ftypeok(struct ulfs1_dinode *);
+int ftypeok(union lfs_dinode *);
 void getpathname(char *, size_t, ino_t, ino_t);
 void inocleanup(void);
 void inodirty(struct inode *);

Index: src/sbin/fsck_lfs/fsck.h
diff -u src/sbin/fsck_lfs/fsck.h:1.20 src/sbin/fsck_lfs/fsck.h:1.21
--- src/sbin/fsck_lfs/fsck.h:1.20	Sat Jun  8 02:12:56 2013
+++ src/sbin/fsck_lfs/fsck.h	Wed Aug 12 18:28:00 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: fsck.h,v 1.20 2013/06/08 02:12:56 dholland Exp $	 */
+/* $NetBSD: fsck.h,v 1.21 2015/08/12 18:28:00 dholland Exp $	 */
 
 /*-
  * Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -101,7 +101,8 @@ struct ubufarea {
 		int32_t *b_indir;	/* indirect block */
 		struct lfs *b_fs;	/* super block */
 		struct cg *b_cg;/* cylinder group */
-		struct ulfs1_dinode *b_dinode;	/* inode block */
+		struct lfs32_dinode *b_dinode32;	/* inode block */
+		struct lfs64_dinode *b_dinode64;	/* inode block */
 	}     b_un;
 	char b_dirty;
 };
@@ -128,7 +129,7 @@ struct inodesc {
 	daddr_t id_blkno;	/* current block number being examined */
 	daddr_t id_lblkno;	/* current logical block number */
 	int id_numfrags;	/* number of frags contained in block */
-	quad_t id_filesize;	/* for DATA nodes, the size of the directory */
+	off_t id_filesize;	/* for DATA nodes, the size of the directory */
 	int id_loc;		/* for DATA nodes, current location in dir */
 	int id_entryno;		/* for DATA nodes, current entry number */
 	struct lfs_direct *id_dirp;	/* for DATA nodes, ptr to current entry */
@@ -206,7 +207,7 @@ int	Uflag;			/* resolve user names */
 
 ino_t allocino(ino_t, int);
 int ino_to_fsba(struct lfs *, ino_t);
-struct ulfs1_dinode *ginode(ino_t);
+union lfs_dinode *ginode(ino_t);
 struct inoinfo *getinoinfo(ino_t);
 daddr_t lfs_ino_daddr(ino_t);
 void clearinode(ino_t);

Index: src/sbin/fsck_lfs/fsck_vars.h
diff -u src/sbin/fsck_lfs/fsck_vars.h:1.13 src/sbin/fsck_lfs/fsck_vars.h:1.14
--- src/sbin/fsck_lfs/fsck_vars.h:1.13	Thu Jun  6 00:52:50 2013
+++ src/sbin/fsck_lfs/fsck_vars.h	Wed Aug 12 18:28:00 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: fsck_vars.h,v 1.13 2013/06/06 00:52:50 dholland Exp $	 */
+/* $NetBSD: fsck_vars.h,v 1.14 2015/08/12 18:28:00 dholland Exp $	 */
 
 /*
  * Copyright (c) 1980, 1986, 1993
@@ -76,6 +76,4 @@ extern int lfmode;		/* lost & found dire
 extern daddr_t n_blks;		/* number of blocks in use */
 extern ino_t n_files;		/* number of files in use */
 
-extern struct ulfs1_dinode zino;
-
 extern int no_roll_forward;	/* Don't roll forward */

Index: src/sbin/fsck_lfs/inode.c
diff -u src/sbin/fsck_lfs/inode.c:1.58 src/sbin/fsck_lfs/inode.c:1.59
--- src/sbin/fsck_lfs/inode.c:1.58	Wed Aug 12 18:25:52 2015
+++ src/sbin/fsck_lfs/inode.c	Wed Aug 12 18:28:00 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: inode.c,v 1.58 2015/08/12 18:25:52 dholland Exp $	 */
+/* $NetBSD: inode.c,v 1.59 2015/08/12 18:28:00 dholland Exp $	 */
 
 /*-
  * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
@@ -98,7 +98,7 @@ int lfs_maxino(void);
  * Get a dinode of a given inum.
  * XXX combine this function with vget.
  */
-struct ulfs1_dinode *
+union lfs_dinode *
 ginode(ino_t ino)
 {
 	struct uvnode *vp;
@@ -116,21 +116,22 @@ ginode(ino_t ino)
 		daddr = lfs_if_getdaddr(fs, ifp);
 		segno = lfs_dtosn(fs, daddr);
 		din_table[ino] = daddr;
-		seg_table[segno].su_nbytes += LFS_DINODE1_SIZE;
+		seg_table[segno].su_nbytes += DINOSIZE(fs);
 		brelse(bp, 0);
 	}
-	return (VTOI(vp)->i_din.ffs1_din);
+	// XXX bogus cast
+	return (union lfs_dinode *)(VTOI(vp)->i_din.ffs1_din);
 }
 
 /*
  * Check validity of held blocks in an inode, recursing through all blocks.
  */
 int
-ckinode(struct ulfs1_dinode *dp, struct inodesc *idesc)
+ckinode(union lfs_dinode *dp, struct inodesc *idesc)
 {
-	ulfs_daddr_t *ap, lbn;
+	ulfs_daddr_t lbn, pbn;
 	long ret, n, ndb, offset;
-	struct ulfs1_dinode dino;
+	union lfs_dinode dino;
 	u_int64_t remsize, sizepb;
 	mode_t mode;
 	char pathbuf[MAXPATHLEN + 1];
@@ -139,30 +140,31 @@ ckinode(struct ulfs1_dinode *dp, struct 
 	if (idesc->id_fix != IGNORE)
 		idesc->id_fix = DONTKNOW;
 	idesc->id_entryno = 0;
-	idesc->id_filesize = dp->di_size;
-	mode = dp->di_mode & LFS_IFMT;
+	idesc->id_filesize = lfs_dino_getsize(fs, dp);
+	mode = lfs_dino_getmode(fs, dp) & LFS_IFMT;
 	if (mode == LFS_IFBLK || mode == LFS_IFCHR ||
-	    (mode == LFS_IFLNK && (dp->di_size < lfs_sb_getmaxsymlinklen(fs) ||
+	    (mode == LFS_IFLNK && (lfs_dino_getsize(fs, dp) < lfs_sb_getmaxsymlinklen(fs) ||
 		    (lfs_sb_getmaxsymlinklen(fs) == 0 &&
-			dp->di_blocks == 0))))
+			lfs_dino_getblocks(fs, dp) == 0))))
 		return (KEEPON);
+	/* XXX is this safe if we're 32-bit? */
 	dino = *dp;
-	ndb = howmany(dino.di_size, lfs_sb_getbsize(fs));
+	ndb = howmany(lfs_dino_getsize(fs, &dino), lfs_sb_getbsize(fs));
 
 	thisvp = vget(fs, idesc->id_number);
 	for (lbn = 0; lbn < ULFS_NDADDR; lbn++) {
-		ap = dino.di_db + lbn;
+		pbn = lfs_dino_getdb(fs, &dino, lbn);
 		if (thisvp)
 			idesc->id_numfrags =
 				lfs_numfrags(fs, VTOI(thisvp)->i_lfs_fragsize[lbn]);
 		else {
-			if (--ndb == 0 && (offset = lfs_blkoff(fs, dino.di_size)) != 0) {
+			if (--ndb == 0 && (offset = lfs_blkoff(fs, lfs_dino_getsize(fs, &dino))) != 0) {
 				idesc->id_numfrags =
 			    	lfs_numfrags(fs, lfs_fragroundup(fs, offset));
 			} else
 				idesc->id_numfrags = lfs_sb_getfrag(fs);
 		}
-		if (*ap == 0) {
+		if (pbn == 0) {
 			if (idesc->id_type == DATA && ndb >= 0) {
 				/* An empty block in a directory XXX */
 				getpathname(pathbuf, sizeof(pathbuf),
@@ -172,8 +174,8 @@ ckinode(struct ulfs1_dinode *dp, struct 
 				if (reply("ADJUST LENGTH") == 1) {
 					vp = vget(fs, idesc->id_number);
 					dp = VTOD(vp);
-					dp->di_size = (ap - &dino.di_db[0]) *
-					    lfs_sb_getbsize(fs);
+					lfs_dino_setsize(fs, dp,
+					    lbn * lfs_sb_getbsize(fs));
 					printf(
 					    "YOU MUST RERUN FSCK AFTERWARDS\n");
 					rerun = 1;
@@ -183,8 +185,8 @@ ckinode(struct ulfs1_dinode *dp, struct 
 			}
 			continue;
 		}
-		idesc->id_blkno = *ap;
-		idesc->id_lblkno = ap - &dino.di_db[0];
+		idesc->id_blkno = pbn;
+		idesc->id_lblkno = lbn;
 		if (idesc->id_type == ADDR) {
 			ret = (*idesc->id_func) (idesc);
 		} else
@@ -193,11 +195,12 @@ ckinode(struct ulfs1_dinode *dp, struct 
 			return (ret);
 	}
 	idesc->id_numfrags = lfs_sb_getfrag(fs);
-	remsize = dino.di_size - lfs_sb_getbsize(fs) * ULFS_NDADDR;
+	remsize = lfs_dino_getsize(fs, &dino) - lfs_sb_getbsize(fs) * ULFS_NDADDR;
 	sizepb = lfs_sb_getbsize(fs);
-	for (ap = &dino.di_ib[0], n = 1; n <= ULFS_NIADDR; ap++, n++) {
-		if (*ap) {
-			idesc->id_blkno = *ap;
+	for (n = 1; n <= ULFS_NIADDR; n++) {
+		pbn = lfs_dino_getib(fs, &dino, n-1);
+		if (pbn) {
+			idesc->id_blkno = pbn;
 			ret = iblock(idesc, n, remsize);
 			if (ret & STOP)
 				return (ret);
@@ -211,7 +214,8 @@ ckinode(struct ulfs1_dinode *dp, struct 
 				if (reply("ADJUST LENGTH") == 1) {
 					vp = vget(fs, idesc->id_number);
 					dp = VTOD(vp);
-					dp->di_size -= remsize;
+					lfs_dino_setsize(fs, dp,
+					    lfs_dino_getsize(fs, dp) - remsize);
 					remsize = 0;
 					printf(
 					    "YOU MUST RERUN FSCK AFTERWARDS\n");
@@ -355,13 +359,13 @@ chkrange(daddr_t blk, int cnt)
  * Enter inodes into the cache.
  */
 void
-cacheino(struct ulfs1_dinode * dp, ino_t inumber)
+cacheino(union lfs_dinode *dp, ino_t inumber)
 {
 	struct inoinfo *inp;
 	struct inoinfo **inpp, **ninpsort;
-	unsigned int blks;
+	unsigned int blks, i;
 
-	blks = howmany(dp->di_size, lfs_sb_getbsize(fs));
+	blks = howmany(lfs_dino_getsize(fs, dp), lfs_sb_getbsize(fs));
 	if (blks > ULFS_NDADDR)
 		blks = ULFS_NDADDR + ULFS_NIADDR;
 	inp = emalloc(sizeof(*inp) + (blks - 1) * sizeof(ulfs_daddr_t));
@@ -375,10 +379,15 @@ cacheino(struct ulfs1_dinode * dp, ino_t
 		inp->i_parent = (ino_t) 0;
 	inp->i_dotdot = (ino_t) 0;
 	inp->i_number = inumber;
-	inp->i_isize = dp->di_size;
+	inp->i_isize = lfs_dino_getsize(fs, dp);
 
 	inp->i_numblks = blks * sizeof(ulfs_daddr_t);
-	memcpy(&inp->i_blks[0], &dp->di_db[0], (size_t) inp->i_numblks);
+	for (i=0; i<blks && i<ULFS_NDADDR; i++) {
+		inp->i_blks[i] = lfs_dino_getdb(fs, dp, i);
+	}
+	for (; i<blks; i++) {
+		inp->i_blks[i] = lfs_dino_getib(fs, dp, i - ULFS_NDADDR);
+	}
 	if (inplast == listmax) {
 		ninpsort = erealloc(inpsort,
 		    (listmax + 100) * sizeof(struct inoinfo *));
@@ -480,9 +489,9 @@ clearinode(ino_t inumber)
 		SEGUSE *sup;
 		u_int32_t oldsn = lfs_dtosn(fs, daddr);
 
-		seg_table[oldsn].su_nbytes -= LFS_DINODE1_SIZE;
+		seg_table[oldsn].su_nbytes -= DINOSIZE(fs);
 		LFS_SEGENTRY(sup, fs, oldsn, bp);
-		sup->su_nbytes -= LFS_DINODE1_SIZE;
+		sup->su_nbytes -= DINOSIZE(fs);
 		LFS_WRITESEGENTRY(sup, fs, oldsn, bp);	/* Ifile */
 	}
 }
@@ -524,7 +533,7 @@ findino(struct inodesc * idesc)
 void
 pinode(ino_t ino)
 {
-	struct ulfs1_dinode *dp;
+	union lfs_dinode *dp;
 	struct passwd *pw;
 
 	printf(" I=%llu ", (unsigned long long)ino);
@@ -534,16 +543,16 @@ pinode(ino_t ino)
 	if (dp) {
 		printf(" OWNER=");
 #ifndef SMALL
-		if (Uflag && (pw = getpwuid((int) dp->di_uid)) != 0)
+		if (Uflag && (pw = getpwuid(lfs_dino_getuid(fs, dp))) != 0)
 			printf("%s ", pw->pw_name);
 		else
 #endif
-			printf("%u ", (unsigned) dp->di_uid);
-		printf("MODE=%o\n", dp->di_mode);
+			printf("%u ", (unsigned)lfs_dino_getuid(fs, dp));
+		printf("MODE=%o\n", lfs_dino_getmode(fs, dp));
 		if (preen)
 			printf("%s: ", cdevname());
-		printf("SIZE=%llu ", (unsigned long long) dp->di_size);
-		printf("MTIME=%s ", print_mtime(dp->di_mtime));
+		printf("SIZE=%ju ", (uintmax_t) lfs_dino_getsize(fs, dp));
+		printf("MTIME=%s ", print_mtime(lfs_dino_getmtime(fs, dp)));
 	}
 }
 
@@ -583,7 +592,7 @@ ino_t
 allocino(ino_t request, int type)
 {
 	ino_t ino;
-	struct ulfs1_dinode *dp;
+	union lfs_dinode *dp;
 	time_t t;
 	struct uvnode *vp;
 	struct ubuf *bp;
@@ -612,15 +621,17 @@ allocino(ino_t request, int type)
         vp = lfs_valloc(fs, ino);
 	if (vp == NULL)
 		return (0);
-	dp = (VTOI(vp)->i_din.ffs1_din);
+	// XXX bogus cast
+	dp = (union lfs_dinode *)(VTOI(vp)->i_din.ffs1_din);
 	bp = getblk(vp, 0, lfs_sb_getfsize(fs));
 	VOP_BWRITE(bp);
-	dp->di_mode = type;
+	lfs_dino_setmode(fs, dp, type);
 	(void) time(&t);
-	dp->di_atime = t;
-	dp->di_mtime = dp->di_ctime = dp->di_atime;
-	dp->di_size = lfs_sb_getfsize(fs);
-	dp->di_blocks = lfs_btofsb(fs, lfs_sb_getfsize(fs));
+	lfs_dino_setatime(fs, dp, t);
+	lfs_dino_setctime(fs, dp, t);
+	lfs_dino_setmtime(fs, dp, t);
+	lfs_dino_setsize(fs, dp, lfs_sb_getfsize(fs));
+	lfs_dino_setblocks(fs, dp, lfs_btofsb(fs, lfs_sb_getfsize(fs)));
 	n_files++;
 	inodirty(VTOI(vp));
 	typemap[ino] = LFS_IFTODT(type);

Index: src/sbin/fsck_lfs/lfs.c
diff -u src/sbin/fsck_lfs/lfs.c:1.55 src/sbin/fsck_lfs/lfs.c:1.56
--- src/sbin/fsck_lfs/lfs.c:1.55	Wed Aug 12 18:27:01 2015
+++ src/sbin/fsck_lfs/lfs.c	Wed Aug 12 18:28:00 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: lfs.c,v 1.55 2015/08/12 18:27:01 dholland Exp $ */
+/* $NetBSD: lfs.c,v 1.56 2015/08/12 18:28:00 dholland Exp $ */
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -310,22 +310,24 @@ lfs_vop_bmap(struct uvnode * vp, daddr_t
 }
 
 /* Search a block for a specific dinode. */
-struct ulfs1_dinode *
-lfs_ifind(struct lfs * fs, ino_t ino, struct ubuf * bp)
+union lfs_dinode *
+lfs_ifind(struct lfs *fs, ino_t ino, struct ubuf *bp)
 {
-	struct ulfs1_dinode *dip = (struct ulfs1_dinode *) bp->b_data;
-	struct ulfs1_dinode *ldip, *fin;
+	union lfs_dinode *ldip;
+	unsigned i, num;
 
-	fin = dip + LFS_INOPB(fs);
+	num = LFS_INOPB(fs);
 
 	/*
 	 * Read the inode block backwards, since later versions of the
 	 * inode will supercede earlier ones.  Though it is unlikely, it is
 	 * possible that the same inode will appear in the same inode block.
 	 */
-	for (ldip = fin - 1; ldip >= dip; --ldip)
-		if (ldip->di_inumber == ino)
+	for (i = num; i-- > 0; ) {
+		ldip = DINO_IN_BLOCK(fs, bp->b_data, i);
+		if (lfs_dino_getinumber(fs, ldip) == ino)
 			return (ldip);
+	}
 	return NULL;
 }
 
@@ -338,7 +340,7 @@ lfs_raw_vget(struct lfs * fs, ino_t ino,
 {
 	struct uvnode *vp;
 	struct inode *ip;
-	struct ulfs1_dinode *dip;
+	union lfs_dinode *dip;
 	struct ubuf *bp;
 	int i, hash;
 
@@ -354,7 +356,9 @@ lfs_raw_vget(struct lfs * fs, ino_t ino,
 
 	ip = ecalloc(1, sizeof(*ip));
 
-	ip->i_din.ffs1_din = ecalloc(1, sizeof(*ip->i_din.ffs1_din));
+	dip = ecalloc(1, sizeof(*dip));
+	// XXX bogus cast
+	ip->i_din.ffs1_din = (struct lfs32_dinode *)dip;
 
 	/* Initialize the inode -- from lfs_vcreate. */
 	ip->inode_ext.lfs = ecalloc(1, sizeof(*ip->inode_ext.lfs));
@@ -377,7 +381,12 @@ lfs_raw_vget(struct lfs * fs, ino_t ino,
 			free(vp);
 			return NULL;
 		}
-		memcpy(ip->i_din.ffs1_din, dip, sizeof(*dip));
+		// 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));
+		}
 		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.9 src/sbin/fsck_lfs/lfs_user.h:1.10
--- src/sbin/fsck_lfs/lfs_user.h:1.9	Wed Aug 12 18:27:01 2015
+++ src/sbin/fsck_lfs/lfs_user.h	Wed Aug 12 18:28:00 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: lfs_user.h,v 1.9 2015/08/12 18:27:01 dholland Exp $ */
+/* $NetBSD: lfs_user.h,v 1.10 2015/08/12 18:28:00 dholland Exp $ */
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -72,7 +72,8 @@ typedef int32_t ulfs_daddr_t;
 
 /* Convert between inode pointers and vnode pointers. */
 #define	VTOI(vp)	((struct inode *)(vp)->v_data)
-#define VTOD(vp)	(VTOI(vp)->i_din.ffs1_din)
+// XXX bogus cast
+#define VTOD(vp)	((union lfs_dinode *)(VTOI(vp)->i_din.ffs1_din))
 
 #define sbdirty()	++fsdirty
 
@@ -88,7 +89,7 @@ struct lfs *lfs_init(int, daddr_t, daddr
 struct lfs *lfs_verify(struct lfs *, struct lfs *, struct uvnode *, int);
 int check_summary(struct lfs *, union segsum *, ulfs_daddr_t, int, struct uvnode *, void (*)(ulfs_daddr_t, union finfo *));
 ulfs_daddr_t try_verify(struct lfs *, struct uvnode *, ulfs_daddr_t, int);
-struct ulfs1_dinode *lfs_ifind(struct lfs *, ino_t, struct ubuf *);
+union lfs_dinode *lfs_ifind(struct lfs *, ino_t, struct ubuf *);
 void call_panic(const char *, ...);
 void my_vpanic(int, const char *, va_list);
 int extend_ifile(struct lfs *);

Index: src/sbin/fsck_lfs/pass1.c
diff -u src/sbin/fsck_lfs/pass1.c:1.41 src/sbin/fsck_lfs/pass1.c:1.42
--- src/sbin/fsck_lfs/pass1.c:1.41	Wed Aug 12 18:25:52 2015
+++ src/sbin/fsck_lfs/pass1.c	Wed Aug 12 18:28:00 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: pass1.c,v 1.41 2015/08/12 18:25:52 dholland Exp $	 */
+/* $NetBSD: pass1.c,v 1.42 2015/08/12 18:28:00 dholland Exp $	 */
 
 /*
  * Copyright (c) 1980, 1986, 1993
@@ -90,7 +90,7 @@ pass1(void)
 	ino_t inumber;
 	int i;
 	struct inodesc idesc;
-	struct ulfs1_dinode *tinode;
+	union lfs_dinode *tinode;
 	IFILE *ifp;
 	struct ubuf *bp;
 	struct ino_daddr **dins;
@@ -131,7 +131,7 @@ pass1(void)
 		if (inumber == 0 || dins[i]->daddr == 0)
 			continue;
 		tinode = ginode(inumber);
-		if (tinode && (tinode->di_mode & LFS_IFMT) == LFS_IFDIR)
+		if (tinode && (lfs_dino_getmode(fs, tinode) & LFS_IFMT) == LFS_IFDIR)
 			numdirs++;
 	}
 
@@ -159,15 +159,41 @@ pass1(void)
 	free(dins);
 }
 
+static int
+nonzero_db(union lfs_dinode *dip)
+{
+	unsigned i;
+
+	for (i=0; i<ULFS_NDADDR; i++) {
+		if (lfs_dino_getdb(fs, dip, i) != 0) {
+			return 1;
+		}
+	}
+	return 0;
+}
+
+static int
+nonzero_ib(union lfs_dinode *dip)
+{
+	unsigned i;
+
+	for (i=0; i<ULFS_NIADDR; i++) {
+		if (lfs_dino_getib(fs, dip, i) != 0) {
+			return 1;
+		}
+	}
+	return 0;
+}
+
 void
 checkinode(ino_t inumber, struct inodesc * idesc)
 {
-	struct ulfs1_dinode *dp;
+	union lfs_dinode *dp;
 	struct uvnode  *vp;
 	struct zlncnt *zlnp;
 	struct ubuf *bp;
 	IFILE *ifp;
-	int ndb, j;
+	int64_t ndb, j;
 	mode_t mode;
 
 	vp = vget(fs, inumber);
@@ -180,14 +206,13 @@ checkinode(ino_t inumber, struct inodesc
 		statemap[inumber] = USTATE;
 		return;
 	}
-	mode = dp->di_mode & LFS_IFMT;
+	mode = lfs_dino_getmode(fs, dp) & LFS_IFMT;
 
 	/* XXX - LFS doesn't have this particular problem (?) */
 	if (mode == 0) {
-		if (memcmp(dp->di_db, zino.di_db, ULFS_NDADDR * sizeof(ulfs_daddr_t)) ||
-		    memcmp(dp->di_ib, zino.di_ib, ULFS_NIADDR * sizeof(ulfs_daddr_t)) ||
-		    dp->di_mode || dp->di_size) {
-			pwarn("mode=o%o, ifmt=o%o\n", dp->di_mode, mode);
+		if (nonzero_db(dp) || nonzero_ib(dp) ||
+		    lfs_dino_getmode(fs, dp) || lfs_dino_getsize(fs, dp)) {
+			pwarn("mode=o%o, ifmt=o%o\n", lfs_dino_getmode(fs, dp), mode);
 			pfatal("PARTIALLY ALLOCATED INODE I=%llu",
 			    (unsigned long long)inumber);
 			if (reply("CLEAR") == 1) {
@@ -200,25 +225,25 @@ checkinode(ino_t inumber, struct inodesc
 		return;
 	}
 	lastino = inumber;
-	if (/* dp->di_size < 0 || */
-	    dp->di_size + lfs_sb_getbsize(fs) - 1 < dp->di_size) {
+	if (/* lfs_dino_getsize(fs, dp) < 0 || */
+	    lfs_dino_getsize(fs, dp) + lfs_sb_getbsize(fs) - 1 < lfs_dino_getsize(fs, dp)) {
 		if (debug)
-			printf("bad size %llu:",
-			    (unsigned long long) dp->di_size);
+			printf("bad size %ju:",
+			    (uintmax_t)lfs_dino_getsize(fs, dp));
 		goto unknown;
 	}
 	if (!preen && mode == LFS_IFMT && reply("HOLD BAD BLOCK") == 1) {
 		vp = vget(fs, inumber);
 		dp = VTOD(vp);
-		dp->di_size = lfs_sb_getfsize(fs);
-		dp->di_mode = LFS_IFREG | 0600;
+		lfs_dino_setsize(fs, dp, lfs_sb_getfsize(fs));
+		lfs_dino_setmode(fs, dp, LFS_IFREG | 0600);
 		inodirty(VTOI(vp));
 	}
-	ndb = howmany(dp->di_size, lfs_sb_getbsize(fs));
+	ndb = howmany(lfs_dino_getsize(fs, dp), lfs_sb_getbsize(fs));
 	if (ndb < 0) {
 		if (debug)
-			printf("bad size %llu ndb %d:",
-			    (unsigned long long) dp->di_size, ndb);
+			printf("bad size %ju ndb %jd:",
+			    (uintmax_t)lfs_dino_getsize(fs, dp), (intmax_t)ndb);
 		goto unknown;
 	}
 	if (mode == LFS_IFBLK || mode == LFS_IFCHR)
@@ -228,9 +253,9 @@ checkinode(ino_t inumber, struct inodesc
 		 * Fake ndb value so direct/indirect block checks below
 		 * will detect any garbage after symlink string.
 		 */
-		if (dp->di_size < lfs_sb_getmaxsymlinklen(fs) ||
-		    (lfs_sb_getmaxsymlinklen(fs) == 0 && dp->di_blocks == 0)) {
-			ndb = howmany(dp->di_size, sizeof(ulfs_daddr_t));
+		if (lfs_dino_getsize(fs, dp) < lfs_sb_getmaxsymlinklen(fs) ||
+		    (lfs_sb_getmaxsymlinklen(fs) == 0 && lfs_dino_getblocks(fs, dp) == 0)) {
+			ndb = howmany(lfs_dino_getsize(fs, dp), sizeof(ulfs_daddr_t));
 			if (ndb > ULFS_NDADDR) {
 				j = ndb - ULFS_NDADDR;
 				for (ndb = 1; j > 1; j--)
@@ -240,33 +265,37 @@ checkinode(ino_t inumber, struct inodesc
 		}
 	}
 	for (j = ndb; j < ULFS_NDADDR; j++)
-		if (dp->di_db[j] != 0) {
+		if (lfs_dino_getdb(fs, dp, j) != 0) {
 			if (debug)
-				printf("bad direct addr for size %lld lbn %d: 0x%x\n",
-					(long long)dp->di_size, j, (unsigned)dp->di_db[j]);
+				printf("bad direct addr for size %ju lbn %jd: 0x%jx\n",
+					(uintmax_t)lfs_dino_getsize(fs, dp),
+					(intmax_t)j,
+					(intmax_t)lfs_dino_getdb(fs, dp, j));
 			goto unknown;
 		}
 	for (j = 0, ndb -= ULFS_NDADDR; ndb > 0; j++)
 		ndb /= LFS_NINDIR(fs);
 	for (; j < ULFS_NIADDR; j++)
-		if (dp->di_ib[j] != 0) {
+		if (lfs_dino_getib(fs, dp, j) != 0) {
 			if (debug)
-				printf("bad indirect addr for size %lld # %d: 0x%x\n",
-					(long long)dp->di_size, j, (unsigned)dp->di_ib[j]);
+				printf("bad indirect addr for size %ju # %jd: 0x%jx\n",
+					(uintmax_t)lfs_dino_getsize(fs, dp),
+					(intmax_t)j,
+					(intmax_t)lfs_dino_getib(fs, dp, j));
 			goto unknown;
 		}
 	if (ftypeok(dp) == 0)
 		goto unknown;
 	n_files++;
-	lncntp[inumber] = dp->di_nlink;
-	if (dp->di_nlink <= 0) {
+	lncntp[inumber] = lfs_dino_getnlink(fs, dp);
+	if (lfs_dino_getnlink(fs, dp) <= 0) {
 		zlnp = emalloc(sizeof *zlnp);
 		zlnp->zlncnt = inumber;
 		zlnp->next = zlnhead;
 		zlnhead = zlnp;
 	}
 	if (mode == LFS_IFDIR) {
-		if (dp->di_size == 0)
+		if (lfs_dino_getsize(fs, dp) == 0)
 			statemap[inumber] = DCLEAR;
 		else
 			statemap[inumber] = DSTATE;
@@ -279,7 +308,7 @@ checkinode(ino_t inumber, struct inodesc
 	 * to rewrite blocks from a file whose directory operation (removal)
 	 * is in progress.
 	 */
-	if (dp->di_nlink <= 0) {
+	if (lfs_dino_getnlink(fs, dp) <= 0) {
 		LFS_IENTRY(ifp, fs, inumber, bp);
 		if (lfs_if_getnextfree(fs, ifp) == LFS_ORPHAN_NEXTFREE) {
 			statemap[inumber] = (mode == LFS_IFDIR ? DCLEAR : FCLEAR);
@@ -292,19 +321,21 @@ checkinode(ino_t inumber, struct inodesc
 		brelse(bp, 0);
 	}
 
+	/* XXX: why VTOD(vp) instead of dp here? */
+
 	typemap[inumber] = LFS_IFTODT(mode);
 	badblk = dupblk = 0;
 	idesc->id_number = inumber;
 	(void) ckinode(VTOD(vp), idesc);
-	if (dp->di_blocks != idesc->id_entryno) {
-		pwarn("INCORRECT BLOCK COUNT I=%llu (%d SHOULD BE %d)",
-		    (unsigned long long)inumber, dp->di_blocks,
+	if (lfs_dino_getblocks(fs, dp) != idesc->id_entryno) {
+		pwarn("INCORRECT BLOCK COUNT I=%llu (%ju SHOULD BE %d)",
+		    (unsigned long long)inumber, lfs_dino_getblocks(fs, dp),
 		    idesc->id_entryno);
 		if (preen)
 			printf(" (CORRECTED)\n");
 		else if (reply("CORRECT") == 0)
 			return;
-		VTOI(vp)->i_ffs1_blocks = idesc->id_entryno;
+		lfs_dino_setblocks(fs, VTOD(vp), idesc->id_entryno);
 		inodirty(VTOI(vp));
 	}
 	return;
Index: src/sbin/fsck_lfs/pass6.c
diff -u src/sbin/fsck_lfs/pass6.c:1.41 src/sbin/fsck_lfs/pass6.c:1.42
--- src/sbin/fsck_lfs/pass6.c:1.41	Wed Aug 12 18:27:01 2015
+++ src/sbin/fsck_lfs/pass6.c	Wed Aug 12 18:28:00 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: pass6.c,v 1.41 2015/08/12 18:27:01 dholland Exp $	 */
+/* $NetBSD: pass6.c,v 1.42 2015/08/12 18:28:00 dholland Exp $	 */
 
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -235,9 +235,9 @@ remove_ino(struct uvnode *vp, ino_t ino)
 			vp = lfs_raw_vget(fs, ino, fs->lfs_ivnode->v_fd, daddr);
 
 		LFS_SEGENTRY(sup, fs, lfs_dtosn(fs, daddr), sbp);
-		sup->su_nbytes -= LFS_DINODE1_SIZE;
+		sup->su_nbytes -= DINOSIZE(fs);
 		VOP_BWRITE(sbp);
-		seg_table[lfs_dtosn(fs, daddr)].su_nbytes -= LFS_DINODE1_SIZE;
+		seg_table[lfs_dtosn(fs, daddr)].su_nbytes -= DINOSIZE(fs);
 	} else
 		brelse(bp, 0);
 
@@ -329,7 +329,7 @@ pass6check(struct inodesc * idesc)
 }
 
 static void
-account_indir(struct uvnode *vp, struct ulfs1_dinode *dp, daddr_t ilbn, daddr_t daddr, int lvl)
+account_indir(struct uvnode *vp, union lfs_dinode *dp, daddr_t ilbn, daddr_t daddr, int lvl)
 {
 	struct ubuf *bp;
 	int32_t *dap, *odap, *buf, *obuf;
@@ -376,21 +376,21 @@ account_indir(struct uvnode *vp, struct 
  * Account block changes between new found inode and existing inode.
  */
 static void
-account_block_changes(struct ulfs1_dinode *dp)
+account_block_changes(union lfs_dinode *dp)
 {
 	int i;
 	daddr_t lbn, off, odaddr;
 	struct uvnode *vp;
 	struct inode *ip;
 
-	vp = vget(fs, dp->di_inumber);
+	vp = vget(fs, lfs_dino_getinumber(fs, dp));
 	ip = (vp ? VTOI(vp) : NULL);
 
 	/* Check direct block holdings between existing and new */
 	for (i = 0; i < ULFS_NDADDR; i++) {
 		odaddr = (ip ? ip->i_ffs1_db[i] : 0x0);
-		if (dp->di_db[i] > 0 && dp->di_db[i] != odaddr)
-			rfw_update_single(vp, i, dp->di_db[i],
+		if (lfs_dino_getdb(fs, dp, i) > 0 && lfs_dino_getdb(fs, dp, i) != odaddr)
+			rfw_update_single(vp, i, lfs_dino_getdb(fs, dp, i),
 					  lfs_dblksize(fs, dp, i));
 	}
 
@@ -398,10 +398,10 @@ account_block_changes(struct ulfs1_dinod
 	off = 0;
 	for (i = 0; i < ULFS_NIADDR; i++) {
 		odaddr = (ip ? ip->i_ffs1_ib[i] : 0x0);
-		if (dp->di_ib[i] > 0 && dp->di_ib[i] != odaddr) {
+		if (lfs_dino_getib(fs, dp, i) > 0 && lfs_dino_getib(fs, dp, i) != odaddr) {
 			lbn = -(ULFS_NDADDR + off + i);
-			rfw_update_single(vp, i, dp->di_ib[i], lfs_sb_getbsize(fs));
-			account_indir(vp, dp, lbn, dp->di_ib[i], i);
+			rfw_update_single(vp, i, lfs_dino_getib(fs, dp, i), lfs_sb_getbsize(fs));
+			account_indir(vp, dp, lbn, lfs_dino_getib(fs, dp, i), i);
 		}
 		if (off == 0)
 			off = LFS_NINDIR(fs);
@@ -418,14 +418,14 @@ account_block_changes(struct ulfs1_dinod
  * free list accounting is done.
  */
 static void
-readdress_inode(struct ulfs1_dinode *dp, ulfs_daddr_t daddr)
+readdress_inode(union lfs_dinode *dp, ulfs_daddr_t daddr)
 {
 	IFILE *ifp;
 	SEGUSE *sup;
 	struct ubuf *bp;
 	int sn;
 	ulfs_daddr_t odaddr;
-	ino_t thisino = dp->di_inumber;
+	ino_t thisino = lfs_dino_getinumber(fs, dp);
 	struct uvnode *vp;
 
 	/* Recursively check all block holdings, account changes */
@@ -439,28 +439,34 @@ readdress_inode(struct ulfs1_dinode *dp,
 	VOP_BWRITE(bp);
 
 	if (debug)
-		pwarn("readdress ino %d from 0x%x to 0x%x mode %o nlink %d\n",
-			(int)dp->di_inumber,
+		pwarn("readdress ino %ju from 0x%x to 0x%x mode %o nlink %d\n",
+			(uintmax_t)lfs_dino_getinumber(fs, dp),
 			(unsigned)odaddr,
 			(unsigned)daddr,
-			(int)dp->di_mode, (int)dp->di_nlink);
+			(int)lfs_dino_getmode(fs, dp),
+			(int)lfs_dino_getnlink(fs, dp));
 
 	/* Copy over preexisting in-core inode, if any */
 	vp = vget(fs, thisino);
-	memcpy(VTOI(vp)->i_din.ffs1_din, dp, sizeof(*dp));
+	/* 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));
+	}
 
 	/* Finally account the inode itself */
 	sn = lfs_dtosn(fs, odaddr);
 	LFS_SEGENTRY(sup, fs, sn, bp);
-	sup->su_nbytes -= LFS_DINODE1_SIZE;
+	sup->su_nbytes -= DINOSIZE(fs);
 	VOP_BWRITE(bp);
-	seg_table[sn].su_nbytes -= LFS_DINODE1_SIZE;
+	seg_table[sn].su_nbytes -= DINOSIZE(fs);
 
 	sn = lfs_dtosn(fs, daddr);
 	LFS_SEGENTRY(sup, fs, sn, bp);
-	sup->su_nbytes += LFS_DINODE1_SIZE;
+	sup->su_nbytes += DINOSIZE(fs);
 	VOP_BWRITE(bp);
-	seg_table[sn].su_nbytes += LFS_DINODE1_SIZE;
+	seg_table[sn].su_nbytes += DINOSIZE(fs);
 }
 
 /*
@@ -519,9 +525,9 @@ alloc_inode(ino_t thisino, ulfs_daddr_t 
 	
 	/* Account for new location */
 	LFS_SEGENTRY(sup, fs, lfs_dtosn(fs, daddr), bp);
-	sup->su_nbytes += LFS_DINODE1_SIZE;
+	sup->su_nbytes += DINOSIZE(fs);
 	VOP_BWRITE(bp);
-	seg_table[lfs_dtosn(fs, daddr)].su_nbytes += LFS_DINODE1_SIZE;
+	seg_table[lfs_dtosn(fs, daddr)].su_nbytes += DINOSIZE(fs);
 }
 
 /*
@@ -550,9 +556,10 @@ pass6(void)
 	SEGUSE *sup;
 	SEGSUM *sp;
 	struct ubuf *bp, *ibp, *sbp, *cbp;
-	struct ulfs1_dinode *dp;
+	union lfs_dinode *dp;
 	struct inodesc idesc;
 	int i, j, bc, hassuper;
+	unsigned k;
 	int nnewfiles, ndelfiles, nmvfiles;
 	int sn, curseg;
 	char *ibbuf;
@@ -658,17 +665,16 @@ pass6(void)
 			brelse(ibp, 0);
 
 			j = 0;
-			for (dp = (struct ulfs1_dinode *)ibbuf;
-			     dp < (struct ulfs1_dinode *)ibbuf + LFS_INOPB(fs);
-			     ++dp) {
-				if (dp->di_inumber == 0 ||
-				    dp->di_inumber == lfs_sb_getifile(fs))
+			for (k = 0; k < LFS_INOPB(fs); k++) {
+				dp = DINO_IN_BLOCK(fs, ibbuf, k);
+				if (lfs_dino_getinumber(fs, dp) == 0 ||
+				    lfs_dino_getinumber(fs, dp) == lfs_sb_getifile(fs))
 					continue;
 				/* Basic sanity checks */
-				if (dp->di_nlink < 0 
+				if (lfs_dino_getnlink(fs, dp) < 0 
 #if 0
-				    || dp->di_u.inumber < 0
-				    || dp->di_size < 0
+				    || lfs_dino_getinumber(fs, dp) < 0
+				    || lfs_dino_getsize(fs, dp) < 0
 #endif
 				) {
 					pwarn("BAD INODE AT 0x%" PRIx32 "\n",
@@ -678,15 +684,15 @@ pass6(void)
 					goto out;
 				}
 
-				vp = vget(fs, dp->di_inumber);
+				vp = vget(fs, lfs_dino_getinumber(fs, dp));
 
 				/*
 				 * Four cases:
 				 * (1) Invalid inode (nlink == 0).
 				 *     If currently allocated, remove.
 				 */
-				if (dp->di_nlink == 0) {
-					remove_ino(vp, dp->di_inumber);
+				if (lfs_dino_getnlink(fs, dp) == 0) {
+					remove_ino(vp, lfs_dino_getinumber(fs, dp));
 					++ndelfiles;
 					continue;
 				}
@@ -700,7 +706,7 @@ pass6(void)
 					if (!(lfs_ss_getflags(fs, sp) & SS_DIROP))
 						pfatal("NEW FILE IN NON-DIROP PARTIAL SEGMENT");
 					else {
-						inums[j++] = dp->di_inumber;
+						inums[j++] = lfs_dino_getinumber(fs, dp);
 						nnewfiles++;
 					}
 					continue;
@@ -710,12 +716,16 @@ pass6(void)
 				 *     allocated inode.  Delete old file
 				 *     and proceed as in (2).
 				 */
-				if (vp && VTOI(vp)->i_ffs1_gen < dp->di_gen) {
-					remove_ino(vp, dp->di_inumber);
+				if (vp && (
+					fs->lfs_is64 ?
+					VTOI(vp)->i_ffs2_gen :
+					VTOI(vp)->i_ffs1_gen
+				    ) < lfs_dino_getgen(fs, dp)) {
+					remove_ino(vp, lfs_dino_getinumber(fs, dp));
 					if (!(lfs_ss_getflags(fs, sp) & SS_DIROP))
 						pfatal("NEW FILE VERSION IN NON-DIROP PARTIAL SEGMENT");
 					else {
-						inums[j++] = dp->di_inumber;
+						inums[j++] = lfs_dino_getinumber(fs, dp);
 						ndelfiles++;
 						nnewfiles++;
 					}
@@ -728,24 +738,28 @@ pass6(void)
 				 *     only.  We'll pick up any new
 				 *     blocks when we do the block pass.
 				 */
-				if (vp && VTOI(vp)->i_ffs1_gen == dp->di_gen) {
+				if (vp && (
+					fs->lfs_is64 ?
+					VTOI(vp)->i_ffs2_gen :
+					VTOI(vp)->i_ffs1_gen
+				    ) == lfs_dino_getgen(fs, dp)) {
 					nmvfiles++;
 					readdress_inode(dp, ibdaddr);
 
 					/* Update with new info */
-					VTOD(vp)->di_mode = dp->di_mode;
-					VTOD(vp)->di_nlink = dp->di_nlink;
+					lfs_dino_setmode(fs, VTOD(vp), lfs_dino_getmode(fs, dp));
+					lfs_dino_setnlink(fs, VTOD(vp), lfs_dino_getmode(fs, dp));
 					/* XXX size is important */
-					VTOD(vp)->di_size = dp->di_size;
-					VTOD(vp)->di_atime = dp->di_atime;
-					VTOD(vp)->di_atimensec = dp->di_atimensec;
-					VTOD(vp)->di_mtime = dp->di_mtime;
-					VTOD(vp)->di_mtimensec = dp->di_mtimensec;
-					VTOD(vp)->di_ctime = dp->di_ctime;
-					VTOD(vp)->di_ctimensec = dp->di_ctimensec;
-					VTOD(vp)->di_flags = dp->di_flags;
-					VTOD(vp)->di_uid = dp->di_uid;
-					VTOD(vp)->di_gid = dp->di_gid;
+					lfs_dino_setsize(fs, VTOD(vp), lfs_dino_getsize(fs, dp));
+					lfs_dino_setatime(fs, VTOD(vp), lfs_dino_getatime(fs, dp));
+					lfs_dino_setatimensec(fs, VTOD(vp), lfs_dino_getatimensec(fs, dp));
+					lfs_dino_setmtime(fs, VTOD(vp), lfs_dino_getmtime(fs, dp));
+					lfs_dino_setmtimensec(fs, VTOD(vp), lfs_dino_getmtimensec(fs, dp));
+					lfs_dino_setctime(fs, VTOD(vp), lfs_dino_getctime(fs, dp));
+					lfs_dino_setctimensec(fs, VTOD(vp), lfs_dino_getctimensec(fs, dp));
+					lfs_dino_setflags(fs, VTOD(vp), lfs_dino_getflags(fs, dp));
+					lfs_dino_setuid(fs, VTOD(vp), lfs_dino_getuid(fs, dp));
+					lfs_dino_setgid(fs, VTOD(vp), lfs_dino_getgid(fs, dp));
 					inodirty(VTOI(vp));
 				}
 			}
@@ -756,10 +770,15 @@ pass6(void)
 				/* We'll get the blocks later */
 				if (debug)
 					pwarn("alloc ino %d nlink %d\n",
-						(int)inums[j], VTOD(vp)->di_nlink);
-				memset(VTOD(vp)->di_db, 0, (ULFS_NDADDR + ULFS_NIADDR) *
-				       sizeof(ulfs_daddr_t));
-				VTOD(vp)->di_blocks = 0;
+						(int)inums[j], lfs_dino_getnlink(fs, VTOD(vp)));
+
+				for (k=0; k<ULFS_NDADDR; k++) {
+					lfs_dino_setdb(fs, VTOD(vp), k, 0);
+				}
+				for (k=0; k<ULFS_NIADDR; k++) {
+					lfs_dino_setib(fs, VTOD(vp), k, 0);
+				}
+				lfs_dino_setblocks(fs, VTOD(vp), 0);
 
 				vp->v_uflag |= VU_DIROP;
 				inodirty(VTOI(vp));

Index: src/sbin/fsck_lfs/pass2.c
diff -u src/sbin/fsck_lfs/pass2.c:1.25 src/sbin/fsck_lfs/pass2.c:1.26
--- src/sbin/fsck_lfs/pass2.c:1.25	Tue Jun 16 23:58:30 2015
+++ src/sbin/fsck_lfs/pass2.c	Wed Aug 12 18:28:00 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: pass2.c,v 1.25 2015/06/16 23:58:30 christos Exp $	 */
+/* $NetBSD: pass2.c,v 1.26 2015/08/12 18:28:00 dholland Exp $	 */
 
 /*
  * Copyright (c) 1980, 1986, 1993
@@ -36,6 +36,7 @@
 #include <sys/buf.h>
 
 #include <ufs/lfs/lfs.h>
+#include <ufs/lfs/lfs_accessors.h>
 #include <ufs/lfs/lfs_inode.h>
 
 #include <err.h>
@@ -59,13 +60,15 @@ static int blksort(const void *, const v
 void
 pass2(void)
 {
-	struct ulfs1_dinode *dp;
+	union lfs_dinode *dp;
 	struct uvnode *vp;
 	struct inoinfo **inpp, *inp;
 	struct inoinfo **inpend;
 	struct inodesc curino;
-	struct ulfs1_dinode dino;
+	union lfs_dinode dino;
 	char pathbuf[MAXPATHLEN + 1];
+	uint16_t mode;
+	unsigned ii;
 
 	switch (statemap[ULFS_ROOTINO]) {
 
@@ -102,8 +105,10 @@ pass2(void)
 			errx(EEXIT, "%s", "");
 		vp = vget(fs, ULFS_ROOTINO);
 		dp = VTOD(vp);
-		dp->di_mode &= ~LFS_IFMT;
-		dp->di_mode |= LFS_IFDIR;
+		mode = lfs_dino_getmode(fs, dp);
+		mode &= ~LFS_IFMT;
+		mode |= LFS_IFDIR;
+		lfs_dino_setmode(fs, dp, mode);
 		inodirty(VTOI(vp));
 		break;
 
@@ -136,7 +141,7 @@ pass2(void)
 			if (reply("FIX") == 1) {
 				vp = vget(fs, inp->i_number);
 				dp = VTOD(vp);
-				dp->di_size = inp->i_isize;
+				lfs_dino_setsize(fs, dp, inp->i_isize);
 				inodirty(VTOI(vp));
 			}
 		} else if ((inp->i_isize & (LFS_DIRBLKSIZ - 1)) != 0) {
@@ -150,14 +155,21 @@ pass2(void)
 			if (preen || reply("ADJUST") == 1) {
 				vp = vget(fs, inp->i_number);
 				dp = VTOD(vp);
-				dp->di_size = inp->i_isize;
+				lfs_dino_setsize(fs, dp, inp->i_isize);
 				inodirty(VTOI(vp));
 			}
 		}
-		memset(&dino, 0, sizeof(struct ulfs1_dinode));
-		dino.di_mode = LFS_IFDIR;
-		dino.di_size = inp->i_isize;
-		memcpy(&dino.di_db[0], &inp->i_blks[0], (size_t) inp->i_numblks);
+		memset(&dino, 0, sizeof(dino));
+		lfs_dino_setmode(fs, &dino, LFS_IFDIR);
+		lfs_dino_setsize(fs, &dino, inp->i_isize);
+		for (ii = 0; ii < inp->i_numblks / sizeof(inp->i_blks[0]) &&
+			     ii < ULFS_NDADDR; ii++) {
+			lfs_dino_setdb(fs, &dino, ii, inp->i_blks[ii]);
+		}
+		for (; ii < inp->i_numblks / sizeof(inp->i_blks[0]); ii++) {
+			lfs_dino_setib(fs, &dino, ii - ULFS_NDADDR,
+				       inp->i_blks[ii]);
+		}
 		curino.id_number = inp->i_number;
 		curino.id_parent = inp->i_parent;
 		(void) ckinode(&dino, &curino);
@@ -203,7 +215,7 @@ pass2check(struct inodesc * idesc)
 	struct lfs_direct *dirp = idesc->id_dirp;
 	struct inoinfo *inp;
 	int n, entrysize, ret = 0;
-	struct ulfs1_dinode *dp;
+	union lfs_dinode *dp;
 	const char *errmsg;
 	struct lfs_direct proto;
 	char namebuf[MAXPATHLEN + 1];
@@ -381,8 +393,8 @@ again:
 				break;
 			dp = ginode(dirp->d_ino);
 			statemap[dirp->d_ino] =
-			    (dp->di_mode & LFS_IFMT) == LFS_IFDIR ? DSTATE : FSTATE;
-			lncntp[dirp->d_ino] = dp->di_nlink;
+			    (lfs_dino_getmode(fs, dp) & LFS_IFMT) == LFS_IFDIR ? DSTATE : FSTATE;
+			lncntp[dirp->d_ino] = lfs_dino_getnlink(fs, dp);
 			goto again;
 
 		case DSTATE:
Index: src/sbin/fsck_lfs/pass4.c
diff -u src/sbin/fsck_lfs/pass4.c:1.25 src/sbin/fsck_lfs/pass4.c:1.26
--- src/sbin/fsck_lfs/pass4.c:1.25	Tue Jul 28 05:09:34 2015
+++ src/sbin/fsck_lfs/pass4.c	Wed Aug 12 18:28:00 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: pass4.c,v 1.25 2015/07/28 05:09:34 dholland Exp $	 */
+/* $NetBSD: pass4.c,v 1.26 2015/08/12 18:28:00 dholland Exp $	 */
 
 /*
  * Copyright (c) 1980, 1986, 1993
@@ -82,7 +82,7 @@ pass4(void)
 {
 	ino_t inumber;
 	struct zlncnt *zlnp;
-	struct ulfs1_dinode *dp;
+	union lfs_dinode *dp;
 	struct inodesc idesc;
 	int n;
 
@@ -119,7 +119,7 @@ pass4(void)
 			if (check_orphan(&idesc))
 				break;
 			dp = ginode(inumber);
-			if (dp->di_size == 0) {
+			if (lfs_dino_getsize(fs, dp) == 0) {
 				const char * msg = (lncntp[inumber] ?
 					"ZERO LENGTH" : "UNREF ZERO LENGTH");
 				clri(&idesc, msg, 1);

Index: src/sbin/fsck_lfs/segwrite.c
diff -u src/sbin/fsck_lfs/segwrite.c:1.40 src/sbin/fsck_lfs/segwrite.c:1.41
--- src/sbin/fsck_lfs/segwrite.c:1.40	Wed Aug 12 18:27:01 2015
+++ src/sbin/fsck_lfs/segwrite.c	Wed Aug 12 18:28:00 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: segwrite.c,v 1.40 2015/08/12 18:27:01 dholland Exp $ */
+/* $NetBSD: segwrite.c,v 1.41 2015/08/12 18:28:00 dholland Exp $ */
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -248,7 +248,7 @@ int
 lfs_writeinode(struct lfs * fs, struct segment * sp, struct inode * ip)
 {
 	struct ubuf *bp, *ibp;
-	struct ulfs1_dinode *cdp;
+	union lfs_dinode *cdp;
 	IFILE *ifp;
 	SEGUSE *sup;
 	SEGSUM *ssp;
@@ -277,8 +277,12 @@ lfs_writeinode(struct lfs * fs, struct s
 		gotblk++;
 
 		/* Zero out inode numbers */
-		for (i = 0; i < LFS_INOPB(fs); ++i)
-			((struct ulfs1_dinode *) sp->ibp->b_data)[i].di_inumber = 0;
+		for (i = 0; i < LFS_INOPB(fs); ++i) {
+			union lfs_dinode *tmpdip;
+
+			tmpdip = DINO_IN_BLOCK(fs, sp->ibp->b_data, i);
+			lfs_dino_setinumber(fs, tmpdip, 0);
+		}
 
 		++sp->start_bpp;
 		lfs_sb_subavail(fs, lfs_btofsb(fs, lfs_sb_getibsize(fs)));
@@ -305,20 +309,29 @@ lfs_writeinode(struct lfs * fs, struct s
 	 * already been gathered.
 	 */
 	if (ip->i_number == LFS_IFILE_INUM && sp->idp) {
-		*(sp->idp) = *ip->i_din.ffs1_din;
+		// 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;
+		}
 		ip->i_lfs_osize = ip->i_ffs1_size;
 		return 0;
 	}
 	bp = sp->ibp;
-	cdp = ((struct ulfs1_dinode *) bp->b_data) + (sp->ninodes % LFS_INOPB(fs));
-	*cdp = *ip->i_din.ffs1_din;
+	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;
+	}
 
 	/* If all blocks are goig to disk, update the "size on disk" */
 	ip->i_lfs_osize = ip->i_ffs1_size;
 
 	if (ip->i_number == LFS_IFILE_INUM)	/* We know sp->idp == NULL */
-		sp->idp = ((struct ulfs1_dinode *) bp->b_data) +
-		    (sp->ninodes % LFS_INOPB(fs));
+		sp->idp = DINO_IN_BLOCK(fs, bp->b_data, sp->ninodes % LFS_INOPB(fs));
 	if (gotblk) {
 		LFS_LOCK_BUF(bp);
 		assert(!(bp->b_flags & B_INVAL));
@@ -356,7 +369,7 @@ lfs_writeinode(struct lfs * fs, struct s
 	if (daddr != LFS_UNUSED_DADDR) {
 		u_int32_t oldsn = lfs_dtosn(fs, daddr);
 		LFS_SEGENTRY(sup, fs, oldsn, bp);
-		sup->su_nbytes -= LFS_DINODE1_SIZE;
+		sup->su_nbytes -= DINOSIZE(fs);
 		redo_ifile =
 		    (ino == LFS_IFILE_INUM && !(bp->b_flags & B_GATHERED));
 		if (redo_ifile)
@@ -801,7 +814,7 @@ lfs_writeseg(struct lfs * fs, struct seg
 	lfs_ss_setflags(fs, ssp, lfs_ss_getflags(fs, ssp) | SS_RFW);
 
 	ninos = (lfs_ss_getninos(fs, ssp) + LFS_INOPB(fs) - 1) / LFS_INOPB(fs);
-	sup->su_nbytes += lfs_ss_getninos(fs, ssp) * LFS_DINODE1_SIZE;
+	sup->su_nbytes += lfs_ss_getninos(fs, ssp) * DINOSIZE(fs);
 
 	if (lfs_sb_getversion(fs) == 1)
 		sup->su_olastmod = write_time;
Index: src/sbin/fsck_lfs/utilities.c
diff -u src/sbin/fsck_lfs/utilities.c:1.40 src/sbin/fsck_lfs/utilities.c:1.41
--- src/sbin/fsck_lfs/utilities.c:1.40	Tue Jul 28 05:09:34 2015
+++ src/sbin/fsck_lfs/utilities.c	Wed Aug 12 18:28:00 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: utilities.c,v 1.40 2015/07/28 05:09:34 dholland Exp $	 */
+/* $NetBSD: utilities.c,v 1.41 2015/08/12 18:28:00 dholland Exp $	 */
 
 /*
  * Copyright (c) 1980, 1986, 1993
@@ -63,9 +63,9 @@ long diskreads, totalreads;	/* Disk cach
 extern off_t locked_queue_bytes;
 
 int
-ftypeok(struct ulfs1_dinode * dp)
+ftypeok(union lfs_dinode * dp)
 {
-	switch (dp->di_mode & LFS_IFMT) {
+	switch (lfs_dino_getmode(fs, dp) & LFS_IFMT) {
 
 	case LFS_IFDIR:
 	case LFS_IFREG:
@@ -78,7 +78,7 @@ ftypeok(struct ulfs1_dinode * dp)
 
 	default:
 		if (debug)
-			pwarn("bad file type 0%o\n", dp->di_mode);
+			pwarn("bad file type 0%o\n", lfs_dino_getmode(fs, dp));
 		return (0);
 	}
 }

Index: src/sbin/fsck_lfs/setup.c
diff -u src/sbin/fsck_lfs/setup.c:1.54 src/sbin/fsck_lfs/setup.c:1.55
--- src/sbin/fsck_lfs/setup.c:1.54	Wed Aug 12 18:27:01 2015
+++ src/sbin/fsck_lfs/setup.c	Wed Aug 12 18:28:00 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: setup.c,v 1.54 2015/08/12 18:27:01 dholland Exp $ */
+/* $NetBSD: setup.c,v 1.55 2015/08/12 18:28:00 dholland Exp $ */
 
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -439,7 +439,7 @@ setup(const char *dev)
 
 	/* Initialize Ifile entry */
 	din_table[lfs_sb_getifile(fs)] = lfs_sb_getidaddr(fs);
-	seg_table[lfs_dtosn(fs, lfs_sb_getidaddr(fs))].su_nbytes += LFS_DINODE1_SIZE;
+	seg_table[lfs_dtosn(fs, lfs_sb_getidaddr(fs))].su_nbytes += DINOSIZE(fs);
 
 #ifndef VERBOSE_BLOCKMAP
 	bmapsize = roundup(howmany(maxfsblock, NBBY), sizeof(int16_t));

Index: src/sbin/fsck_lfs/vars.c
diff -u src/sbin/fsck_lfs/vars.c:1.17 src/sbin/fsck_lfs/vars.c:1.18
--- src/sbin/fsck_lfs/vars.c:1.17	Sat Jun  8 02:16:03 2013
+++ src/sbin/fsck_lfs/vars.c	Wed Aug 12 18:28:00 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: vars.c,v 1.17 2013/06/08 02:16:03 dholland Exp $	 */
+/* $NetBSD: vars.c,v 1.18 2015/08/12 18:28:00 dholland Exp $	 */
 /*-
  * Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -77,6 +77,4 @@ int lfmode;			/* lost & found directory 
 daddr_t n_blks;			/* number of blocks in use */
 ino_t n_files;			/* number of files in use */
 
-struct ulfs1_dinode zino;
-
 int no_roll_forward = 0;	/* don't roll forward */

Index: src/sbin/newfs_lfs/make_lfs.c
diff -u src/sbin/newfs_lfs/make_lfs.c:1.42 src/sbin/newfs_lfs/make_lfs.c:1.43
--- src/sbin/newfs_lfs/make_lfs.c:1.42	Wed Aug 12 18:25:52 2015
+++ src/sbin/newfs_lfs/make_lfs.c	Wed Aug 12 18:28:01 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: make_lfs.c,v 1.42 2015/08/12 18:25:52 dholland Exp $	*/
+/*	$NetBSD: make_lfs.c,v 1.43 2015/08/12 18:28:01 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.42 2015/08/12 18:25:52 dholland Exp $");
+__RCSID("$NetBSD: make_lfs.c,v 1.43 2015/08/12 18:28:01 dholland Exp $");
 #endif
 #endif /* not lint */
 
@@ -134,10 +134,9 @@ static const struct dlfs dlfs32_default 
 		.dlfs_minfree =		MINFREE,
 		.dlfs_maxfilesize =	0,
 		.dlfs_fsbpseg =		0,
-		.dlfs_inopb =		DFL_LFSBLOCK/sizeof(struct ulfs1_dinode),
+		.dlfs_inopb =		DFL_LFSBLOCK/sizeof(struct lfs32_dinode),
 		.dlfs_ifpb =		DFL_LFSBLOCK/sizeof(IFILE32),
 		.dlfs_sepb =		DFL_LFSBLOCK/sizeof(SEGUSE),
-		/* XXX ondisk32 */
 		.dlfs_nindir =		DFL_LFSBLOCK/sizeof(int32_t),
 		.dlfs_nseg =		0,
 		.dlfs_nspf =		0,
@@ -200,7 +199,7 @@ static const struct dlfs64 dlfs64_defaul
 		.dlfs_minfree =		MINFREE,
 		.dlfs_maxfilesize =	0,
 		.dlfs_fsbpseg =		0,
-		.dlfs_inopb =		DFL_LFSBLOCK/sizeof(struct ulfs1_dinode),
+		.dlfs_inopb =		DFL_LFSBLOCK/sizeof(struct lfs64_dinode),
 		.dlfs_ifpb =		DFL_LFSBLOCK/sizeof(IFILE64),
 		.dlfs_sepb =		DFL_LFSBLOCK/sizeof(SEGUSE),
 		.dlfs_nindir =		DFL_LFSBLOCK/sizeof(int64_t),
@@ -217,7 +216,7 @@ static const struct dlfs64 dlfs64_defaul
 		.dlfs_blktodb =		0,
 		.dlfs_sushift =		0,
 		.dlfs_sboffs =		{ 0 },
-		.dlfs_maxsymlinklen =	ULFS1_MAXSYMLINKLEN,
+		.dlfs_maxsymlinklen =	ULFS2_MAXSYMLINKLEN,
 		.dlfs_nclean =  	0,
 		.dlfs_fsmnt =   	{ 0 },
 		.dlfs_pflags =  	LFS_PF_CLEAN,
@@ -259,7 +258,7 @@ struct lfs_direct lfs_lf_dir[] = {
 #endif
 
 void pwarn(const char *, ...);
-static void make_dinode(ino_t, struct ulfs1_dinode *, int, struct lfs *);
+static void make_dinode(ino_t, union lfs_dinode *, int, struct lfs *);
 static void make_dir( void *, struct lfs_direct *, int);
 static uint64_t maxfilesize(int);
 
@@ -284,23 +283,29 @@ maxfilesize(int bshift)
  * directory.
  */
 static void
-make_dinode(ino_t ino, struct ulfs1_dinode *dip, int nfrags, struct lfs *fs)
+make_dinode(ino_t ino, union lfs_dinode *dip, int nfrags, struct lfs *fs)
 {
 	int i;
 	int nblocks, bb, base, factor, lvl;
+	time_t t;
 
 	nblocks = howmany(nfrags, lfs_sb_getfrag(fs));
 	if (nblocks >= ULFS_NDADDR)
 		nfrags = roundup(nfrags, lfs_sb_getfrag(fs));
 
-	dip->di_nlink = 1;
-	dip->di_blocks = nfrags;
+	lfs_dino_setnlink(fs, dip, 1);
+	lfs_dino_setblocks(fs, dip, nfrags);
 
-	dip->di_size = (nfrags << lfs_sb_getffshift(fs));
-	dip->di_atime = dip->di_mtime = dip->di_ctime = lfs_sb_gettstamp(fs);
-	dip->di_atimensec = dip->di_mtimensec = dip->di_ctimensec = 0;
-	dip->di_inumber = ino;
-	dip->di_gen = 1;
+	lfs_dino_setsize(fs, dip, nfrags << lfs_sb_getffshift(fs));
+	t = lfs_sb_gettstamp(fs);
+	lfs_dino_setatime(fs, dip, t);
+	lfs_dino_setmtime(fs, dip, t);
+	lfs_dino_setctime(fs, dip, t);
+	lfs_dino_setatimensec(fs, dip, 0);
+	lfs_dino_setmtimensec(fs, dip, 0);
+	lfs_dino_setctimensec(fs, dip, 0);
+	lfs_dino_setinumber(fs, dip, ino);
+	lfs_dino_setgen(fs, dip, 1);
 
 	if (ULFS_NDADDR < nblocks) {
 		/* Count up how many indirect blocks we need, recursively */
@@ -311,21 +316,22 @@ make_dinode(ino_t ino, struct ulfs1_dino
 			ifibc += bb;
 			--bb;
 		}
-		dip->di_blocks += lfs_blkstofrags(fs, ifibc);
+		lfs_dino_setblocks(fs, dip,
+		    lfs_dino_getblocks(fs, dip) + lfs_blkstofrags(fs, ifibc));
 	}
 
 	/* Assign the block addresses for the ifile */
 	for (i = 0; i < MIN(nblocks,ULFS_NDADDR); i++) {
-		dip->di_db[i] = 0x0;
+		lfs_dino_setdb(fs, dip, i, 0x0);
 	}
 	if (nblocks > ULFS_NDADDR) {
-		dip->di_ib[0] = 0x0;
+		lfs_dino_setib(fs, dip, 0, 0x0);
 		bb = howmany(nblocks - ULFS_NDADDR, LFS_NINDIR(fs)) - 1;
 		factor = LFS_NINDIR(fs);
 		base = -ULFS_NDADDR - factor;
 		lvl = 1;
 		while (bb > 0) {
-			dip->di_ib[lvl] = 0x0;
+			lfs_dino_setib(fs, dip, lvl, 0x0);
 			bb = howmany(bb, LFS_NINDIR(fs));
 			--bb;
 			factor *= LFS_NINDIR(fs);
@@ -363,7 +369,7 @@ make_lfs(int devfd, uint secsize, struct
 	 int resvseg, int version, daddr_t start, int ibsize, int interleave,
 	 u_int32_t roll_id)
 {
-	struct ulfs1_dinode *dip;	/* Pointer to a disk inode */
+	union lfs_dinode *dip;	/* Pointer to a disk inode */
 	CLEANERINFO *cip;	/* Segment cleaner information table */
 	IFILE *ipall;		/* Pointer to array of ifile structures */
 	IFILE64 *ip64 = NULL;
@@ -413,6 +419,7 @@ make_lfs(int devfd, uint secsize, struct
 	} else {
 		fs->lfs_dlfs_u.u_32 = dlfs32_default;
 	}
+	fs->lfs_is64 = is64;
 	fs->lfs_ivnode = vp;
 	fs->lfs_devvp = save_devvp;
 
@@ -528,11 +535,11 @@ make_lfs(int devfd, uint secsize, struct
 		lfs_sb_setssize(fs, ssize);
 		lfs_sb_setibsize(fs, ibsize);
 	}
-	lfs_sb_setinopb(fs, lfs_sb_getibsize(fs) / sizeof(struct ulfs1_dinode));
+	lfs_sb_setinopb(fs, lfs_sb_getibsize(fs) / DINOSIZE(fs));
 	lfs_sb_setminfree(fs, minfree);
 
 	if (version > 1) {
-		lfs_sb_setinopf(fs, secsize/LFS_DINODE1_SIZE);
+		lfs_sb_setinopf(fs, secsize/DINOSIZE(fs));
 		lfs_sb_setinterleave(fs, interleave);
 		if (roll_id == 0)
 			roll_id = arc4random();
@@ -694,17 +701,23 @@ make_lfs(int devfd, uint secsize, struct
 	 * Initialize the Ifile inode.  Do this before we do anything
 	 * with the Ifile or segment tables.
 	 */
-	dip = VTOI(fs->lfs_ivnode)->i_din.ffs1_din = (struct ulfs1_dinode *)
-		malloc(sizeof(*dip));
+	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));
-	dip->di_mode  = LFS_IFREG | 0600;
-	dip->di_flags = SF_IMMUTABLE;
+	lfs_dino_setmode(fs, dip, LFS_IFREG | 0600);
+	lfs_dino_setflags(fs, dip, SF_IMMUTABLE);
 	make_dinode(LFS_IFILE_INUM, dip,
 		lfs_blkstofrags(fs, lfs_sb_getcleansz(fs) + lfs_sb_getsegtabsz(fs) + 1), fs);
-	dip->di_size = (lfs_sb_getcleansz(fs) + lfs_sb_getsegtabsz(fs) + 1) << lfs_sb_getbshift(fs);
-	for (i = 0; i < ULFS_NDADDR && i < (dip->di_size >> lfs_sb_getbshift(fs)); i++)
+	lfs_dino_setsize(fs, dip, (lfs_sb_getcleansz(fs) + lfs_sb_getsegtabsz(fs) + 1) << lfs_sb_getbshift(fs));
+	for (i = 0; i < ULFS_NDADDR && i < (lfs_dino_getsize(fs, dip) >> lfs_sb_getbshift(fs)); i++)
 		VTOI(fs->lfs_ivnode)->i_lfs_fragsize[i] = lfs_sb_getbsize(fs);
 
 	/*
@@ -762,17 +775,21 @@ make_lfs(int devfd, uint secsize, struct
 
 	/* Initialize root directory */
 	vp = lfs_raw_vget(fs, ULFS_ROOTINO, devfd, 0x0);
-	dip = VTOI(vp)->i_din.ffs1_din;
+	// XXX bogus cast
+	dip = (union lfs_dinode *)VTOI(vp)->i_din.ffs1_din;
 	make_dinode(ULFS_ROOTINO, dip, howmany(LFS_DIRBLKSIZ, lfs_sb_getfsize(fs)), fs);
-	dip->di_mode = LFS_IFDIR | UMASK;
-	VTOI(vp)->i_lfs_osize = dip->di_size = LFS_DIRBLKSIZ;
+	lfs_dino_setmode(fs, dip, LFS_IFDIR | UMASK);
+	VTOI(vp)->i_lfs_osize = LFS_DIRBLKSIZ;
 #ifdef MAKE_LF_DIR
-	VTOI(vp)->i_nlink = dip->di_nlink = 3;
+	VTOI(vp)->i_nlink = 3;
 #else
-	VTOI(vp)->i_nlink = dip->di_nlink = 2;
+	VTOI(vp)->i_nlink = 2;
 #endif
-        VTOI(vp)->i_lfs_effnblks = dip->di_blocks =
+        VTOI(vp)->i_lfs_effnblks =
 		lfs_btofsb(fs, roundup(LFS_DIRBLKSIZ, lfs_sb_getfsize(fs)));
+	lfs_dino_setsize(fs, dip, VTOI(vp)->i_lfs_osize);
+	lfs_dino_setnlink(fs, dip, VTOI(vp)->i_nlink);
+	lfs_dino_setblocks(fs, dip, VTOI(vp)->i_lfs_effnblks);
 	for (i = 0; i < ULFS_NDADDR && i < howmany(LFS_DIRBLKSIZ, lfs_sb_getbsize(fs)); i++)
 		VTOI(vp)->i_lfs_fragsize[i] = lfs_sb_getbsize(fs);
 	if (LFS_DIRBLKSIZ < lfs_sb_getbsize(fs))

Index: src/sys/lib/libsa/lfsv1.c
diff -u src/sys/lib/libsa/lfsv1.c:1.13 src/sys/lib/libsa/lfsv1.c:1.14
--- src/sys/lib/libsa/lfsv1.c:1.13	Wed Aug 12 18:25:52 2015
+++ src/sys/lib/libsa/lfsv1.c	Wed Aug 12 18:28:01 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: lfsv1.c,v 1.13 2015/08/12 18:25:52 dholland Exp $ */
+/* $NetBSD: lfsv1.c,v 1.14 2015/08/12 18:28:01 dholland Exp $ */
 
 #define	LIBSA_LFS
 #define	REQUIRED_LFS_VERSION	1
@@ -13,7 +13,7 @@
 #define	ufs_ls			lfsv1_ls
 #endif
 
-#define ufs_dinode		ulfs1_dinode
+#define ufs_dinode		lfs32_dinode
 
 #define	fs_bsize		lfs_dlfs_u.u_32.dlfs_ibsize
 
Index: src/sys/lib/libsa/lfsv2.c
diff -u src/sys/lib/libsa/lfsv2.c:1.13 src/sys/lib/libsa/lfsv2.c:1.14
--- src/sys/lib/libsa/lfsv2.c:1.13	Wed Aug 12 18:25:52 2015
+++ src/sys/lib/libsa/lfsv2.c	Wed Aug 12 18:28:01 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: lfsv2.c,v 1.13 2015/08/12 18:25:52 dholland Exp $ */
+/* $NetBSD: lfsv2.c,v 1.14 2015/08/12 18:28:01 dholland Exp $ */
 
 #define	LIBSA_LFS
 #define	REQUIRED_LFS_VERSION	2
@@ -13,7 +13,7 @@
 #define	ufs_ls			lfsv2_ls
 #endif
 
-#define ufs_dinode		ulfs1_dinode
+#define ufs_dinode		lfs32_dinode
 
 #define	fs_bsize		lfs_dlfs_u.u_32.dlfs_bsize
 

Index: src/sys/lib/libsa/ufs.c
diff -u src/sys/lib/libsa/ufs.c:1.71 src/sys/lib/libsa/ufs.c:1.72
--- src/sys/lib/libsa/ufs.c:1.71	Wed Aug 12 18:25:52 2015
+++ src/sys/lib/libsa/ufs.c	Wed Aug 12 18:28:01 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: ufs.c,v 1.71 2015/08/12 18:25:52 dholland Exp $	*/
+/*	$NetBSD: ufs.c,v 1.72 2015/08/12 18:28:01 dholland Exp $	*/
 
 /*-
  * Copyright (c) 1993
@@ -114,6 +114,9 @@ struct salfs {
 #define STRUCT_LFS struct salfs
 #include <ufs/lfs/lfs_accessors.h>
 
+/* override this to avoid a mess with the dinode accessors */
+#define lfs_dino_getsize(fs, dp) ((dp)->di_size)
+
 typedef struct salfs FS;
 #define fs_magic	lfs_dlfs_u.u_32.dlfs_magic
 #define fs_maxsymlinklen lfs_dlfs_u.u_32.dlfs_maxsymlinklen

Index: src/sys/ufs/lfs/lfs.h
diff -u src/sys/ufs/lfs/lfs.h:1.179 src/sys/ufs/lfs/lfs.h:1.180
--- src/sys/ufs/lfs/lfs.h:1.179	Wed Aug 12 18:27:18 2015
+++ src/sys/ufs/lfs/lfs.h	Wed Aug 12 18:28:01 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs.h,v 1.179 2015/08/12 18:27:18 dholland Exp $	*/
+/*	$NetBSD: lfs.h,v 1.180 2015/08/12 18:28:01 dholland Exp $	*/
 
 /*  from NetBSD: dinode.h,v 1.22 2013/01/22 09:39:18 dholland Exp  */
 /*  from NetBSD: dir.h,v 1.21 2009/07/22 04:49:19 dholland Exp  */
@@ -353,7 +353,7 @@ struct lfs_odirtemplate {
  * are defined by types with precise widths.
  */
 
-struct ulfs1_dinode {
+struct lfs32_dinode {
 	u_int16_t	di_mode;	/*   0: IFMT, permissions; see below. */
 	int16_t		di_nlink;	/*   2: File link count. */
 	u_int32_t	di_inumber;	/*   4: Inode number. */
@@ -374,7 +374,7 @@ struct ulfs1_dinode {
 	u_int64_t	di_modrev;	/* 120: i_modrev for NFSv4 */
 };
 
-struct ulfs2_dinode {
+struct lfs64_dinode {
 	u_int16_t	di_mode;	/*   0: IFMT, permissions; see below. */
 	int16_t		di_nlink;	/*   2: File link count. */
 	u_int32_t	di_uid;		/*   4: File owner. */
@@ -402,6 +402,11 @@ struct ulfs2_dinode {
 	u_int64_t	di_spare[1];	/* 244: Reserved; currently unused */
 };
 
+union lfs_dinode {
+	struct lfs64_dinode u_64;
+	struct lfs32_dinode u_32;
+};
+
 /*
  * The di_db fields may be overlaid with other information for
  * file types that do not have associated disk storage. Block
@@ -412,8 +417,8 @@ struct ulfs2_dinode {
 #define	di_rdev		di_db[0]
 
 /* Size of the on-disk inode. */
-#define	LFS_DINODE1_SIZE	(sizeof(struct ulfs1_dinode))	/* 128 */
-#define	LFS_DINODE2_SIZE	(sizeof(struct ulfs2_dinode))
+//#define	LFS_DINODE1_SIZE	(sizeof(struct ulfs1_dinode))	/* 128 */
+//#define	LFS_DINODE2_SIZE	(sizeof(struct ulfs2_dinode))
 
 /* File types, found in the upper bits of di_mode. */
 #define	LFS_IFMT	0170000		/* Mask of file type. */
@@ -1007,7 +1012,7 @@ struct segment {
 	struct buf	**cbpp;		/* pointer to next available bp */
 	struct buf	**start_bpp;	/* pointer to first bp in this set */
 	struct buf	 *ibp;		/* buffer pointer to inode page */
-	struct ulfs1_dinode    *idp;          /* pointer to ifile dinode */
+	union lfs_dinode *idp;          /* pointer to ifile dinode */
 	FINFO *fip;			/* current fileinfo pointer */
 	struct vnode	 *vp;		/* vnode being gathered */
 	void	 *segsum;		/* segment summary info */

Index: src/sys/ufs/lfs/lfs_accessors.h
diff -u src/sys/ufs/lfs/lfs_accessors.h:1.12 src/sys/ufs/lfs/lfs_accessors.h:1.13
--- src/sys/ufs/lfs/lfs_accessors.h:1.12	Wed Aug 12 18:27:01 2015
+++ src/sys/ufs/lfs/lfs_accessors.h	Wed Aug 12 18:28:01 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_accessors.h,v 1.12 2015/08/12 18:27:01 dholland Exp $	*/
+/*	$NetBSD: lfs_accessors.h,v 1.13 2015/08/12 18:28:01 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  */
@@ -160,6 +160,9 @@
 #define STRUCT_LFS struct lfs
 #endif
 
+/*
+ * dinodes
+ */
 
 /*
  * Maximum length of a symlink that can be stored within the inode.
@@ -171,6 +174,95 @@
 	((ip)->i_ump->um_fstype == ULFS1) ? \
 	ULFS1_MAXSYMLINKLEN : ULFS2_MAXSYMLINKLEN
 
+#define DINOSIZE(fs) ((fs)->lfs_is64 ? sizeof(struct lfs64_dinode) : sizeof(struct lfs32_dinode))
+
+#define DINO_IN_BLOCK(fs, base, ix) \
+	((union lfs_dinode *)((char *)(base) + DINOSIZE(fs) * (ix)))
+
+#define LFS_DEF_DINO_ACCESSOR(type, type32, field) \
+	static __unused inline type				\
+	lfs_dino_get##field(STRUCT_LFS *fs, union lfs_dinode *dip) \
+	{							\
+		if (fs->lfs_is64) {				\
+			return dip->u_64.di_##field; 		\
+		} else {					\
+			return dip->u_32.di_##field; 		\
+		}						\
+	}							\
+	static __unused inline void				\
+	lfs_dino_set##field(STRUCT_LFS *fs, union lfs_dinode *dip, type val) \
+	{							\
+		if (fs->lfs_is64) {				\
+			type *p = &dip->u_64.di_##field;	\
+			(void)p;				\
+			dip->u_64.di_##field = val;		\
+		} else {					\
+			type32 *p = &dip->u_32.di_##field;	\
+			(void)p;				\
+			dip->u_32.di_##field = val;		\
+		}						\
+	}							\
+
+LFS_DEF_DINO_ACCESSOR(uint16_t, uint16_t, mode);
+LFS_DEF_DINO_ACCESSOR(int16_t, int16_t, nlink);
+LFS_DEF_DINO_ACCESSOR(uint64_t, uint32_t, inumber);
+LFS_DEF_DINO_ACCESSOR(uint64_t, uint64_t, size);
+LFS_DEF_DINO_ACCESSOR(int64_t, int32_t, atime);
+LFS_DEF_DINO_ACCESSOR(int32_t, int32_t, atimensec);
+LFS_DEF_DINO_ACCESSOR(int64_t, int32_t, mtime);
+LFS_DEF_DINO_ACCESSOR(int32_t, int32_t, mtimensec);
+LFS_DEF_DINO_ACCESSOR(int64_t, int32_t, ctime);
+LFS_DEF_DINO_ACCESSOR(int32_t, int32_t, ctimensec);
+LFS_DEF_DINO_ACCESSOR(uint32_t, uint32_t, flags);
+LFS_DEF_DINO_ACCESSOR(uint64_t, uint32_t, blocks);
+LFS_DEF_DINO_ACCESSOR(int32_t, int32_t, gen);
+LFS_DEF_DINO_ACCESSOR(uint32_t, uint32_t, uid);
+LFS_DEF_DINO_ACCESSOR(uint32_t, uint32_t, gid);
+
+static __unused inline daddr_t
+lfs_dino_getdb(STRUCT_LFS *fs, union lfs_dinode *dip, unsigned ix)
+{
+	KASSERT(ix < ULFS_NDADDR);
+	if (fs->lfs_is64) {
+		return dip->u_64.di_db[ix];
+	} else {
+		return dip->u_32.di_db[ix];
+	}
+}
+
+static __unused inline daddr_t
+lfs_dino_getib(STRUCT_LFS *fs, union lfs_dinode *dip, unsigned ix)
+{
+	KASSERT(ix < ULFS_NIADDR);
+	if (fs->lfs_is64) {
+		return dip->u_64.di_ib[ix];
+	} else {
+		return dip->u_32.di_ib[ix];
+	}
+}
+
+static __unused inline void
+lfs_dino_setdb(STRUCT_LFS *fs, union lfs_dinode *dip, unsigned ix, daddr_t val)
+{
+	KASSERT(ix < ULFS_NDADDR);
+	if (fs->lfs_is64) {
+		dip->u_64.di_db[ix] = val;
+	} else {
+		dip->u_32.di_db[ix] = val;
+	}
+}
+
+static __unused inline void
+lfs_dino_setib(STRUCT_LFS *fs, union lfs_dinode *dip, unsigned ix, daddr_t val)
+{
+	KASSERT(ix < ULFS_NIADDR);
+	if (fs->lfs_is64) {
+		dip->u_64.di_ib[ix] = val;
+	} else {
+		dip->u_32.di_ib[ix] = val;
+	}
+}
+
 /*
  * "struct buf" associated definitions
  */
@@ -895,9 +987,9 @@ lfs_btofsb(STRUCT_LFS *fs, uint64_t b)
 #define lfs_blknum(fs, fsb)	/* calculates rounddown(fsb, fs->lfs_frag) */ \
 	((fsb) &~ ((fs)->lfs_frag - 1))
 #define lfs_dblksize(fs, dp, lbn) \
-	(((lbn) >= ULFS_NDADDR || (dp)->di_size >= ((lbn) + 1) << lfs_sb_getbshift(fs)) \
+	(((lbn) >= ULFS_NDADDR || lfs_dino_getsize(fs, dp) >= ((lbn) + 1) << lfs_sb_getbshift(fs)) \
 	    ? lfs_sb_getbsize(fs) \
-	    : (lfs_fragroundup(fs, lfs_blkoff(fs, (dp)->di_size))))
+	    : (lfs_fragroundup(fs, lfs_blkoff(fs, lfs_dino_getsize(fs, dp)))))
 
 #define	lfs_segsize(fs)	(lfs_sb_getversion(fs) == 1 ?	     		\
 			   lfs_lblktosize((fs), lfs_sb_getssize(fs)) :	\

Index: src/sys/ufs/lfs/lfs_alloc.c
diff -u src/sys/ufs/lfs/lfs_alloc.c:1.126 src/sys/ufs/lfs/lfs_alloc.c:1.127
--- src/sys/ufs/lfs/lfs_alloc.c:1.126	Wed Aug 12 18:25:52 2015
+++ src/sys/ufs/lfs/lfs_alloc.c	Wed Aug 12 18:28:01 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_alloc.c,v 1.126 2015/08/12 18:25:52 dholland Exp $	*/
+/*	$NetBSD: lfs_alloc.c,v 1.127 2015/08/12 18:28:01 dholland Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2002, 2003, 2007 The NetBSD Foundation, Inc.
@@ -60,7 +60,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lfs_alloc.c,v 1.126 2015/08/12 18:25:52 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_alloc.c,v 1.127 2015/08/12 18:28:01 dholland Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_quota.h"
@@ -531,17 +531,17 @@ lfs_vfree(struct vnode *vp, ino_t ino, i
 	if (old_iaddr != LFS_UNUSED_DADDR) {
 		LFS_SEGENTRY(sup, fs, lfs_dtosn(fs, old_iaddr), bp);
 #ifdef DIAGNOSTIC
-		if (sup->su_nbytes < sizeof (struct ulfs1_dinode)) {
+		if (sup->su_nbytes < DINOSIZE(fs)) {
 			printf("lfs_vfree: negative byte count"
 			       " (segment %" PRIu32 " short by %d)\n",
 			       lfs_dtosn(fs, old_iaddr),
-			       (int)sizeof (struct ulfs1_dinode) -
+			       (int)DINOSIZE(fs) -
 				    sup->su_nbytes);
 			panic("lfs_vfree: negative byte count");
-			sup->su_nbytes = sizeof (struct ulfs1_dinode);
+			sup->su_nbytes = DINOSIZE(fs);
 		}
 #endif
-		sup->su_nbytes -= sizeof (struct ulfs1_dinode);
+		sup->su_nbytes -= DINOSIZE(fs);
 		LFS_WRITESEGENTRY(sup, fs, lfs_dtosn(fs, old_iaddr), bp); /* Ifile */
 	}
 

Index: src/sys/ufs/lfs/lfs_bio.c
diff -u src/sys/ufs/lfs/lfs_bio.c:1.133 src/sys/ufs/lfs/lfs_bio.c:1.134
--- src/sys/ufs/lfs/lfs_bio.c:1.133	Sun Aug  2 18:08:13 2015
+++ src/sys/ufs/lfs/lfs_bio.c	Wed Aug 12 18:28:01 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_bio.c,v 1.133 2015/08/02 18:08:13 dholland Exp $	*/
+/*	$NetBSD: lfs_bio.c,v 1.134 2015/08/12 18:28:01 dholland Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2002, 2003, 2008 The NetBSD Foundation, Inc.
@@ -60,7 +60,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lfs_bio.c,v 1.133 2015/08/02 18:08:13 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_bio.c,v 1.134 2015/08/12 18:28:01 dholland Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -601,7 +601,7 @@ lfs_flush(struct lfs *fs, int flags, int
 }
 
 #define INOCOUNT(fs) howmany(lfs_sb_getuinodes(fs), LFS_INOPB(fs))
-#define INOBYTES(fs) (lfs_sb_getuinodes(fs) * sizeof (struct ulfs1_dinode))
+#define INOBYTES(fs) (lfs_sb_getuinodes(fs) * DINOSIZE(fs))
 
 /*
  * make sure that we don't have too many locked buffers.

Index: src/sys/ufs/lfs/lfs_debug.c
diff -u src/sys/ufs/lfs/lfs_debug.c:1.51 src/sys/ufs/lfs/lfs_debug.c:1.52
--- src/sys/ufs/lfs/lfs_debug.c:1.51	Wed Aug 12 18:27:01 2015
+++ src/sys/ufs/lfs/lfs_debug.c	Wed Aug 12 18:28:01 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_debug.c,v 1.51 2015/08/12 18:27:01 dholland Exp $	*/
+/*	$NetBSD: lfs_debug.c,v 1.52 2015/08/12 18:28:01 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_debug.c,v 1.51 2015/08/12 18:27:01 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_debug.c,v 1.52 2015/08/12 18:28:01 dholland Exp $");
 
 #ifdef DEBUG
 
@@ -191,26 +191,26 @@ lfs_dump_super(struct lfs *lfsp)
 }
 
 void
-lfs_dump_dinode(struct ulfs1_dinode *dip)
+lfs_dump_dinode(struct lfs *fs, union lfs_dinode *dip)
 {
 	int i;
 
-	printf("%s%u\t%s%d\t%s%u\t%s%u\t%s%qu\t%s%d\n",
-	       "mode   ", dip->di_mode,
-	       "nlink  ", dip->di_nlink,
-	       "uid    ", dip->di_uid,
-	       "gid    ", dip->di_gid,
-	       "size   ", (long long)dip->di_size,
-	       "blocks ", dip->di_blocks);
-	printf("inum  %d\n", dip->di_inumber);
+	printf("%s%u\t%s%d\t%s%u\t%s%u\t%s%ju\t%s%ju\n",
+	       "mode   ", lfs_dino_getmode(fs, dip),
+	       "nlink  ", lfs_dino_getnlink(fs, dip),
+	       "uid    ", lfs_dino_getuid(fs, dip),
+	       "gid    ", lfs_dino_getgid(fs, dip),
+	       "size   ", (uintmax_t)lfs_dino_getsize(fs, dip),
+	       "blocks ", (uintmax_t)lfs_dino_getblocks(fs, dip));
+	printf("inum  %ju\n", (uintmax_t)lfs_dino_getinumber(fs, dip));
 	printf("Direct Addresses\n");
 	for (i = 0; i < ULFS_NDADDR; i++) {
-		printf("\t%x", dip->di_db[i]);
+		printf("\t%jx", (intmax_t)lfs_dino_getdb(fs, dip, i));
 		if ((i % 6) == 5)
 			printf("\n");
 	}
 	for (i = 0; i < ULFS_NIADDR; i++)
-		printf("\t%x", dip->di_ib[i]);
+		printf("\t%jx", (intmax_t)lfs_dino_getib(fs, dip, i));
 	printf("\n");
 }
 

Index: src/sys/ufs/lfs/lfs_extern.h
diff -u src/sys/ufs/lfs/lfs_extern.h:1.109 src/sys/ufs/lfs/lfs_extern.h:1.110
--- src/sys/ufs/lfs/lfs_extern.h:1.109	Wed Aug 12 18:23:47 2015
+++ src/sys/ufs/lfs/lfs_extern.h	Wed Aug 12 18:28:01 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_extern.h,v 1.109 2015/08/12 18:23:47 dholland Exp $	*/
+/*	$NetBSD: lfs_extern.h,v 1.110 2015/08/12 18:28:01 dholland Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc.
@@ -85,18 +85,21 @@ MALLOC_DECLARE(M_SEGMENT);
 #define LFS_IGNORE_LAZY_SYNC	9
 #define LFS_MAXID	 10
 
+/* not ours */
 struct fid;
 struct mount;
 struct nameidata;
 struct proc;
 struct statvfs;
 struct timeval;
-struct inode;
 struct uio;
 struct mbuf;
-struct ulfs1_dinode;
 struct buf;
 struct vnode;
+
+/* ours */
+struct inode;
+union lfs_dinode;
 struct dlfs;
 struct lfs;
 struct segment;
@@ -152,7 +155,7 @@ int lfs_reserve(struct lfs *, struct vno
 int lfs_bwrite_log(struct buf *, const char *, int);
 void lfs_dumplog(void);
 void lfs_dump_super(struct lfs *);
-void lfs_dump_dinode(struct ulfs1_dinode *);
+void lfs_dump_dinode(struct lfs *, union lfs_dinode *);
 void lfs_check_bpp(struct lfs *, struct segment *, char *, int);
 void lfs_check_segsum(struct lfs *, struct segment *, char *, int);
 void lfs_debug_log(int, const char *, ...);
@@ -162,7 +165,7 @@ void lfs_debug_log(int, const char *, ..
 int lfs_update(struct vnode *, const struct timespec *, const struct timespec *,
     int);
 int lfs_truncate(struct vnode *, off_t, int, kauth_cred_t);
-struct ulfs1_dinode *lfs_ifind(struct lfs *, ino_t, struct buf *);
+union lfs_dinode *lfs_ifind(struct lfs *, ino_t, struct buf *);
 void lfs_finalize_ino_seguse(struct lfs *, struct inode *);
 void lfs_finalize_fs_seguse(struct lfs *);
 

Index: src/sys/ufs/lfs/lfs_inode.c
diff -u src/sys/ufs/lfs/lfs_inode.c:1.143 src/sys/ufs/lfs/lfs_inode.c:1.144
--- src/sys/ufs/lfs/lfs_inode.c:1.143	Sun Aug  2 20:23:21 2015
+++ src/sys/ufs/lfs/lfs_inode.c	Wed Aug 12 18:28:01 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_inode.c,v 1.143 2015/08/02 20:23:21 dholland Exp $	*/
+/*	$NetBSD: lfs_inode.c,v 1.144 2015/08/12 18:28:01 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.143 2015/08/02 20:23:21 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_inode.c,v 1.144 2015/08/12 18:28:01 dholland Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_quota.h"
@@ -97,11 +97,12 @@ static int lfs_blkfree (struct lfs *, st
 static int lfs_vtruncbuf(struct vnode *, daddr_t, bool, int);
 
 /* Search a block for a specific dinode. */
-struct ulfs1_dinode *
+union lfs_dinode *
 lfs_ifind(struct lfs *fs, ino_t ino, struct buf *bp)
 {
-	struct ulfs1_dinode *dip = (struct ulfs1_dinode *)bp->b_data;
-	struct ulfs1_dinode *ldip, *fin;
+	char *base = bp->b_data;
+	union lfs_dinode *ldip;
+	unsigned num, i;
 
 	ASSERT_NO_SEGLOCK(fs);
 	/*
@@ -109,12 +110,14 @@ lfs_ifind(struct lfs *fs, ino_t ino, str
 	 * inode will supercede earlier ones.  Though it is unlikely, it is
 	 * possible that the same inode will appear in the same inode block.
 	 */
-	fin = dip + LFS_INOPB(fs);
-	for (ldip = fin - 1; ldip >= dip; --ldip)
-		if (ldip->di_inumber == ino)
+	num = LFS_INOPB(fs);
+	for (i = num; i-- > 0; ) {
+		ldip = (union lfs_dinode *)(base + i * DINOSIZE(fs));
+		if (lfs_dino_getinumber(fs, ldip) == ino)
 			return (ldip);
+	}
 
-	printf("searched %d entries\n", (int)(fin - dip));
+	printf("searched %u entries\n", num);
 	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.8 src/sys/ufs/lfs/lfs_inode.h:1.9
--- src/sys/ufs/lfs/lfs_inode.h:1.8	Sun Aug  2 18:12:41 2015
+++ src/sys/ufs/lfs/lfs_inode.h	Wed Aug 12 18:28:01 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_inode.h,v 1.8 2015/08/02 18:12:41 dholland Exp $	*/
+/*	$NetBSD: lfs_inode.h,v 1.9 2015/08/12 18:28:01 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  */
 
@@ -153,8 +153,8 @@ struct inode {
 	 * The on-disk dinode itself.
 	 */
 	union {
-		struct	ulfs1_dinode *ffs1_din;	/* 128 bytes of the on-disk dinode. */
-		struct	ulfs2_dinode *ffs2_din;
+		struct	lfs32_dinode *ffs1_din;	/* 128 bytes of the on-disk dinode. */
+		struct	lfs64_dinode *ffs2_din;
 	} i_din;
 };
 
@@ -175,6 +175,7 @@ struct inode {
 #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
@@ -199,6 +200,8 @@ struct inode {
 #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
 
 /* 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.28 src/sys/ufs/lfs/lfs_rfw.c:1.29
--- src/sys/ufs/lfs/lfs_rfw.c:1.28	Wed Aug 12 18:27:01 2015
+++ src/sys/ufs/lfs/lfs_rfw.c	Wed Aug 12 18:28:01 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_rfw.c,v 1.28 2015/08/12 18:27:01 dholland Exp $	*/
+/*	$NetBSD: lfs_rfw.c,v 1.29 2015/08/12 18:28:01 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.28 2015/08/12 18:27:01 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_rfw.c,v 1.29 2015/08/12 18:28:01 dholland Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_quota.h"
@@ -256,12 +256,13 @@ update_inoblk(struct lfs *fs, daddr_t of
 {
 	struct vnode *devvp, *vp;
 	struct inode *ip;
-	struct ulfs1_dinode *dip;
+	union lfs_dinode *dip;
 	struct buf *dbp, *ibp;
 	int error;
 	daddr_t daddr;
 	IFILE *ifp;
 	SEGUSE *sup;
+	unsigned i, num;
 
 	devvp = VTOI(fs->lfs_ivnode)->i_devvp;
 
@@ -275,10 +276,12 @@ update_inoblk(struct lfs *fs, daddr_t of
 		DLOG((DLOG_RF, "update_inoblk: bread returned %d\n", error));
 		return error;
 	}
-	dip = ((struct ulfs1_dinode *)(dbp->b_data)) + LFS_INOPB(fs);
-	while (--dip >= (struct ulfs1_dinode *)dbp->b_data) {
-		if (dip->di_inumber > LFS_IFILE_INUM) {
-			error = lfs_rf_valloc(fs, dip->di_inumber, dip->di_gen,
+	num = LFS_INOPB(fs);
+	for (i = num; i-- > 0; ) {
+		dip = (union lfs_dinode *)((char *)dbp->b_data + i * DINOSIZE(fs));
+		if (lfs_dino_getinumber(fs, dip) > LFS_IFILE_INUM) {
+			error = lfs_rf_valloc(fs, lfs_dino_getinumber(fs, dip),
+					      lfs_dino_getgen(fs, dip),
 					      l, &vp);
 			if (error) {
 				DLOG((DLOG_RF, "update_inoblk: lfs_rf_valloc"
@@ -286,21 +289,42 @@ update_inoblk(struct lfs *fs, daddr_t of
 				continue;
 			}
 			ip = VTOI(vp);
-			if (dip->di_size != ip->i_size)
-				lfs_truncate(vp, dip->di_size, 0, NOCRED);
+			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 */
-			memcpy(ip->i_din.ffs1_din, dip,
-			       offsetof(struct ulfs1_dinode, di_db[0]));
+			/* 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;
+			}
 
 			/* Then the rest, except di_blocks */
-			ip->i_flags = ip->i_ffs1_flags = dip->di_flags;
-			ip->i_gen = ip->i_ffs1_gen = dip->di_gen;
-			ip->i_uid = ip->i_ffs1_uid = dip->di_uid;
-			ip->i_gid = ip->i_ffs1_gid = dip->di_gid;
-
-			ip->i_mode = ip->i_ffs1_mode;
-			ip->i_nlink = ip->i_ffs1_nlink;
-			ip->i_size = ip->i_ffs1_size;
+			ip->i_flags = lfs_dino_getflags(fs, dip);
+			ip->i_gen = lfs_dino_getgen(fs, dip);
+			ip->i_uid = lfs_dino_getuid(fs, dip);
+			ip->i_gid = lfs_dino_getgid(fs, dip);
+
+			ip->i_mode = lfs_dino_getmode(fs, dip);
+			ip->i_nlink = lfs_dino_getnlink(fs, dip);
+			ip->i_size = lfs_dino_getsize(fs, dip);
 
 			LFS_SET_UINO(ip, IN_CHANGE | IN_UPDATE);
 
@@ -310,7 +334,7 @@ update_inoblk(struct lfs *fs, daddr_t of
 			vput(vp);
 
 			/* Record change in location */
-			LFS_IENTRY(ifp, fs, dip->di_inumber, ibp);
+			LFS_IENTRY(ifp, fs, lfs_dino_getinumber(fs, dip), ibp);
 			daddr = lfs_if_getdaddr(fs, ifp);
 			lfs_if_setdaddr(fs, ifp, LFS_DBTOFSB(fs, dbp->b_blkno));
 			error = LFS_BWRITE_LOG(ibp); /* Ifile */
@@ -319,14 +343,14 @@ update_inoblk(struct lfs *fs, daddr_t of
 				if (daddr > 0) {
 					LFS_SEGENTRY(sup, fs, lfs_dtosn(fs, daddr),
 						     ibp);
-					sup->su_nbytes -= sizeof (struct ulfs1_dinode);
+					sup->su_nbytes -= DINOSIZE(fs);
 					LFS_WRITESEGENTRY(sup, fs,
 							  lfs_dtosn(fs, daddr),
 							  ibp);
 				}
 				LFS_SEGENTRY(sup, fs, lfs_dtosn(fs, LFS_DBTOFSB(fs, dbp->b_blkno)),
 					     ibp);
-				sup->su_nbytes += sizeof (struct ulfs1_dinode);
+				sup->su_nbytes += DINOSIZE(fs);
 				LFS_WRITESEGENTRY(sup, fs,
 						  lfs_dtosn(fs, LFS_DBTOFSB(fs, dbp->b_blkno)),
 						  ibp);

Index: src/sys/ufs/lfs/lfs_segment.c
diff -u src/sys/ufs/lfs/lfs_segment.c:1.255 src/sys/ufs/lfs/lfs_segment.c:1.256
--- src/sys/ufs/lfs/lfs_segment.c:1.255	Wed Aug 12 18:27:01 2015
+++ src/sys/ufs/lfs/lfs_segment.c	Wed Aug 12 18:28:01 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_segment.c,v 1.255 2015/08/12 18:27:01 dholland Exp $	*/
+/*	$NetBSD: lfs_segment.c,v 1.256 2015/08/12 18:28:01 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.255 2015/08/12 18:27:01 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_segment.c,v 1.256 2015/08/12 18:28:01 dholland Exp $");
 
 #define _VFS_VNODE_PRIVATE	/* XXX: check for VI_MARKER, this has to go */
 
@@ -1011,27 +1011,25 @@ lfs_update_iaddr(struct lfs *fs, struct 
 #endif
 		LFS_SEGENTRY(sup, fs, oldsn, bp);
 #ifdef DIAGNOSTIC
-		if (sup->su_nbytes +
-		    sizeof (struct ulfs1_dinode) * ndupino
-		      < sizeof (struct ulfs1_dinode)) {
+		if (sup->su_nbytes + DINOSIZE(fs) * ndupino < DINOSIZE(fs)) {
 			printf("lfs_writeinode: negative bytes "
 			       "(segment %" PRIu32 " short by %d, "
 			       "oldsn=%" PRIu32 ", cursn=%" PRIu32
 			       ", daddr=%" PRId64 ", su_nbytes=%u, "
 			       "ndupino=%d)\n",
 			       lfs_dtosn(fs, daddr),
-			       (int)sizeof (struct ulfs1_dinode) *
+			       (int)DINOSIZE(fs) *
 				   (1 - sp->ndupino) - sup->su_nbytes,
 			       oldsn, sp->seg_number, daddr,
 			       (unsigned int)sup->su_nbytes,
 			       sp->ndupino);
 			panic("lfs_writeinode: negative bytes");
-			sup->su_nbytes = sizeof (struct ulfs1_dinode);
+			sup->su_nbytes = DINOSIZE(fs);
 		}
 #endif
 		DLOG((DLOG_SU, "seg %d -= %d for ino %d inode\n",
-		      lfs_dtosn(fs, daddr), sizeof (struct ulfs1_dinode), ino));
-		sup->su_nbytes -= sizeof (struct ulfs1_dinode);
+		      lfs_dtosn(fs, daddr), DINOSIZE(fs), ino));
+		sup->su_nbytes -= DINOSIZE(fs);
 		redo_ifile |=
 			(ino == LFS_IFILE_INUM && !(bp->b_flags & B_GATHERED));
 		if (redo_ifile) {
@@ -1051,10 +1049,9 @@ int
 lfs_writeinode(struct lfs *fs, struct segment *sp, struct inode *ip)
 {
 	struct buf *bp;
-	struct ulfs1_dinode *cdp;
+	union lfs_dinode *cdp;
 	struct vnode *vp = ITOV(ip);
 	daddr_t daddr;
-	int32_t *daddrp;	/* XXX ondisk32 */
 	int i, ndx;
 	int redo_ifile = 0;
 	int gotblk = 0;
@@ -1100,7 +1097,7 @@ lfs_writeinode(struct lfs *fs, struct se
 			break;
 
 		if (sp->idp) {
-			sp->idp->di_inumber = 0;
+			lfs_dino_setinumber(fs, sp->idp, 0);
 			sp->idp = NULL;
 		}
 		++count;
@@ -1126,9 +1123,13 @@ lfs_writeinode(struct lfs *fs, struct se
 		gotblk++;
 
 		/* Zero out inode numbers */
-		for (i = 0; i < LFS_INOPB(fs); ++i)
-			((struct ulfs1_dinode *)sp->ibp->b_data)[i].di_inumber =
-			    0;
+		for (i = 0; i < LFS_INOPB(fs); ++i) {
+			union lfs_dinode *tmpdi;
+
+			tmpdi = (union lfs_dinode *)((char *)sp->ibp->b_data +
+						     DINOSIZE(fs) * i);
+			lfs_dino_setinumber(fs, tmpdi, 0);
+		}
 
 		++sp->start_bpp;
 		lfs_sb_subavail(fs, lfs_btofsb(fs, lfs_sb_getibsize(fs)));
@@ -1162,14 +1163,22 @@ lfs_writeinode(struct lfs *fs, struct se
 	 * already been gathered.
 	 */
 	if (ip->i_number == LFS_IFILE_INUM && sp->idp) {
-		*(sp->idp) = *ip->i_din.ffs1_din;
+		if (fs->lfs_is64) {
+			sp->idp->u_64 = *ip->i_din.ffs2_din;
+		} else {
+			sp->idp->u_32 = *ip->i_din.ffs1_din;
+		}
 		ip->i_lfs_osize = ip->i_size;
 		return 0;
 	}
 
 	bp = sp->ibp;
-	cdp = ((struct ulfs1_dinode *)bp->b_data) + (sp->ninodes % LFS_INOPB(fs));
-	*cdp = *ip->i_din.ffs1_din;
+	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;
+	}
 
 	/*
 	 * This inode is on its way to disk; clear its VU_DIROP status when
@@ -1192,12 +1201,12 @@ lfs_writeinode(struct lfs *fs, struct se
 	 */
 	if (sp->seg_flags & SEGM_CLEAN) {
 		if (vp->v_uflag & VU_DIROP) {
-			cdp->di_nlink = ip->i_lfs_odnlink;
+			lfs_dino_setnlink(fs, cdp, ip->i_lfs_odnlink);
 			/* if (vp->v_type == VDIR) */
-			cdp->di_size = ip->i_lfs_osize;
+			lfs_dino_setsize(fs, cdp, ip->i_lfs_osize);
 		}
 	} else {
-		ip->i_lfs_odnlink = cdp->di_nlink;
+		ip->i_lfs_odnlink = lfs_dino_getnlink(fs, cdp);
 		ip->i_lfs_osize = ip->i_size;
 	}
 		
@@ -1222,19 +1231,24 @@ lfs_writeinode(struct lfs *fs, struct se
 	if (((ip->i_ffs1_mode & LFS_IFMT) == LFS_IFREG ||
 	     (ip->i_ffs1_mode & LFS_IFMT) == LFS_IFDIR) &&
 	    ip->i_size > ((ip->i_lfs_hiblk + 1) << lfs_sb_getbshift(fs))) {
-		cdp->di_size = (ip->i_lfs_hiblk + 1) << lfs_sb_getbshift(fs);
+		lfs_dino_setsize(fs, cdp, (ip->i_lfs_hiblk + 1) << lfs_sb_getbshift(fs));
 		DLOG((DLOG_SEG, "lfs_writeinode: ino %d size %" PRId64 " -> %"
-		      PRId64 "\n", (int)ip->i_number, ip->i_size, cdp->di_size));
+		      PRId64 "\n", (int)ip->i_number, ip->i_size, lfs_dino_getsize(fs, cdp)));
 	}
 	if (ip->i_lfs_effnblks != ip->i_ffs1_blocks) {
 		DLOG((DLOG_SEG, "lfs_writeinode: cleansing ino %d eff %jd != nblk %d)"
 		      " at %jx\n", ip->i_number, (intmax_t)ip->i_lfs_effnblks,
 		      ip->i_ffs1_blocks, (uintmax_t)lfs_sb_getoffset(fs)));
-		for (daddrp = cdp->di_db; daddrp < cdp->di_ib + ULFS_NIADDR;
-		     daddrp++) {
-			if (*daddrp == UNWRITTEN) {
+		for (i=0; i<ULFS_NDADDR; i++) {
+			if (lfs_dino_getdb(fs, cdp, i) == UNWRITTEN) {
+				DLOG((DLOG_SEG, "lfs_writeinode: wiping UNWRITTEN\n"));
+				lfs_dino_setdb(fs, cdp, i, 0);
+			}
+		}
+		for (i=0; i<ULFS_NIADDR; i++) {
+			if (lfs_dino_getib(fs, cdp, i) == UNWRITTEN) {
 				DLOG((DLOG_SEG, "lfs_writeinode: wiping UNWRITTEN\n"));
-				*daddrp = 0;
+				lfs_dino_setib(fs, cdp, i, 0);
 			}
 		}
 	}
@@ -1244,17 +1258,17 @@ lfs_writeinode(struct lfs *fs, struct se
 	 * Check dinode held blocks against dinode size.
 	 * This should be identical to the check in lfs_vget().
 	 */
-	for (i = (cdp->di_size + lfs_sb_getbsize(fs) - 1) >> lfs_sb_getbshift(fs);
+	for (i = (lfs_dino_getsize(fs, cdp) + lfs_sb_getbsize(fs) - 1) >> lfs_sb_getbshift(fs);
 	     i < ULFS_NDADDR; i++) {
 		KASSERT(i >= 0);
-		if ((cdp->di_mode & LFS_IFMT) == LFS_IFLNK)
+		if ((lfs_dino_getmode(fs, cdp) & LFS_IFMT) == LFS_IFLNK)
 			continue;
-		if (((cdp->di_mode & LFS_IFMT) == LFS_IFBLK ||
-		     (cdp->di_mode & LFS_IFMT) == LFS_IFCHR) && i == 0)
+		if (((lfs_dino_getmode(fs, cdp) & LFS_IFMT) == LFS_IFBLK ||
+		     (lfs_dino_getmode(fs, cdp) & LFS_IFMT) == LFS_IFCHR) && i == 0)
 			continue;
-		if (cdp->di_db[i] != 0) {
+		if (lfs_dino_getdb(fs, cdp, i) != 0) {
 # ifdef DEBUG
-			lfs_dump_dinode(cdp);
+			lfs_dump_dinode(fs, cdp);
 # endif
 			panic("writing inconsistent inode");
 		}
@@ -1278,8 +1292,7 @@ lfs_writeinode(struct lfs *fs, struct se
 
 	if (ip->i_number == LFS_IFILE_INUM) {
 		/* We know sp->idp == NULL */
-		sp->idp = ((struct ulfs1_dinode *)bp->b_data) +
-			(sp->ninodes % LFS_INOPB(fs));
+		sp->idp = DINO_IN_BLOCK(fs, bp, sp->ninodes % LFS_INOPB(fs));
 
 		/* Not dirty any more */
 		mutex_enter(&lfs_lock);
@@ -1567,21 +1580,19 @@ lfs_update_single(struct lfs *fs, struct
 			osize = lfs_sb_getbsize(fs);
 		LFS_SEGENTRY(sup, fs, oldsn, bp);
 #ifdef DIAGNOSTIC
-		if (sup->su_nbytes + sizeof (struct ulfs1_dinode) * ndupino
-		    < osize) {
+		if (sup->su_nbytes + DINOSIZE(fs) * ndupino < osize) {
 			printf("lfs_updatemeta: negative bytes "
 			       "(segment %" PRIu32 " short by %" PRId64
 			       ")\n", lfs_dtosn(fs, daddr),
 			       (int64_t)osize -
-			       (sizeof (struct ulfs1_dinode) * ndupino +
-				sup->su_nbytes));
+			       (DINOSIZE(fs) * ndupino + sup->su_nbytes));
 			printf("lfs_updatemeta: ino %llu, lbn %" PRId64
 			       ", addr = 0x%" PRIx64 "\n",
 			       (unsigned long long)ip->i_number, lbn, daddr);
 			printf("lfs_updatemeta: ndupino=%d\n", ndupino);
 			panic("lfs_updatemeta: negative bytes");
 			sup->su_nbytes = osize -
-			    sizeof (struct ulfs1_dinode) * ndupino;
+			    DINOSIZE(fs) * ndupino;
 		}
 #endif
 		DLOG((DLOG_SU, "seg %" PRIu32 " -= %d for ino %d lbn %" PRId64
@@ -1616,7 +1627,8 @@ lfs_updatemeta(struct segment *sp)
 	struct lfs *fs;
 	struct vnode *vp;
 	daddr_t lbn;
-	int i, nblocks, nblocks_orig, num;
+	int i, nblocks, num;
+	int __diagused nblocks_orig;
 	int bb;
 	int bytesleft, size;
 	unsigned lastlength;
@@ -2112,9 +2124,9 @@ lfs_writeseg(struct lfs *fs, struct segm
 	ninos = (lfs_ss_getninos(fs, ssp) + LFS_INOPB(fs) - 1) / LFS_INOPB(fs);
 	DLOG((DLOG_SU, "seg %d += %d for %d inodes\n",
 	      sp->seg_number,
-	      lfs_ss_getninos(fs, ssp) * sizeof (struct ulfs1_dinode),
+	      lfs_ss_getninos(fs, ssp) * DINOSIZE(fs),
 	      lfs_ss_getninos(fs, ssp)));
-	sup->su_nbytes += lfs_ss_getninos(fs, ssp) * sizeof (struct ulfs1_dinode);
+	sup->su_nbytes += lfs_ss_getninos(fs, ssp) * DINOSIZE(fs);
 	/* sup->su_nbytes += lfs_sb_getsumsize(fs); */
 	if (lfs_sb_getversion(fs) == 1)
 		sup->su_olastmod = time_second;

Index: src/sys/ufs/lfs/lfs_syscalls.c
diff -u src/sys/ufs/lfs/lfs_syscalls.c:1.168 src/sys/ufs/lfs/lfs_syscalls.c:1.169
--- src/sys/ufs/lfs/lfs_syscalls.c:1.168	Wed Aug 12 18:25:52 2015
+++ src/sys/ufs/lfs/lfs_syscalls.c	Wed Aug 12 18:28:01 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_syscalls.c,v 1.168 2015/08/12 18:25:52 dholland Exp $	*/
+/*	$NetBSD: lfs_syscalls.c,v 1.169 2015/08/12 18:28:01 dholland Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2002, 2003, 2007, 2007, 2008
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lfs_syscalls.c,v 1.168 2015/08/12 18:25:52 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_syscalls.c,v 1.169 2015/08/12 18:28:01 dholland Exp $");
 
 #ifndef LFS
 # define LFS		/* for prototypes in syscallargs.h */
@@ -447,7 +447,7 @@ lfs_markv(struct lwp *l, fsid_t *fsidp, 
 		/*
 		 * XXX should account indirect blocks and ifile pages as well
 		 */
-		if (nblkwritten + lfs_lblkno(fs, ninowritten * sizeof (struct ulfs1_dinode))
+		if (nblkwritten + lfs_lblkno(fs, ninowritten * DINOSIZE(fs))
 		    > LFS_MARKV_MAX_BLOCKS) {
 			DLOG((DLOG_CLEAN, "lfs_markv: writing %d blks %d inos\n",
 			      nblkwritten, ninowritten));

Index: src/sys/ufs/lfs/lfs_vfsops.c
diff -u src/sys/ufs/lfs/lfs_vfsops.c:1.339 src/sys/ufs/lfs/lfs_vfsops.c:1.340
--- src/sys/ufs/lfs/lfs_vfsops.c:1.339	Wed Aug 12 18:27:01 2015
+++ src/sys/ufs/lfs/lfs_vfsops.c	Wed Aug 12 18:28:01 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_vfsops.c,v 1.339 2015/08/12 18:27:01 dholland Exp $	*/
+/*	$NetBSD: lfs_vfsops.c,v 1.340 2015/08/12 18:28:01 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.339 2015/08/12 18:27:01 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_vfsops.c,v 1.340 2015/08/12 18:28:01 dholland Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_lfs.h"
@@ -538,10 +538,14 @@ void
 lfs_init(void)
 {
 
+	/*
+	 * XXX: should we use separate pools for 32-bit and 64-bit
+	 * dinodes?
+	 */
 	malloc_type_attach(M_SEGMENT);
 	pool_init(&lfs_inode_pool, sizeof(struct inode), 0, 0, 0,
 	    "lfsinopl", &pool_allocator_nointr, IPL_NONE);
-	pool_init(&lfs_dinode_pool, sizeof(struct ulfs1_dinode), 0, 0, 0,
+	pool_init(&lfs_dinode_pool, sizeof(union lfs_dinode), 0, 0, 0,
 	    "lfsdinopl", &pool_allocator_nointr, IPL_NONE);
 	pool_init(&lfs_inoext_pool, sizeof(struct lfs_inode_ext), 8, 0, 0,
 	    "lfsinoextpl", &pool_allocator_nointr, IPL_NONE);
@@ -1471,8 +1475,9 @@ lfs_vget(struct mount *mp, ino_t ino, st
 static void
 lfs_init_vnode(struct ulfsmount *ump, ino_t ino, struct vnode *vp)
 {
+	struct lfs *fs = ump->um_lfs;
 	struct inode *ip;
-	struct ulfs1_dinode *dp;
+	union lfs_dinode *dp;
 
 	ASSERT_NO_SEGLOCK(ump->um_lfs);
 
@@ -1483,11 +1488,17 @@ 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));
-	ip->i_din.ffs1_din = dp;
+	// 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_ump = ump;
 	ip->i_vnode = vp;
 	ip->i_dev = ump->um_dev;
-	ip->i_number = dp->di_inumber = ino;
+	lfs_dino_setinumber(fs, dp, ino);
+	ip->i_number = ino;
 	ip->i_lfs = ump->um_lfs;
 	ip->i_lfs_effnblks = 0;
 	SPLAY_INIT(&ip->i_lfs_lbtree);
@@ -1508,7 +1519,8 @@ lfs_deinit_vnode(struct ulfsmount *ump, 
 	struct inode *ip = VTOI(vp);
 
 	pool_put(&lfs_inoext_pool, ip->inode_ext.lfs);
-	pool_put(&lfs_dinode_pool, ip->i_din.ffs1_din);
+	// XXX bogus cast
+	pool_put(&lfs_dinode_pool, (union lfs_dinode *)ip->i_din.ffs1_din);
 	pool_put(&lfs_inode_pool, ip);
 	vp->v_data = NULL;
 }
@@ -1522,7 +1534,7 @@ lfs_loadvnode(struct mount *mp, struct v
     const void *key, size_t key_len, const void **new_key)
 {
 	struct lfs *fs;
-	struct ulfs1_dinode *dip;
+	union lfs_dinode *dip;
 	struct inode *ip;
 	struct buf *bp;
 	IFILE *ifp;
@@ -1575,8 +1587,13 @@ lfs_loadvnode(struct mount *mp, struct v
 	if (curlwp == ump->um_cleaner_thread && ump->um_cleaner_hint != NULL &&
 	    ump->um_cleaner_hint->bi_lbn == LFS_UNUSED_LBN) {
 		dip = ump->um_cleaner_hint->bi_bp;
-		error = copyin(dip, ip->i_din.ffs1_din,
-		    sizeof(struct ulfs1_dinode));
+		if (fs->lfs_is64) {
+			error = copyin(dip, ip->i_din.ffs2_din,
+				       sizeof(struct lfs64_dinode));
+		} else {
+			error = copyin(dip, ip->i_din.ffs1_din,
+				       sizeof(struct lfs32_dinode));
+		}
 		if (error) {
 			lfs_deinit_vnode(ump, vp);
 			return error;
@@ -1620,7 +1637,7 @@ again:
 		mutex_enter(&lfs_lock);
 		if (fs->lfs_seglock > 0) {
 			struct buf **bpp;
-			struct ulfs1_dinode *dp;
+			union lfs_dinode *dp;
 			int i;
 
 			for (bpp = fs->lfs_sp->bpp;
@@ -1630,12 +1647,13 @@ again:
 					/* Inode block */
 					printf("%s: block 0x%" PRIx64 ": ",
 					       __func__, (*bpp)->b_blkno);
-					dp = (struct ulfs1_dinode *)
-					    (*bpp)->b_data;
-					for (i = 0; i < LFS_INOPB(fs); i++)
-						if (dp[i].di_inumber)
-							printf("%d ",
-							    dp[i].di_inumber);
+					for (i = 0; i < LFS_INOPB(fs); i++) {
+						dp = DINO_IN_BLOCK(fs,
+						    (*bpp)->b_data, i);
+						if (lfs_dino_getinumber(fs, dp))
+							printf("%ju ",
+							    (uintmax_t)lfs_dino_getinumber(fs, dp));
+					}
 					printf("\n");
 				}
 			}
@@ -1644,7 +1662,11 @@ again:
 #endif /* DEBUG */
 		panic("lfs_loadvnode: dinode not found");
 	}
-	*ip->i_din.ffs1_din = *dip;
+	if (fs->lfs_is64) {
+		*ip->i_din.ffs2_din = dip->u_64;
+	} else {
+		*ip->i_din.ffs1_din = dip->u_32;
+	}
 	brelse(bp, 0);
 
 out:	
@@ -2218,13 +2240,15 @@ lfs_vinit(struct mount *mp, struct vnode
 			    i == 0)
 				continue;
 			if (ip->i_ffs1_db[i] != 0) {
-				lfs_dump_dinode(ip->i_din.ffs1_din);
+				// XXX bogus cast
+				lfs_dump_dinode(fs, (union lfs_dinode *)ip->i_din.ffs1_din);
 				panic("inconsistent inode (direct)");
 			}
 		}
 		for ( ; i < ULFS_NDADDR + ULFS_NIADDR; i++) {
 			if (ip->i_ffs1_ib[i - ULFS_NDADDR] != 0) {
-				lfs_dump_dinode(ip->i_din.ffs1_din);
+				// XXX bogus cast
+				lfs_dump_dinode(fs, (union lfs_dinode *)ip->i_din.ffs1_din);
 				panic("inconsistent inode (indirect)");
 			}
 		}
@@ -2237,7 +2261,8 @@ lfs_vinit(struct mount *mp, struct vnode
 #ifdef DIAGNOSTIC
 	if (vp->v_type == VNON) {
 # ifdef DEBUG
-		lfs_dump_dinode(ip->i_din.ffs1_din);
+		// XXX bogus cast
+		lfs_dump_dinode(fs, (union lfs_dinode *)ip->i_din.ffs1_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.285 src/sys/ufs/lfs/lfs_vnops.c:1.286
--- src/sys/ufs/lfs/lfs_vnops.c:1.285	Wed Aug 12 18:26:27 2015
+++ src/sys/ufs/lfs/lfs_vnops.c	Wed Aug 12 18:28:01 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_vnops.c,v 1.285 2015/08/12 18:26:27 dholland Exp $	*/
+/*	$NetBSD: lfs_vnops.c,v 1.286 2015/08/12 18:28:01 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.285 2015/08/12 18:26:27 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.286 2015/08/12 18:28:01 dholland Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_compat_netbsd.h"
@@ -2102,10 +2102,14 @@ lfs_dump_vop(void *v)
 		int a_flags;
 	} */ *ap = v;
 
+	struct inode *ip = VTOI(ap->a_vp);
+	struct lfs *fs = ip->i_lfs;
+
 #ifdef DDB
 	vfs_vnode_print(ap->a_vp, 0, printf);
 #endif
-	lfs_dump_dinode(VTOI(ap->a_vp)->i_din.ffs1_din);
+	// XXX bogus cast
+	lfs_dump_dinode(fs, (union lfs_dinode *)ip->i_din.ffs1_din);
 }
 #endif
 

Index: src/sys/ufs/lfs/ulfs_inode.h
diff -u src/sys/ufs/lfs/ulfs_inode.h:1.14 src/sys/ufs/lfs/ulfs_inode.h:1.15
--- src/sys/ufs/lfs/ulfs_inode.h:1.14	Fri Jul 24 06:59:32 2015
+++ src/sys/ufs/lfs/ulfs_inode.h	Wed Aug 12 18:28:01 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: ulfs_inode.h,v 1.14 2015/07/24 06:59:32 dholland Exp $	*/
+/*	$NetBSD: ulfs_inode.h,v 1.15 2015/08/12 18:28:01 dholland Exp $	*/
 /*  from NetBSD: inode.h,v 1.64 2012/11/19 00:36:21 jakllsch Exp  */
 
 /*
@@ -76,7 +76,7 @@ void lfs_unset_dirop(struct lfs *, struc
 #define LFS_INVERSE_MAX_BYTES(n) LFS_INVERSE_MAX_RESOURCE(n, PAGE_SIZE)
 #define LFS_WAIT_BYTES	    LFS_WAIT_RESOURCE(bufmem_lowater, PAGE_SIZE)
 #define LFS_MAX_DIROP	    ((desiredvnodes >> 2) + (desiredvnodes >> 3))
-#define SIZEOF_DIROP(fs)	(2 * (lfs_sb_getbsize(fs) + LFS_DINODE1_SIZE))
+#define SIZEOF_DIROP(fs)	(2 * (lfs_sb_getbsize(fs) + DINOSIZE(fs)))
 #define LFS_MAX_FSDIROP(fs)						\
 	(lfs_sb_getnclean(fs) <= lfs_sb_getresvseg(fs) ? 0 :		\
 	 ((lfs_sb_getnclean(fs) - lfs_sb_getresvseg(fs)) * lfs_sb_getssize(fs)) / \

Index: src/usr.sbin/dumplfs/dumplfs.c
diff -u src/usr.sbin/dumplfs/dumplfs.c:1.53 src/usr.sbin/dumplfs/dumplfs.c:1.54
--- src/usr.sbin/dumplfs/dumplfs.c:1.53	Wed Aug 12 18:27:01 2015
+++ src/usr.sbin/dumplfs/dumplfs.c	Wed Aug 12 18:28:01 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: dumplfs.c,v 1.53 2015/08/12 18:27:01 dholland Exp $	*/
+/*	$NetBSD: dumplfs.c,v 1.54 2015/08/12 18:28:01 dholland Exp $	*/
 
 /*-
  * Copyright (c) 1991, 1993
@@ -40,7 +40,7 @@ __COPYRIGHT("@(#) Copyright (c) 1991, 19
 #if 0
 static char sccsid[] = "@(#)dumplfs.c	8.5 (Berkeley) 5/24/95";
 #else
-__RCSID("$NetBSD: dumplfs.c,v 1.53 2015/08/12 18:27:01 dholland Exp $");
+__RCSID("$NetBSD: dumplfs.c,v 1.54 2015/08/12 18:28:01 dholland Exp $");
 #endif
 #endif /* not lint */
 
@@ -64,7 +64,7 @@ __RCSID("$NetBSD: dumplfs.c,v 1.53 2015/
 
 static void	addseg(char *);
 static void	dump_cleaner_info(struct lfs *, void *);
-static void	dump_dinode(struct ulfs1_dinode *);
+static void	dump_dinode(struct lfs *, union lfs_dinode *);
 static void	dump_ifile(int, struct lfs *, int, int, daddr_t);
 static int	dump_ipage_ifile(struct lfs *, int, char *, int);
 static int	dump_ipage_segusage(struct lfs *, int, char *, int);
@@ -275,9 +275,11 @@ static void
 dump_ifile(int fd, struct lfs *lfsp, int do_ientries, int do_segentries, daddr_t addr)
 {
 	char *ipage;
-	struct ulfs1_dinode *dip, *dpage;
+	char *dpage;
+	union lfs_dinode *dip = NULL;
 	/* XXX ondisk32 */
 	int32_t *addrp, *dindir, *iaddrp, *indir;
+	daddr_t pdb;
 	int block_limit, i, inum, j, nblocks, psize;
 
 	psize = lfs_sb_getbsize(lfsp);
@@ -288,29 +290,31 @@ dump_ifile(int fd, struct lfs *lfsp, int
 		err(1, "malloc");
 	get(fd, fsbtobyte(lfsp, addr), dpage, psize);
 
-	for (dip = dpage + LFS_INOPB(lfsp) - 1; dip >= dpage; --dip)
-		if (dip->di_inumber == LFS_IFILE_INUM)
+	for (i = LFS_INOPB(lfsp); i-- > 0; ) {
+		dip = DINO_IN_BLOCK(lfsp, dpage, i);
+		if (lfs_dino_getinumber(lfsp, dip) == LFS_IFILE_INUM)
 			break;
+	}
 
-	if (dip < dpage) {
+	if (lfs_dino_getinumber(lfsp, dip) != LFS_IFILE_INUM) {
 		warnx("unable to locate ifile inode at disk address 0x%jx",
 		     (uintmax_t)addr);
 		return;
 	}
 
 	(void)printf("\nIFILE inode\n");
-	dump_dinode(dip);
+	dump_dinode(lfsp, dip);
 
 	(void)printf("\nIFILE contents\n");
-	nblocks = dip->di_size >> lfs_sb_getbshift(lfsp);
+	nblocks = lfs_dino_getsize(lfsp, dip) >> lfs_sb_getbshift(lfsp);
 	block_limit = MIN(nblocks, ULFS_NDADDR);
 
 	/* Get the direct block */
 	if ((ipage = malloc(psize)) == NULL)
 		err(1, "malloc");
-	for (inum = 0, addrp = dip->di_db, i = 0; i < block_limit;
-	    i++, addrp++) {
-		get(fd, fsbtobyte(lfsp, *addrp), ipage, psize);
+	for (inum = 0, i = 0; i < block_limit; i++) {
+		pdb = lfs_dino_getdb(lfsp, dip, i);
+		get(fd, fsbtobyte(lfsp, pdb), ipage, psize);
 		if (i < lfs_sb_getcleansz(lfsp)) {
 			dump_cleaner_info(lfsp, ipage);
 			if (do_segentries)
@@ -340,7 +344,7 @@ dump_ifile(int fd, struct lfs *lfsp, int
 	/* Dump out blocks off of single indirect block */
 	if (!(indir = malloc(psize)))
 		err(1, "malloc");
-	get(fd, fsbtobyte(lfsp, dip->di_ib[0]), indir, psize);
+	get(fd, fsbtobyte(lfsp, lfs_dino_getib(lfsp, dip, 0)), indir, psize);
 	block_limit = MIN(i + lfs_sb_getnindir(lfsp), nblocks);
 	for (addrp = indir; i < block_limit; i++, addrp++) {
 		if (*addrp == LFS_UNUSED_DADDR)
@@ -373,7 +377,7 @@ dump_ifile(int fd, struct lfs *lfsp, int
 	/* Get the double indirect block */
 	if (!(dindir = malloc(psize)))
 		err(1, "malloc");
-	get(fd, fsbtobyte(lfsp, dip->di_ib[1]), dindir, psize);
+	get(fd, fsbtobyte(lfsp, lfs_dino_getib(lfsp, dip, 1)), dindir, psize);
 	for (iaddrp = dindir, j = 0; j < lfs_sb_getnindir(lfsp); j++, iaddrp++) {
 		if (*iaddrp == LFS_UNUSED_DADDR)
 			break;
@@ -462,34 +466,35 @@ dump_ipage_segusage(struct lfs *lfsp, in
 }
 
 static void
-dump_dinode(struct ulfs1_dinode *dip)
+dump_dinode(struct lfs *fs, union lfs_dinode *dip)
 {
 	int i;
 	time_t at, mt, ct;
 
-	at = dip->di_atime;
-	mt = dip->di_mtime;
-	ct = dip->di_ctime;
-
-	(void)printf("    %so%o\t%s%d\t%s%d\t%s%d\t%s%llu\n",
-		"mode  ", dip->di_mode,
-		"nlink ", dip->di_nlink,
-		"uid   ", dip->di_uid,
-		"gid   ", dip->di_gid,
-		"size  ", (long long)dip->di_size);
-	(void)printf("    %s%s    %s%s    %s%s",
-		"atime ", ctime(&at),
-		"mtime ", ctime(&mt),
-		"ctime ", ctime(&ct));
-	(void)printf("    inum  %d\n", dip->di_inumber);
+	at = lfs_dino_getatime(fs, dip);
+	mt = lfs_dino_getmtime(fs, dip);
+	ct = lfs_dino_getctime(fs, dip);
+
+	(void)printf("    %so%o\t%s%d\t%s%d\t%s%d\t%s%ju\n",
+		"mode  ", lfs_dino_getmode(fs, dip),
+		"nlink ", lfs_dino_getnlink(fs, dip),
+		"uid   ", lfs_dino_getuid(fs, dip),
+		"gid   ", lfs_dino_getgid(fs, dip),
+		"size  ", (uintmax_t)lfs_dino_getsize(fs, dip));
+	(void)printf("    %s%s", "atime ", ctime(&at));
+	(void)printf("    %s%s", "mtime ", ctime(&mt));
+	(void)printf("    %s%s", "ctime ", ctime(&ct));
+	(void)printf("    inum  %ju\n",
+		(uintmax_t)lfs_dino_getinumber(fs, dip));
 	(void)printf("    Direct Addresses\n");
 	for (i = 0; i < ULFS_NDADDR; i++) {
-		(void)printf("\t0x%x", dip->di_db[i]);
+		(void)printf("\t0x%jx", (intmax_t)lfs_dino_getdb(fs, dip, i));
 		if ((i % 6) == 5)
 			(void)printf("\n");
 	}
+	(void)printf("    Indirect Addresses\n");
 	for (i = 0; i < ULFS_NIADDR; i++)
-		(void)printf("\t0x%x", dip->di_ib[i]);
+		(void)printf("\t0x%jx", (intmax_t)lfs_dino_getib(fs, dip, i));
 	(void)printf("\n");
 }
 
@@ -503,7 +508,8 @@ dump_sum(int fd, struct lfs *lfsp, SEGSU
 	int ck;
 	int numbytes, numblocks;
 	char *datap;
-	struct ulfs1_dinode *inop;
+	char *diblock;
+	union lfs_dinode *dip;
 	size_t el_size;
 	u_int32_t datasum;
 	u_int32_t ssflags;
@@ -557,7 +563,7 @@ dump_sum(int fd, struct lfs *lfsp, SEGSU
 	/* XXX ondisk32 */
 	dp = (int32_t *)sp;
 	dp += lfs_sb_getsumsize(lfsp) / sizeof(int32_t);
-	inop = malloc(lfs_sb_getbsize(lfsp));
+	diblock = malloc(lfs_sb_getbsize(lfsp));
 	printf("    Inode addresses:");
 	numbytes = 0;
 	numblocks = 0;
@@ -565,17 +571,19 @@ dump_sum(int fd, struct lfs *lfsp, SEGSU
 		++numblocks;
 		numbytes += lfs_sb_getibsize(lfsp);	/* add bytes for inode block */
 		printf("\t0x%x {", *dp);
-		get(fd, fsbtobyte(lfsp, *dp), inop, lfs_sb_getibsize(lfsp));
+		get(fd, fsbtobyte(lfsp, *dp), diblock, lfs_sb_getibsize(lfsp));
 		for (j = 0; i < lfs_ss_getninos(lfsp, sp) && j < LFS_INOPB(lfsp); j++, i++) {
 			if (j > 0) 
 				(void)printf(", ");
-			(void)printf("%dv%d", inop[j].di_inumber, inop[j].di_gen);
+			dip = DINO_IN_BLOCK(lfsp, diblock, j);
+			(void)printf("%juv%d", lfs_dino_getinumber(lfsp, dip),
+				     lfs_dino_getgen(lfsp, dip));
 		}
 		(void)printf("}");
 		if (((i/LFS_INOPB(lfsp)) % 4) == 3)
 			(void)printf("\n");
 	}
-	free(inop);
+	free(diblock);
 
 	printf("\n");
 

Reply via email to