Module Name:    src
Committed By:   dholland
Date:           Tue Sep 15 14:58:06 UTC 2015

Modified Files:
        src/sbin/fsck_lfs: dir.c inode.c pass2.c
        src/sbin/newfs_lfs: make_lfs.c
        src/sys/ufs/lfs: lfs.h lfs_accessors.h lfs_rename.c ulfs_dirhash.c
            ulfs_lookup.c ulfs_vnops.c

Log Message:
Add and use accessor functions for more of the directory entry fields.


To generate a diff of this commit:
cvs rdiff -u -r1.38 -r1.39 src/sbin/fsck_lfs/dir.c
cvs rdiff -u -r1.63 -r1.64 src/sbin/fsck_lfs/inode.c
cvs rdiff -u -r1.27 -r1.28 src/sbin/fsck_lfs/pass2.c
cvs rdiff -u -r1.49 -r1.50 src/sbin/newfs_lfs/make_lfs.c
cvs rdiff -u -r1.185 -r1.186 src/sys/ufs/lfs/lfs.h
cvs rdiff -u -r1.22 -r1.23 src/sys/ufs/lfs/lfs_accessors.h
cvs rdiff -u -r1.9 -r1.10 src/sys/ufs/lfs/lfs_rename.c \
    src/sys/ufs/lfs/ulfs_dirhash.c
cvs rdiff -u -r1.26 -r1.27 src/sys/ufs/lfs/ulfs_lookup.c
cvs rdiff -u -r1.28 -r1.29 src/sys/ufs/lfs/ulfs_vnops.c

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

Modified files:

Index: src/sbin/fsck_lfs/dir.c
diff -u src/sbin/fsck_lfs/dir.c:1.38 src/sbin/fsck_lfs/dir.c:1.39
--- src/sbin/fsck_lfs/dir.c:1.38	Tue Sep  1 06:16:58 2015
+++ src/sbin/fsck_lfs/dir.c	Tue Sep 15 14:58:05 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: dir.c,v 1.38 2015/09/01 06:16:58 dholland Exp $	 */
+/* $NetBSD: dir.c,v 1.39 2015/09/15 14:58:05 dholland Exp $	 */
 
 /*
  * Copyright (c) 1980, 1986, 1993
@@ -154,7 +154,7 @@ dirscan(struct inodesc *idesc)
 	vp = vget(fs, idesc->id_number);
 	for (dp = fsck_readdir(vp, idesc); dp != NULL;
 	    dp = fsck_readdir(vp, idesc)) {
-		dsize = dp->d_reclen;
+		dsize = lfs_dir_getreclen(fs, dp);
 		memcpy(dbuf, dp, (size_t) dsize);
 		idesc->id_dirp = (struct lfs_direct *) dbuf;
 		if ((n = (*idesc->id_func) (idesc)) & ALTERED) {
@@ -193,8 +193,8 @@ fsck_readdir(struct uvnode *vp, struct i
 		fix = dofix(idesc, "DIRECTORY CORRUPTED");
 		bread(vp, idesc->id_lblkno, blksiz, 0, &bp);
 		dp = (struct lfs_direct *) (bp->b_data + idesc->id_loc);
-		dp->d_reclen = LFS_DIRBLKSIZ;
-		dp->d_ino = 0;
+		lfs_dir_setreclen(fs, dp, LFS_DIRBLKSIZ);
+		lfs_dir_setino(fs, dp, 0);
 		lfs_dir_settype(fs, dp, LFS_DT_UNKNOWN);
 		lfs_dir_setnamlen(fs, dp, 0);
 		dp->d_name[0] = '\0';
@@ -213,8 +213,8 @@ dpok:
 	}
 	dploc = idesc->id_loc;
 	dp = (struct lfs_direct *) (bp->b_data + dploc);
-	idesc->id_loc += dp->d_reclen;
-	idesc->id_filesize -= dp->d_reclen;
+	idesc->id_loc += lfs_dir_getreclen(fs, dp);
+	idesc->id_filesize -= lfs_dir_getreclen(fs, dp);
 	if ((idesc->id_loc % LFS_DIRBLKSIZ) == 0) {
 		brelse(bp, 0);
 		return dp;
@@ -231,7 +231,7 @@ dpok:
 		fix = dofix(idesc, "DIRECTORY CORRUPTED");
 		bread(vp, idesc->id_lblkno, blksiz, 0, &bp);
 		dp = (struct lfs_direct *) (bp->b_data + dploc);
-		dp->d_reclen += size;
+		lfs_dir_setreclen(fs, dp, lfs_dir_getreclen(fs, dp) + size);
 		if (fix)
 			VOP_BWRITE(bp);
 		else
@@ -255,23 +255,24 @@ dircheck(struct inodesc *idesc, struct l
 	int spaceleft;
 
 	spaceleft = LFS_DIRBLKSIZ - (idesc->id_loc % LFS_DIRBLKSIZ);
-	if (dp->d_ino >= maxino ||
-	    dp->d_reclen == 0 ||
-	    dp->d_reclen > spaceleft ||
-	    (dp->d_reclen & 0x3) != 0) {
+	if (lfs_dir_getino(fs, dp) >= maxino ||
+	    lfs_dir_getreclen(fs, dp) == 0 ||
+	    lfs_dir_getreclen(fs, dp) > spaceleft ||
+	    (lfs_dir_getreclen(fs, dp) & 0x3) != 0) {
 		pwarn("ino too large, reclen=0, reclen>space, or reclen&3!=0\n");
-		pwarn("dp->d_ino = 0x%x\tdp->d_reclen = 0x%x\n",
-		    dp->d_ino, dp->d_reclen);
-		pwarn("maxino = %llu\tspaceleft = 0x%x\n",
-		    (unsigned long long)maxino, spaceleft);
+		pwarn("dp->d_ino = 0x%jx\tdp->d_reclen = 0x%x\n",
+		    (uintmax_t)lfs_dir_getino(fs, dp),
+		    lfs_dir_getreclen(fs, dp));
+		pwarn("maxino = %ju\tspaceleft = 0x%x\n",
+		    (uintmax_t)maxino, spaceleft);
 		return (0);
 	}
-	if (dp->d_ino == 0)
+	if (lfs_dir_getino(fs, dp) == 0)
 		return (1);
 	size = LFS_DIRSIZ(fs, dp);
 	namlen = lfs_dir_getnamlen(fs, dp);
 	type = lfs_dir_gettype(fs, dp);
-	if (dp->d_reclen < size ||
+	if (lfs_dir_getreclen(fs, dp) < size ||
 	    idesc->id_filesize < size ||
 	/* namlen > MAXNAMLEN || */
 	    type > 15) {
@@ -374,17 +375,18 @@ mkentry(struct inodesc *idesc)
 	namlen = strlen(idesc->id_name);
 	lfs_dir_setnamlen(fs, &newent, namlen);
 	newlen = LFS_DIRSIZ(fs, &newent);
-	if (dirp->d_ino != 0)
+	if (lfs_dir_getino(fs, dirp) != 0)
 		oldlen = LFS_DIRSIZ(fs, dirp);
 	else
 		oldlen = 0;
-	if (dirp->d_reclen - oldlen < newlen)
+	if (lfs_dir_getreclen(fs, dirp) - oldlen < newlen)
 		return (KEEPON);
-	newent.d_reclen = dirp->d_reclen - oldlen;
-	dirp->d_reclen = oldlen;
+	lfs_dir_setreclen(fs, &newent, lfs_dir_getreclen(fs, dirp) - oldlen);
+	lfs_dir_setreclen(fs, dirp, oldlen);
 	dirp = (struct lfs_direct *) (((char *) dirp) + oldlen);
-	dirp->d_ino = idesc->id_parent;	/* ino to be entered is in id_parent */
-	dirp->d_reclen = newent.d_reclen;
+	/* ino to be entered is in id_parent */
+	lfs_dir_setino(fs, dirp, idesc->id_parent);
+	lfs_dir_setreclen(fs, dirp, lfs_dir_getreclen(fs, &newent));
 	lfs_dir_settype(fs, dirp, typemap[idesc->id_parent]);
 	lfs_dir_setnamlen(fs, dirp, namlen);
 	memcpy(dirp->d_name, idesc->id_name, (size_t)namlen + 1);
@@ -400,7 +402,7 @@ chgino(struct inodesc *idesc)
 	namlen = lfs_dir_getnamlen(fs, dirp);
 	if (memcmp(dirp->d_name, idesc->id_name, namlen + 1))
 		return (KEEPON);
-	dirp->d_ino = idesc->id_parent;
+	lfs_dir_setino(fs, dirp, idesc->id_parent);
 	lfs_dir_settype(fs, dirp, typemap[idesc->id_parent]);
 	return (ALTERED | STOP);
 }

Index: src/sbin/fsck_lfs/inode.c
diff -u src/sbin/fsck_lfs/inode.c:1.63 src/sbin/fsck_lfs/inode.c:1.64
--- src/sbin/fsck_lfs/inode.c:1.63	Tue Sep  1 06:16:58 2015
+++ src/sbin/fsck_lfs/inode.c	Tue Sep 15 14:58:05 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: inode.c,v 1.63 2015/09/01 06:16:58 dholland Exp $	 */
+/* $NetBSD: inode.c,v 1.64 2015/09/15 14:58:05 dholland Exp $	 */
 
 /*-
  * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
@@ -505,7 +505,7 @@ findname(struct inodesc * idesc)
 	size_t len;
 	char *buf;
 
-	if (dirp->d_ino != idesc->id_parent)
+	if (lfs_dir_getino(fs, dirp) != idesc->id_parent)
 		return (KEEPON);
 	len = lfs_dir_getnamlen(fs, dirp) + 1;
 	/* XXX this is wrong: namlen+1 can be up to MAXPATHLEN+1 */
@@ -524,12 +524,14 @@ int
 findino(struct inodesc * idesc)
 {
 	struct lfs_direct *dirp = idesc->id_dirp;
+	ino_t ino;
 
-	if (dirp->d_ino == 0)
+	ino = lfs_dir_getino(fs, dirp);
+	if (ino == 0)
 		return (KEEPON);
 	if (strcmp(dirp->d_name, idesc->id_name) == 0 &&
-	    dirp->d_ino >= ULFS_ROOTINO && dirp->d_ino < maxino) {
-		idesc->id_parent = dirp->d_ino;
+	    ino >= ULFS_ROOTINO && ino < maxino) {
+		idesc->id_parent = ino;
 		return (STOP | FOUND);
 	}
 	return (KEEPON);

Index: src/sbin/fsck_lfs/pass2.c
diff -u src/sbin/fsck_lfs/pass2.c:1.27 src/sbin/fsck_lfs/pass2.c:1.28
--- src/sbin/fsck_lfs/pass2.c:1.27	Tue Sep  1 06:16:58 2015
+++ src/sbin/fsck_lfs/pass2.c	Tue Sep 15 14:58:05 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: pass2.c,v 1.27 2015/09/01 06:16:58 dholland Exp $	 */
+/* $NetBSD: pass2.c,v 1.28 2015/09/15 14:58:05 dholland Exp $	 */
 
 /*
  * Copyright (c) 1980, 1986, 1993
@@ -226,11 +226,11 @@ pass2check(struct inodesc * idesc)
 	 */
 	if (idesc->id_entryno != 0)
 		goto chk1;
-	if (dirp->d_ino != 0 && strcmp(dirp->d_name, ".") == 0) {
-		if (dirp->d_ino != idesc->id_number) {
+	if (lfs_dir_getino(fs, dirp) != 0 && strcmp(dirp->d_name, ".") == 0) {
+		if (lfs_dir_getino(fs, dirp) != idesc->id_number) {
 			direrror(idesc->id_number, "BAD INODE NUMBER FOR '.'");
 			if (reply("FIX") == 1) {
-				dirp->d_ino = idesc->id_number;
+				lfs_dir_setino(fs, dirp, idesc->id_number);
 				ret |= ALTERED;
 			}
 		}
@@ -244,30 +244,30 @@ pass2check(struct inodesc * idesc)
 		goto chk1;
 	}
 	direrror(idesc->id_number, "MISSING '.'");
-	proto.d_ino = idesc->id_number;
+	lfs_dir_setino(fs, &proto, idesc->id_number);
 	lfs_dir_settype(fs, &proto, LFS_DT_DIR);
 	lfs_dir_setnamlen(fs, &proto, 1);
 	(void) strlcpy(proto.d_name, ".", sizeof(proto.d_name));
 	entrysize = LFS_DIRSIZ(fs, &proto);
-	if (dirp->d_ino != 0 && strcmp(dirp->d_name, "..") != 0) {
+	if (lfs_dir_getino(fs, dirp) != 0 && strcmp(dirp->d_name, "..") != 0) {
 		pfatal("CANNOT FIX, FIRST ENTRY IN DIRECTORY CONTAINS %s\n",
 		    dirp->d_name);
-	} else if (dirp->d_reclen < entrysize) {
+	} else if (lfs_dir_getreclen(fs, dirp) < entrysize) {
 		pfatal("CANNOT FIX, INSUFFICIENT SPACE TO ADD '.'\n");
-	} else if (dirp->d_reclen < 2 * entrysize) {
-		proto.d_reclen = dirp->d_reclen;
+	} else if (lfs_dir_getreclen(fs, dirp) < 2 * entrysize) {
+		lfs_dir_setreclen(fs, &proto, lfs_dir_getreclen(fs, dirp));
 		memcpy(dirp, &proto, (size_t) entrysize);
 		if (reply("FIX") == 1)
 			ret |= ALTERED;
 	} else {
-		n = dirp->d_reclen - entrysize;
-		proto.d_reclen = entrysize;
+		n = lfs_dir_getreclen(fs, dirp) - entrysize;
+		lfs_dir_setreclen(fs, &proto, entrysize);
 		memcpy(dirp, &proto, (size_t) entrysize);
 		idesc->id_entryno++;
-		lncntp[dirp->d_ino]--;
+		lncntp[lfs_dir_getino(fs, dirp)]--;
 		dirp = (struct lfs_direct *) ((char *) (dirp) + entrysize);
 		memset(dirp, 0, (size_t) n);
-		dirp->d_reclen = n;
+		lfs_dir_setreclen(fs, dirp, n);
 		if (reply("FIX") == 1)
 			ret |= ALTERED;
 	}
@@ -275,25 +275,25 @@ chk1:
 	if (idesc->id_entryno > 1)
 		goto chk2;
 	inp = getinoinfo(idesc->id_number);
-	proto.d_ino = inp->i_parent;
+	lfs_dir_setino(fs, &proto, inp->i_parent);
 	lfs_dir_settype(fs, &proto, LFS_DT_DIR);
 	lfs_dir_setnamlen(fs, &proto, 2);
 	(void) strlcpy(proto.d_name, "..", sizeof(proto.d_name));
 	entrysize = LFS_DIRSIZ(fs, &proto);
 	if (idesc->id_entryno == 0) {
 		n = LFS_DIRSIZ(fs, dirp);
-		if (dirp->d_reclen < n + entrysize)
+		if (lfs_dir_getreclen(fs, dirp) < n + entrysize)
 			goto chk2;
-		proto.d_reclen = dirp->d_reclen - n;
-		dirp->d_reclen = n;
+		lfs_dir_setreclen(fs, &proto, lfs_dir_getreclen(fs, dirp) - n);
+		lfs_dir_setreclen(fs, dirp, n);
 		idesc->id_entryno++;
-		lncntp[dirp->d_ino]--;
+		lncntp[lfs_dir_getino(fs, dirp)]--;
 		dirp = (struct lfs_direct *) ((char *) (dirp) + n);
-		memset(dirp, 0, (size_t) proto.d_reclen);
-		dirp->d_reclen = proto.d_reclen;
+		memset(dirp, 0, lfs_dir_getreclen(fs, &proto));
+		lfs_dir_setreclen(fs, dirp, lfs_dir_getreclen(fs, &proto));
 	}
-	if (dirp->d_ino != 0 && strcmp(dirp->d_name, "..") == 0) {
-		inp->i_dotdot = dirp->d_ino;
+	if (lfs_dir_getino(fs, dirp) != 0 && strcmp(dirp->d_name, "..") == 0) {
+		inp->i_dotdot = lfs_dir_getino(fs, dirp);
 		if (lfs_dir_gettype(fs, dirp) != LFS_DT_DIR) {
 			direrror(idesc->id_number, "BAD TYPE VALUE FOR '..'");
 			lfs_dir_settype(fs, dirp, LFS_DT_DIR);
@@ -302,12 +302,12 @@ chk1:
 		}
 		goto chk2;
 	}
-	if (dirp->d_ino != 0 && strcmp(dirp->d_name, ".") != 0) {
+	if (lfs_dir_getino(fs, dirp) != 0 && strcmp(dirp->d_name, ".") != 0) {
 		fileerror(inp->i_parent, idesc->id_number, "MISSING '..'");
 		pfatal("CANNOT FIX, SECOND ENTRY IN DIRECTORY CONTAINS %s\n",
 		    dirp->d_name);
 		inp->i_dotdot = (ino_t) - 1;
-	} else if (dirp->d_reclen < entrysize) {
+	} else if (lfs_dir_getreclen(fs, dirp) < entrysize) {
 		fileerror(inp->i_parent, idesc->id_number, "MISSING '..'");
 		pfatal("CANNOT FIX, INSUFFICIENT SPACE TO ADD '..'\n");
 		inp->i_dotdot = (ino_t) - 1;
@@ -317,17 +317,17 @@ chk1:
 		 */
 		inp->i_dotdot = inp->i_parent;
 		fileerror(inp->i_parent, idesc->id_number, "MISSING '..'");
-		proto.d_reclen = dirp->d_reclen;
+		lfs_dir_setreclen(fs, &proto, lfs_dir_getreclen(fs, dirp));
 		memcpy(dirp, &proto, (size_t) entrysize);
 		if (reply("FIX") == 1)
 			ret |= ALTERED;
 	}
 	idesc->id_entryno++;
-	if (dirp->d_ino != 0)
-		lncntp[dirp->d_ino]--;
+	if (lfs_dir_getino(fs, dirp) != 0)
+		lncntp[lfs_dir_getino(fs, dirp)]--;
 	return (ret | KEEPON);
 chk2:
-	if (dirp->d_ino == 0)
+	if (lfs_dir_getino(fs, dirp) == 0)
 		return (ret | KEEPON);
 	if (lfs_dir_getnamlen(fs, dirp) <= 2 &&
 	    dirp->d_name[0] == '.' &&
@@ -335,7 +335,7 @@ chk2:
 		if (lfs_dir_getnamlen(fs, dirp) == 1) {
 			direrror(idesc->id_number, "EXTRA '.' ENTRY");
 			if (reply("FIX") == 1) {
-				dirp->d_ino = 0;
+				lfs_dir_setino(fs, dirp, 0);
 				ret |= ALTERED;
 			}
 			return (KEEPON | ret);
@@ -343,7 +343,7 @@ chk2:
 		if (dirp->d_name[1] == '.') {
 			direrror(idesc->id_number, "EXTRA '..' ENTRY");
 			if (reply("FIX") == 1) {
-				dirp->d_ino = 0;
+				lfs_dir_setino(fs, dirp, 0);
 				ret |= ALTERED;
 			}
 			return (KEEPON | ret);
@@ -351,34 +351,35 @@ chk2:
 	}
 	idesc->id_entryno++;
 	n = 0;
-	if (dirp->d_ino >= maxino) {
-		fileerror(idesc->id_number, dirp->d_ino, "I OUT OF RANGE");
+	if (lfs_dir_getino(fs, dirp) >= maxino) {
+		fileerror(idesc->id_number, lfs_dir_getino(fs, dirp), "I OUT OF RANGE");
 		n = reply("REMOVE");
-	} else if (dirp->d_ino == LFS_IFILE_INUM &&
+	} else if (lfs_dir_getino(fs, dirp) == LFS_IFILE_INUM &&
 	    idesc->id_number == ULFS_ROOTINO) {
 		if (lfs_dir_gettype(fs, dirp) != LFS_DT_REG) {
-			fileerror(idesc->id_number, dirp->d_ino,
+			fileerror(idesc->id_number, lfs_dir_getino(fs, dirp),
 			    "BAD TYPE FOR IFILE");
 			if (reply("FIX") == 1) {
 				lfs_dir_settype(fs, dirp, LFS_DT_REG);
 				ret |= ALTERED;
 			}
 		}
-	} else if (((dirp->d_ino == ULFS_WINO && lfs_dir_gettype(fs, dirp) != LFS_DT_WHT) ||
-		(dirp->d_ino != ULFS_WINO && lfs_dir_gettype(fs, dirp) == LFS_DT_WHT))) {
-		fileerror(idesc->id_number, dirp->d_ino, "BAD WHITEOUT ENTRY");
-		dirp->d_ino = ULFS_WINO;
+	} else if (((lfs_dir_getino(fs, dirp) == ULFS_WINO && lfs_dir_gettype(fs, dirp) != LFS_DT_WHT) ||
+		(lfs_dir_getino(fs, dirp) != ULFS_WINO && lfs_dir_gettype(fs, dirp) == LFS_DT_WHT))) {
+		fileerror(idesc->id_number, lfs_dir_getino(fs, dirp), "BAD WHITEOUT ENTRY");
 		if (reply("FIX") == 1) {
+			lfs_dir_setino(fs, dirp, ULFS_WINO);
 			lfs_dir_settype(fs, dirp, LFS_DT_WHT);
 			ret |= ALTERED;
 		}
 	} else {
 again:
-		switch (statemap[dirp->d_ino]) {
+		switch (statemap[lfs_dir_getino(fs, dirp)]) {
 		case USTATE:
 			if (idesc->id_entryno <= 2)
 				break;
-			fileerror(idesc->id_number, dirp->d_ino, "UNALLOCATED");
+			fileerror(idesc->id_number, lfs_dir_getino(fs, dirp),
+			    "UNALLOCATED");
 			n = reply("REMOVE");
 			break;
 
@@ -386,7 +387,7 @@ again:
 		case FCLEAR:
 			if (idesc->id_entryno <= 2)
 				break;
-			if (statemap[dirp->d_ino] == FCLEAR)
+			if (statemap[lfs_dir_getino(fs, dirp)] == FCLEAR)
 				errmsg = "DUP/BAD";
 			else if (!preen)
 				errmsg = "ZERO LENGTH DIRECTORY";
@@ -394,23 +395,24 @@ again:
 				n = 1;
 				break;
 			}
-			fileerror(idesc->id_number, dirp->d_ino, errmsg);
+			fileerror(idesc->id_number, lfs_dir_getino(fs, dirp), errmsg);
 			if ((n = reply("REMOVE")) == 1)
 				break;
-			dp = ginode(dirp->d_ino);
-			statemap[dirp->d_ino] =
+			dp = ginode(lfs_dir_getino(fs, dirp));
+			statemap[lfs_dir_getino(fs, dirp)] =
 			    (lfs_dino_getmode(fs, dp) & LFS_IFMT) == LFS_IFDIR ? DSTATE : FSTATE;
-			lncntp[dirp->d_ino] = lfs_dino_getnlink(fs, dp);
+			lncntp[lfs_dir_getino(fs, dirp)] = lfs_dino_getnlink(fs, dp);
 			goto again;
 
 		case DSTATE:
 		case DFOUND:
-			inp = getinoinfo(dirp->d_ino);
+			inp = getinoinfo(lfs_dir_getino(fs, dirp));
 			if (inp->i_parent != 0 && idesc->id_entryno > 2) {
 				getpathname(pathbuf, sizeof(pathbuf),
 				    idesc->id_number, idesc->id_number);
 				getpathname(namebuf, sizeof(namebuf),
-				    dirp->d_ino, dirp->d_ino);
+				    lfs_dir_getino(fs, dirp),
+				    lfs_dir_getino(fs, dirp));
 				pwarn("%s %s %s\n", pathbuf,
 				    "IS AN EXTRANEOUS HARD LINK TO DIRECTORY",
 				    namebuf);
@@ -424,27 +426,29 @@ again:
 			/* fall through */
 
 		case FSTATE:
-			if (lfs_dir_gettype(fs, dirp) != typemap[dirp->d_ino]) {
-				fileerror(idesc->id_number, dirp->d_ino,
+			if (lfs_dir_gettype(fs, dirp) != typemap[lfs_dir_getino(fs, dirp)]) {
+				fileerror(idesc->id_number,
+				    lfs_dir_getino(fs, dirp),
 				    "BAD TYPE VALUE");
 				if (debug)
 					pwarn("dir has %d, typemap has %d\n",
-						lfs_dir_gettype(fs, dirp), typemap[dirp->d_ino]);
-				lfs_dir_settype(fs, dirp, typemap[dirp->d_ino]);
+						lfs_dir_gettype(fs, dirp), typemap[lfs_dir_getino(fs, dirp)]);
+				lfs_dir_settype(fs, dirp, typemap[lfs_dir_getino(fs, dirp)]);
 				if (reply("FIX") == 1)
 					ret |= ALTERED;
 			}
-			lncntp[dirp->d_ino]--;
+			lncntp[lfs_dir_getino(fs, dirp)]--;
 			break;
 
 		default:
-			errx(EEXIT, "BAD STATE %d FOR INODE I=%d",
-			    statemap[dirp->d_ino], dirp->d_ino);
+			errx(EEXIT, "BAD STATE %d FOR INODE I=%ju",
+			    statemap[lfs_dir_getino(fs, dirp)],
+			    (uintmax_t)lfs_dir_getino(fs, dirp));
 		}
 	}
 	if (n == 0)
 		return (ret | KEEPON);
-	dirp->d_ino = 0;
+	lfs_dir_setino(fs, dirp, 0);
 	return (ret | KEEPON | ALTERED);
 }
 /*

Index: src/sbin/newfs_lfs/make_lfs.c
diff -u src/sbin/newfs_lfs/make_lfs.c:1.49 src/sbin/newfs_lfs/make_lfs.c:1.50
--- src/sbin/newfs_lfs/make_lfs.c:1.49	Tue Sep  1 06:16:58 2015
+++ src/sbin/newfs_lfs/make_lfs.c	Tue Sep 15 14:58:05 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: make_lfs.c,v 1.49 2015/09/01 06:16:58 dholland Exp $	*/
+/*	$NetBSD: make_lfs.c,v 1.50 2015/09/15 14:58:05 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.49 2015/09/01 06:16:58 dholland Exp $");
+__RCSID("$NetBSD: make_lfs.c,v 1.50 2015/09/15 14:58:05 dholland Exp $");
 #endif
 #endif /* not lint */
 
@@ -389,16 +389,18 @@ make_dir(struct lfs *fs, void *bufp, str
 {
 	char *cp;
 	int i, spcleft;
+	unsigned reclen;
 
 	spcleft = LFS_DIRBLKSIZ;
 	for (cp = bufp, i = 0; i < entries - 1; i++) {
-		protodir[i].d_reclen = LFS_DIRSIZ(fs, &protodir[i]);
-		memmove(cp, &protodir[i], protodir[i].d_reclen);
-		cp += protodir[i].d_reclen;
-		if ((spcleft -= protodir[i].d_reclen) < 0)
+		reclen = LFS_DIRSIZ(fs, &protodir[i]);
+		lfs_dir_setreclen(fs, &protodir[i], reclen);
+		memmove(cp, &protodir[i], lfs_dir_getreclen(fs, &protodir[i]));
+		cp += reclen;
+		if ((spcleft -= reclen) < 0)
 			fatal("%s: %s", special, "directory too big");
 	}
-	protodir[i].d_reclen = spcleft;
+	lfs_dir_setreclen(fs, &protodir[i], spcleft);
 	memmove(cp, &protodir[i], LFS_DIRSIZ(fs, &protodir[i]));
 }
 

Index: src/sys/ufs/lfs/lfs.h
diff -u src/sys/ufs/lfs/lfs.h:1.185 src/sys/ufs/lfs/lfs.h:1.186
--- src/sys/ufs/lfs/lfs.h:1.185	Tue Sep  1 06:16:59 2015
+++ src/sys/ufs/lfs/lfs.h	Tue Sep 15 14:58:06 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs.h,v 1.185 2015/09/01 06:16:59 dholland Exp $	*/
+/*	$NetBSD: lfs.h,v 1.186 2015/09/15 14:58:06 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  */
@@ -365,15 +365,24 @@
 /*
  * (See notes above)
  */
-#define d_ino d_fileno
 struct lfs_direct {
-	u_int32_t d_fileno;		/* inode number of entry */
+	u_int32_t d_ino;		/* inode number of entry */
 	u_int16_t d_reclen;		/* length of this record */
 	u_int8_t  d_type; 		/* file type, see below */
 	u_int8_t  d_namlen;		/* length of string in d_name */
 	char	  d_name[LFS_MAXNAMLEN + 1];/* name with length <= LFS_MAXNAMLEN */
 };
 
+/* Note that this does *not* byteswap and should probably be phased out */
+#define LFS_DIRECT_INITIALIZER(ino, type, namlen, name) \
+	{							\
+		.d_ino = (ino),					\
+		.d_reclen = LFS_DIRECTSIZE(namlen),		\
+		.d_type = (type),				\
+		.d_namlen = (namlen),				\
+		.d_name = (name)				\
+	}
+
 /*
  * Template for manipulating directories.  Should use struct lfs_direct's,
  * but the name field is LFS_MAXNAMLEN - 1, and this just won't do.

Index: src/sys/ufs/lfs/lfs_accessors.h
diff -u src/sys/ufs/lfs/lfs_accessors.h:1.22 src/sys/ufs/lfs/lfs_accessors.h:1.23
--- src/sys/ufs/lfs/lfs_accessors.h:1.22	Tue Sep  1 06:16:59 2015
+++ src/sys/ufs/lfs/lfs_accessors.h	Tue Sep 15 14:58:06 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_accessors.h,v 1.22 2015/09/01 06:16:59 dholland Exp $	*/
+/*	$NetBSD: lfs_accessors.h,v 1.23 2015/09/15 14:58:06 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  */
@@ -241,6 +241,21 @@
 #define LFS_OLDDIRFMT	1
 #define LFS_NEWDIRFMT	0
 
+#define LFS_NEXTDIR(fs, dp) \
+	((struct lfs_direct *)((char *)(dp) + lfs_dir_getreclen(fs, dp)))
+
+static __unused inline uint32_t
+lfs_dir_getino(const STRUCT_LFS *fs, const struct lfs_direct *dp)
+{
+	return LFS_SWAP_uint32_t(fs, dp->d_ino);
+}
+
+static __unused inline uint16_t
+lfs_dir_getreclen(const STRUCT_LFS *fs, const struct lfs_direct *dp)
+{
+	return LFS_SWAP_uint16_t(fs, dp->d_reclen);
+}
+
 static __unused inline uint8_t
 lfs_dir_gettype(const STRUCT_LFS *fs, const struct lfs_direct *dp)
 {
@@ -261,6 +276,18 @@ lfs_dir_getnamlen(const STRUCT_LFS *fs, 
 }
 
 static __unused inline void
+lfs_dir_setino(STRUCT_LFS *fs, struct lfs_direct *dp, uint32_t ino)
+{
+	dp->d_ino = LFS_SWAP_uint32_t(fs, ino);
+}
+
+static __unused inline void
+lfs_dir_setreclen(STRUCT_LFS *fs, struct lfs_direct *dp, uint16_t reclen)
+{
+	dp->d_reclen = LFS_SWAP_uint16_t(fs, reclen);
+}
+
+static __unused inline void
 lfs_dir_settype(const STRUCT_LFS *fs, struct lfs_direct *dp, uint8_t type)
 {
 	if (fs->lfs_hasolddirfmt) {

Index: src/sys/ufs/lfs/lfs_rename.c
diff -u src/sys/ufs/lfs/lfs_rename.c:1.9 src/sys/ufs/lfs/lfs_rename.c:1.10
--- src/sys/ufs/lfs/lfs_rename.c:1.9	Tue Sep  1 06:16:59 2015
+++ src/sys/ufs/lfs/lfs_rename.c	Tue Sep 15 14:58:06 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_rename.c,v 1.9 2015/09/01 06:16:59 dholland Exp $	*/
+/*	$NetBSD: lfs_rename.c,v 1.10 2015/09/15 14:58:06 dholland Exp $	*/
 /*  from NetBSD: ufs_rename.c,v 1.6 2013/01/22 09:39:18 dholland Exp  */
 
 /*-
@@ -89,7 +89,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lfs_rename.c,v 1.9 2015/09/01 06:16:59 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_rename.c,v 1.10 2015/09/15 14:58:06 dholland Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -355,7 +355,6 @@ ulfs_rename_recalculate_fulr(struct vnod
 	struct mount *mp;
 	struct lfs *fs;
 	struct ulfsmount *ump;
-	int needswap;
 	/* XXX int is a silly type for this; blame ulfsmount::um_dirblksiz.  */
 	int dirblksiz;
 	doff_t search_start, search_end;
@@ -384,8 +383,6 @@ ulfs_rename_recalculate_fulr(struct vnod
 	KASSERT(ump == VTOI(dvp)->i_ump);
 	KASSERT(fs == VTOI(dvp)->i_lfs);
 
-	needswap = ULFS_MPNEEDSWAP(fs);
-
 	dirblksiz = fs->um_dirblksiz;
 	KASSERT(0 < dirblksiz);
 	KASSERT((dirblksiz & (dirblksiz - 1)) == 0);
@@ -434,12 +431,12 @@ ulfs_rename_recalculate_fulr(struct vnod
 		 * Examine the directory entry at offset.
 		 */
 		ep = (struct lfs_direct *)(dirbuf + (offset - search_start));
-		reclen = ulfs_rw16(ep->d_reclen, needswap);
+		reclen = lfs_dir_getreclen(fs, ep);
 
-		if (ep->d_ino == 0)
+		if (lfs_dir_getino(fs, ep) == 0)
 			goto next;	/* Entry is unused.  */
 
-		if (ulfs_rw32(ep->d_ino, needswap) == ULFS_WINO)
+		if (lfs_dir_getino(fs, ep) == ULFS_WINO)
 			goto next;	/* Entry is whiteout.  */
 
 		if (fcnp->cn_namelen != ulfs_direct_namlen(ep, dvp))
Index: src/sys/ufs/lfs/ulfs_dirhash.c
diff -u src/sys/ufs/lfs/ulfs_dirhash.c:1.9 src/sys/ufs/lfs/ulfs_dirhash.c:1.10
--- src/sys/ufs/lfs/ulfs_dirhash.c:1.9	Tue Sep  1 06:16:59 2015
+++ src/sys/ufs/lfs/ulfs_dirhash.c	Tue Sep 15 14:58:06 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: ulfs_dirhash.c,v 1.9 2015/09/01 06:16:59 dholland Exp $	*/
+/*	$NetBSD: ulfs_dirhash.c,v 1.10 2015/09/15 14:58:06 dholland Exp $	*/
 /*  from NetBSD: ufs_dirhash.c,v 1.34 2009/10/05 23:48:08 rmind Exp  */
 
 /*
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ulfs_dirhash.c,v 1.9 2015/09/01 06:16:59 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ulfs_dirhash.c,v 1.10 2015/09/15 14:58:06 dholland Exp $");
 
 /*
  * This implements a hash-based lookup scheme for ULFS directories.
@@ -73,8 +73,8 @@ static void ulfsdirhash_adjfree(struct d
 static void ulfsdirhash_delslot(struct dirhash *dh, int slot);
 static int ulfsdirhash_findslot(struct dirhash *dh, const char *name,
 	   int namelen, doff_t offset);
-static doff_t ulfsdirhash_getprev(struct lfs_direct *dp, doff_t offset,
-	   int dirblksiz);
+static doff_t ulfsdirhash_getprev(struct lfs *fs, struct lfs_direct *dp,
+	   doff_t offset, int dirblksiz);
 static int ulfsdirhash_recycle(int wanted);
 
 static pool_cache_t ulfsdirhashblk_cache;
@@ -228,13 +228,13 @@ ulfsdirhash_build(struct inode *ip)
 
 		/* Add this entry to the hash. */
 		ep = (struct lfs_direct *)((char *)bp->b_data + (pos & bmask));
-		if (ep->d_reclen == 0 || ep->d_reclen >
+		if (lfs_dir_getreclen(fs, ep) == 0 || lfs_dir_getreclen(fs, ep) >
 		    dirblksiz - (pos & (dirblksiz - 1))) {
 			/* Corrupted directory. */
 			brelse(bp, 0);
 			goto fail;
 		}
-		if (ep->d_ino != 0) {
+		if (lfs_dir_getino(fs, ep) != 0) {
 			/* Add the entry (simplified ulfsdirhash_add). */
 			slot = ulfsdirhash_hash(dh, ep->d_name,
 						lfs_dir_getnamlen(fs, ep));
@@ -245,7 +245,7 @@ ulfsdirhash_build(struct inode *ip)
 			ulfsdirhash_adjfree(dh, pos, -LFS_DIRSIZ(fs, ep),
 			    dirblksiz);
 		}
-		pos += ep->d_reclen;
+		pos += lfs_dir_getreclen(fs, ep);
 	}
 
 	if (bp != NULL)
@@ -425,7 +425,7 @@ restart:
 			}
 		}
 		dp = (struct lfs_direct *)((char *)bp->b_data + (offset & bmask));
-		if (dp->d_reclen == 0 || dp->d_reclen >
+		if (lfs_dir_getreclen(fs, dp) == 0 || lfs_dir_getreclen(fs, dp) >
 		    dirblksiz - (offset & (dirblksiz - 1))) {
 			/* Corrupted directory. */
 			DIRHASH_UNLOCK(dh);
@@ -437,7 +437,7 @@ restart:
 			/* Found. Get the prev offset if needed. */
 			if (prevoffp != NULL) {
 				if (offset & (dirblksiz - 1)) {
-					prevoff = ulfsdirhash_getprev(dp,
+					prevoff = ulfsdirhash_getprev(fs, dp,
 					    offset, dirblksiz);
 					if (prevoff == -1) {
 						brelse(bp, 0);
@@ -538,15 +538,15 @@ ulfsdirhash_findfree(struct inode *ip, i
 	}
 	/* Find the first entry with free space. */
 	for (i = 0; i < dirblksiz; ) {
-		if (dp->d_reclen == 0) {
+		if (lfs_dir_getreclen(fs, dp) == 0) {
 			DIRHASH_UNLOCK(dh);
 			brelse(bp, 0);
 			return (-1);
 		}
-		if (dp->d_ino == 0 || dp->d_reclen > LFS_DIRSIZ(fs, dp))
+		if (lfs_dir_getino(fs, dp) == 0 || lfs_dir_getreclen(fs, dp) > LFS_DIRSIZ(fs, dp))
 			break;
-		i += dp->d_reclen;
-		dp = (struct lfs_direct *)((char *)dp + dp->d_reclen);
+		i += lfs_dir_getreclen(fs, dp);
+		dp = LFS_NEXTDIR(fs, dp);
 	}
 	if (i > dirblksiz) {
 		DIRHASH_UNLOCK(dh);
@@ -558,16 +558,16 @@ ulfsdirhash_findfree(struct inode *ip, i
 	/* Find the range of entries needed to get enough space */
 	freebytes = 0;
 	while (i < dirblksiz && freebytes < slotneeded) {
-		freebytes += dp->d_reclen;
-		if (dp->d_ino != 0)
+		freebytes += lfs_dir_getreclen(fs, dp);
+		if (lfs_dir_getino(fs, dp) != 0)
 			freebytes -= LFS_DIRSIZ(fs, dp);
-		if (dp->d_reclen == 0) {
+		if (lfs_dir_getreclen(fs, dp) == 0) {
 			DIRHASH_UNLOCK(dh);
 			brelse(bp, 0);
 			return (-1);
 		}
-		i += dp->d_reclen;
-		dp = (struct lfs_direct *)((char *)dp + dp->d_reclen);
+		i += lfs_dir_getreclen(fs, dp);
+		dp = LFS_NEXTDIR(fs, dp);
 	}
 	if (i > dirblksiz) {
 		DIRHASH_UNLOCK(dh);
@@ -851,12 +851,12 @@ ulfsdirhash_checkblock(struct inode *ip,
 		panic("ulfsdirhash_checkblock: bad offset");
 
 	nfree = 0;
-	for (i = 0; i < dirblksiz; i += dp->d_reclen) {
+	for (i = 0; i < dirblksiz; i += lfs_dir_getreclen(fs, dp)) {
 		dp = (struct lfs_direct *)(sbuf + i);
-		if (dp->d_reclen == 0 || i + dp->d_reclen > dirblksiz)
+		if (lfs_dir_getreclen(fs, dp) == 0 || i + lfs_dir_getreclen(fs, dp) > dirblksiz)
 			panic("ulfsdirhash_checkblock: bad dir");
 
-		if (dp->d_ino == 0) {
+		if (lfs_dir_getino(fs, dp) == 0) {
 #if 0
 			/*
 			 * XXX entries with d_ino == 0 should only occur
@@ -867,7 +867,7 @@ ulfsdirhash_checkblock(struct inode *ip,
 			if (i != 0)
 				panic("ulfsdirhash_checkblock: bad dir inode");
 #endif
-			nfree += dp->d_reclen;
+			nfree += lfs_dir_getreclen(fs, dp);
 			continue;
 		}
 
@@ -875,7 +875,7 @@ ulfsdirhash_checkblock(struct inode *ip,
 		ulfsdirhash_findslot(dh, dp->d_name, lfs_dir_getnamlen(fs, dp),
 				     offset + i);
 
-		nfree += dp->d_reclen - LFS_DIRSIZ(fs, dp);
+		nfree += lfs_dir_getreclen(fs, dp) - LFS_DIRSIZ(fs, dp);
 	}
 	if (i != dirblksiz)
 		panic("ulfsdirhash_checkblock: bad dir end");
@@ -1012,12 +1012,14 @@ ulfsdirhash_delslot(struct dirhash *dh, 
  * other problem occurred.
  */
 static doff_t
-ulfsdirhash_getprev(struct lfs_direct *dirp, doff_t offset, int dirblksiz)
+ulfsdirhash_getprev(struct lfs *fs, struct lfs_direct *dirp,
+		doff_t offset, int dirblksiz)
 {
 	struct lfs_direct *dp;
 	char *blkbuf;
 	doff_t blkoff, prevoff;
 	int entrypos, i;
+	unsigned reclen;
 
 	blkoff = offset & ~(dirblksiz - 1);	/* offset of start of block */
 	entrypos = offset & (dirblksiz - 1);	/* entry relative to block */
@@ -1029,9 +1031,10 @@ ulfsdirhash_getprev(struct lfs_direct *d
 		return (-1);
 
 	/* Scan from the start of the block until we get to the entry. */
-	for (i = 0; i < entrypos; i += dp->d_reclen) {
+	for (i = 0; i < entrypos; i += reclen) {
 		dp = (struct lfs_direct *)(blkbuf + i);
-		if (dp->d_reclen == 0 || i + dp->d_reclen > entrypos)
+		reclen = lfs_dir_getreclen(fs, dp);
+		if (reclen == 0 || i + reclen > entrypos)
 			return (-1);	/* Corrupted directory. */
 		prevoff = blkoff + i;
 	}

Index: src/sys/ufs/lfs/ulfs_lookup.c
diff -u src/sys/ufs/lfs/ulfs_lookup.c:1.26 src/sys/ufs/lfs/ulfs_lookup.c:1.27
--- src/sys/ufs/lfs/ulfs_lookup.c:1.26	Tue Sep  1 06:16:59 2015
+++ src/sys/ufs/lfs/ulfs_lookup.c	Tue Sep 15 14:58:06 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: ulfs_lookup.c,v 1.26 2015/09/01 06:16:59 dholland Exp $	*/
+/*	$NetBSD: ulfs_lookup.c,v 1.27 2015/09/15 14:58:06 dholland Exp $	*/
 /*  from NetBSD: ufs_lookup.c,v 1.122 2013/01/22 09:39:18 dholland Exp  */
 
 /*
@@ -38,7 +38,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ulfs_lookup.c,v 1.26 2015/09/01 06:16:59 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ulfs_lookup.c,v 1.27 2015/09/15 14:58:06 dholland Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_lfs.h"
@@ -151,7 +151,6 @@ ulfs_lookup(void *v)
 	int flags;
 	int nameiop = cnp->cn_nameiop;
 	struct lfs *fs = dp->i_lfs;
-	const int needswap = ULFS_MPNEEDSWAP(fs);
 	int dirblksiz = fs->um_dirblksiz;
 	ino_t foundino;
 	struct ulfs_lookup_results *results;
@@ -329,7 +328,7 @@ searchloop:
 		 */
 		KASSERT(bp != NULL);
 		ep = (struct lfs_direct *)((char *)bp->b_data + entryoffsetinblock);
-		if (ep->d_reclen == 0 ||
+		if (lfs_dir_getreclen(fs, ep) == 0 ||
 		    (lfs_dirchk && ulfs_dirbadentry(vdp, ep, entryoffsetinblock))) {
 			int i;
 
@@ -347,16 +346,15 @@ searchloop:
 		 * compaction is viable.
 		 */
 		if (slotstatus != FOUND) {
-			int size = ulfs_rw16(ep->d_reclen, needswap);
+			int size = lfs_dir_getreclen(fs, ep);
 
-			if (ep->d_ino != 0)
+			if (lfs_dir_getino(fs, ep) != 0)
 				size -= LFS_DIRSIZ(fs, ep);
 			if (size > 0) {
 				if (size >= slotneeded) {
 					slotstatus = FOUND;
 					slotoffset = results->ulr_offset;
-					slotsize = ulfs_rw16(ep->d_reclen,
-					    needswap);
+					slotsize = lfs_dir_getreclen(fs, ep);
 				} else if (slotstatus == NONE) {
 					slotfreespace += size;
 					if (slotoffset == -1)
@@ -364,8 +362,7 @@ searchloop:
 					if (slotfreespace >= slotneeded) {
 						slotstatus = COMPACT;
 						slotsize = results->ulr_offset +
-						    ulfs_rw16(ep->d_reclen,
-							     needswap) -
+						    lfs_dir_getreclen(fs, ep) -
 						    slotoffset;
 					}
 				}
@@ -375,7 +372,7 @@ searchloop:
 		/*
 		 * Check for a name match.
 		 */
-		if (ep->d_ino) {
+		if (lfs_dir_getino(fs, ep)) {
 			int namlen;
 
 			namlen = lfs_dir_getnamlen(fs, ep);
@@ -392,8 +389,7 @@ foundentry:
 				if (!FSFMT(vdp) && lfs_dir_gettype(fs, ep) == LFS_DT_WHT) {
 					slotstatus = FOUND;
 					slotoffset = results->ulr_offset;
-					slotsize = ulfs_rw16(ep->d_reclen,
-					    needswap);
+					slotsize = lfs_dir_getreclen(fs, ep);
 					results->ulr_reclen = slotsize;
 					/*
 					 * This is used to set
@@ -417,16 +413,15 @@ foundentry:
 					numdirpasses--;
 					goto notfound;
 				}
-				foundino = ulfs_rw32(ep->d_ino, needswap);
-				results->ulr_reclen =
-				    ulfs_rw16(ep->d_reclen, needswap);
+				foundino = lfs_dir_getino(fs, ep);
+				results->ulr_reclen = lfs_dir_getreclen(fs, ep);
 				goto found;
 			}
 		}
 		prevoff = results->ulr_offset;
-		results->ulr_offset += ulfs_rw16(ep->d_reclen, needswap);
-		entryoffsetinblock += ulfs_rw16(ep->d_reclen, needswap);
-		if (ep->d_ino)
+		results->ulr_offset += lfs_dir_getreclen(fs, ep);
+		entryoffsetinblock += lfs_dir_getreclen(fs, ep);
+		if (lfs_dir_getino(fs, ep))
 			enduseful = results->ulr_offset;
 	}
 notfound:
@@ -666,27 +661,26 @@ ulfs_dirbadentry(struct vnode *dp, struc
 {
 	int i;
 	int namlen;
+	unsigned reclen;
 	struct ulfsmount *ump = VFSTOULFS(dp->v_mount);
 	struct lfs *fs = ump->um_lfs;
-	const int needswap = ULFS_MPNEEDSWAP(fs);
 	int dirblksiz = fs->um_dirblksiz;
 
 	namlen = lfs_dir_getnamlen(fs, ep);
-	if ((ulfs_rw16(ep->d_reclen, needswap) & 0x3) != 0 ||
-	    ulfs_rw16(ep->d_reclen, needswap) >
-		dirblksiz - (entryoffsetinblock & (dirblksiz - 1)) ||
-	    ulfs_rw16(ep->d_reclen, needswap) <	LFS_DIRSIZ(fs, ep) ||
-	    namlen > LFS_MAXNAMLEN) {
+	reclen = lfs_dir_getreclen(fs, ep);
+	if ((reclen & 0x3) != 0 ||
+	    reclen > dirblksiz - (entryoffsetinblock & (dirblksiz - 1)) ||
+	    reclen < LFS_DIRSIZ(fs, ep) || namlen > LFS_MAXNAMLEN) {
 		/*return (1); */
 		printf("First bad, reclen=%#x, DIRSIZ=%lu, namlen=%d, "
 			"flags=%#x, entryoffsetinblock=%d, dirblksiz = %d\n",
-			ulfs_rw16(ep->d_reclen, needswap),
+			lfs_dir_getreclen(fs, ep),
 			(u_long)LFS_DIRSIZ(fs, ep),
 			namlen, dp->v_mount->mnt_flag, entryoffsetinblock,
 			dirblksiz);
 		goto bad;
 	}
-	if (ep->d_ino == 0)
+	if (lfs_dir_getino(fs, ep) == 0)
 		return (0);
 	for (i = 0; i < namlen; i++)
 		if (ep->d_name[i] == '\0') {
@@ -714,7 +708,7 @@ ulfs_makedirentry(struct inode *ip, stru
 {
 	struct lfs *fs = ip->i_lfs;
 
-	newdirp->d_ino = ip->i_number;
+	lfs_dir_setino(fs, newdirp, ip->i_number);
 	memcpy(newdirp->d_name, cnp->cn_nameptr, (size_t)cnp->cn_namelen);
 	newdirp->d_name[cnp->cn_namelen] = '\0';
 	lfs_dir_setnamlen(fs, newdirp, cnp->cn_namelen);
@@ -728,7 +722,7 @@ void
 ulfs_makedirentry_bytype(struct lfs *fs, struct componentname *cnp,
     ino_t inum, unsigned dtype, struct lfs_direct *newdirp)
 {
-	newdirp->d_ino = inum;
+	lfs_dir_setino(fs, newdirp, inum);
 	memcpy(newdirp->d_name, cnp->cn_nameptr, (size_t)cnp->cn_namelen);
 	newdirp->d_name[cnp->cn_namelen] = '\0';
 	lfs_dir_setnamlen(fs, newdirp, cnp->cn_namelen);
@@ -786,7 +780,6 @@ ulfs_direnter(struct vnode *dvp, const s
 	struct timespec ts;
 	struct ulfsmount *ump = VFSTOULFS(dvp->v_mount);
 	struct lfs *fs = ump->um_lfs;
-	const int needswap = ULFS_MPNEEDSWAP(fs);
 	int dirblksiz = fs->um_dirblksiz;
 
 	error = 0;
@@ -812,9 +805,6 @@ ulfs_direnter(struct vnode *dvp, const s
 		DIP_ASSIGN(dp, size, dp->i_size);
 		dp->i_flag |= IN_CHANGE | IN_UPDATE;
 		uvm_vnp_setsize(dvp, dp->i_size);
-		dirp->d_reclen = ulfs_rw16(dirblksiz, needswap);
-		dirp->d_ino = ulfs_rw32(dirp->d_ino, needswap);
-		/* d_type/d_namlen are handled in ulfs_makedirentry */
 		lfs_blkoff = ulr->ulr_offset & (ump->um_mountp->mnt_stat.f_iosize - 1);
 		memcpy((char *)bp->b_data + lfs_blkoff, dirp, newentrysize);
 #ifdef LFS_DIRHASH
@@ -872,20 +862,20 @@ ulfs_direnter(struct vnode *dvp, const s
 	 * ulr_offset + ulr_count would yield the space.
 	 */
 	ep = (struct lfs_direct *)dirbuf;
-	dsize = (ep->d_ino != 0) ? LFS_DIRSIZ(fs, ep) : 0;
-	spacefree = ulfs_rw16(ep->d_reclen, needswap) - dsize;
-	for (loc = ulfs_rw16(ep->d_reclen, needswap); loc < ulr->ulr_count; ) {
+	dsize = (lfs_dir_getino(fs, ep) != 0) ? LFS_DIRSIZ(fs, ep) : 0;
+	spacefree = lfs_dir_getreclen(fs, ep) - dsize;
+	for (loc = lfs_dir_getreclen(fs, ep); loc < ulr->ulr_count; ) {
 		uint16_t reclen;
 
 		nep = (struct lfs_direct *)(dirbuf + loc);
 
 		/* Trim the existing slot (NB: dsize may be zero). */
-		ep->d_reclen = ulfs_rw16(dsize, needswap);
-		ep = (struct lfs_direct *)((char *)ep + dsize);
+		lfs_dir_setreclen(fs, ep, dsize);
+		ep = LFS_NEXTDIR(fs, ep);
 
-		reclen = ulfs_rw16(nep->d_reclen, needswap);
+		reclen = lfs_dir_getreclen(fs, nep);
 		loc += reclen;
-		if (nep->d_ino == 0) {
+		if (lfs_dir_getino(fs, nep) == 0) {
 			/*
 			 * A mid-block unused entry. Such entries are
 			 * never created by the kernel, but fsck_ffs
@@ -895,7 +885,7 @@ ulfs_direnter(struct vnode *dvp, const s
 			 * relocated entry since we don't memcpy it.
 			 */
 			spacefree += reclen;
-			ep->d_ino = 0;
+			lfs_dir_setino(fs, ep, 0);
 			dsize = 0;
 			continue;
 		}
@@ -918,25 +908,23 @@ ulfs_direnter(struct vnode *dvp, const s
 	 * Update the pointer fields in the previous entry (if any),
 	 * copy in the new entry, and write out the block.
 	 */
-	if (ep->d_ino == 0 ||
-	    (ulfs_rw32(ep->d_ino, needswap) == ULFS_WINO &&
+	if (lfs_dir_getino(fs, ep) == 0 ||
+	    (lfs_dir_getino(fs, ep) == ULFS_WINO &&
 	     memcmp(ep->d_name, dirp->d_name, lfs_dir_getnamlen(fs, dirp)) == 0)) {
 		if (spacefree + dsize < newentrysize)
 			panic("ulfs_direnter: compact1");
-		dirp->d_reclen = spacefree + dsize;
+		lfs_dir_setreclen(fs, dirp, spacefree + dsize);
 	} else {
 		if (spacefree < newentrysize)
 			panic("ulfs_direnter: compact2");
-		dirp->d_reclen = spacefree;
-		ep->d_reclen = ulfs_rw16(dsize, needswap);
-		ep = (struct lfs_direct *)((char *)ep + dsize);
-	}
-	dirp->d_reclen = ulfs_rw16(dirp->d_reclen, needswap);
-	dirp->d_ino = ulfs_rw32(dirp->d_ino, needswap);
-	/* d_type/d_namlen are handled in ulfs_makedirentry */
+		lfs_dir_setreclen(fs, dirp, spacefree);
+		lfs_dir_setreclen(fs, ep, dsize);
+		ep = LFS_NEXTDIR(fs, ep);
+	}
+
 #ifdef LFS_DIRHASH
-	if (dp->i_dirhash != NULL && (ep->d_ino == 0 ||
-	    dirp->d_reclen == spacefree))
+	if (dp->i_dirhash != NULL && (lfs_dir_getino(fs, ep) == 0 ||
+	    lfs_dir_getreclen(fs, dirp) == spacefree))
 		ulfsdirhash_add(dp, dirp, ulr->ulr_offset + ((char *)ep - dirbuf));
 #endif
 	memcpy((void *)ep, (void *)dirp, (u_int)newentrysize);
@@ -1009,7 +997,6 @@ ulfs_dirremove(struct vnode *dvp, const 
 	struct lfs_direct *ep;
 	struct buf *bp;
 	int error;
-	const int needswap = ULFS_MPNEEDSWAP(dp->i_lfs);
 
 	if (flags & DOWHITEOUT) {
 		/*
@@ -1019,7 +1006,7 @@ ulfs_dirremove(struct vnode *dvp, const 
 				     &bp, true);
 		if (error)
 			return (error);
-		ep->d_ino = ulfs_rw32(ULFS_WINO, needswap);
+		lfs_dir_setino(fs, ep, ULFS_WINO);
 		lfs_dir_settype(fs, ep, LFS_DT_WHT);
 		goto out;
 	}
@@ -1035,22 +1022,20 @@ ulfs_dirremove(struct vnode *dvp, const 
 	 */
 	if (dp->i_dirhash != NULL)
 		ulfsdirhash_remove(dp, (ulr->ulr_count == 0) ? ep :
-		   (struct lfs_direct *)((char *)ep +
-		   ulfs_rw16(ep->d_reclen, needswap)), ulr->ulr_offset);
+		   LFS_NEXTDIR(fs, ep), ulr->ulr_offset);
 #endif
 
 	if (ulr->ulr_count == 0) {
 		/*
 		 * First entry in block: set d_ino to zero.
 		 */
-		ep->d_ino = 0;
+		lfs_dir_setino(fs, ep, 0);
 	} else {
 		/*
 		 * Collapse new free space into previous entry.
 		 */
-		ep->d_reclen =
-		    ulfs_rw16(ulfs_rw16(ep->d_reclen, needswap) + ulr->ulr_reclen,
-			needswap);
+		lfs_dir_setreclen(fs, ep,
+			lfs_dir_getreclen(fs, ep) + ulr->ulr_reclen);
 	}
 
 #ifdef LFS_DIRHASH
@@ -1118,7 +1103,7 @@ ulfs_dirrewrite(struct inode *dp, off_t 
 	error = ulfs_blkatoff(vdp, offset, (void *)&ep, &bp, true);
 	if (error)
 		return (error);
-	ep->d_ino = ulfs_rw32(newinum, ULFS_IPNEEDSWAP(dp));
+	lfs_dir_setino(fs, ep, newinum);
 	lfs_dir_settype(fs, ep, newtype);
 	oip->i_nlink--;
 	DIP_ASSIGN(oip, nlink, oip->i_nlink);
@@ -1153,11 +1138,9 @@ ulfs_dirempty(struct inode *ip, ino_t pa
 	struct lfs_direct *dp = (struct lfs_direct *)&dbuf;
 	int error, namlen;
 	size_t count;
-	const int needswap = ULFS_IPNEEDSWAP(ip);
 #define	MINDIRSIZ (sizeof (struct lfs_dirtemplate) / 2)
 
-	for (off = 0; off < ip->i_size;
-	    off += ulfs_rw16(dp->d_reclen, needswap)) {
+	for (off = 0; off < ip->i_size; off += lfs_dir_getreclen(fs, dp)) {
 		error = ulfs_bufio(UIO_READ, ITOV(ip), (void *)dp, MINDIRSIZ,
 		    off, IO_NODELOCKED, cred, &count, NULL);
 		/*
@@ -1167,10 +1150,11 @@ ulfs_dirempty(struct inode *ip, ino_t pa
 		if (error || count != 0)
 			return (0);
 		/* avoid infinite loops */
-		if (dp->d_reclen == 0)
+		if (lfs_dir_getreclen(fs, dp) == 0)
 			return (0);
 		/* skip empty entries */
-		if (dp->d_ino == 0 || ulfs_rw32(dp->d_ino, needswap) == ULFS_WINO)
+		if (lfs_dir_getino(fs, dp) == 0 ||
+		    lfs_dir_getino(fs, dp) == ULFS_WINO)
 			continue;
 		/* accept only "." and ".." */
 		namlen = lfs_dir_getnamlen(fs, dp);
@@ -1183,11 +1167,9 @@ ulfs_dirempty(struct inode *ip, ino_t pa
 		 * 1 implies ".", 2 implies ".." if second
 		 * char is also "."
 		 */
-		if (namlen == 1 &&
-		    ulfs_rw32(dp->d_ino, needswap) == ip->i_number)
+		if (namlen == 1 && lfs_dir_getino(fs, dp) == ip->i_number)
 			continue;
-		if (dp->d_name[1] == '.' &&
-		    ulfs_rw32(dp->d_ino, needswap) == parentino)
+		if (dp->d_name[1] == '.' && lfs_dir_getino(fs, dp) == parentino)
 			continue;
 		return (0);
 	}

Index: src/sys/ufs/lfs/ulfs_vnops.c
diff -u src/sys/ufs/lfs/ulfs_vnops.c:1.28 src/sys/ufs/lfs/ulfs_vnops.c:1.29
--- src/sys/ufs/lfs/ulfs_vnops.c:1.28	Tue Sep  1 06:16:59 2015
+++ src/sys/ufs/lfs/ulfs_vnops.c	Tue Sep 15 14:58:06 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: ulfs_vnops.c,v 1.28 2015/09/01 06:16:59 dholland Exp $	*/
+/*	$NetBSD: ulfs_vnops.c,v 1.29 2015/09/15 14:58:06 dholland Exp $	*/
 /*  from NetBSD: ufs_vnops.c,v 1.213 2013/06/08 05:47:02 kardel Exp  */
 
 /*-
@@ -67,7 +67,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ulfs_vnops.c,v 1.28 2015/09/01 06:16:59 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ulfs_vnops.c,v 1.29 2015/09/15 14:58:06 dholland Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_lfs.h"
@@ -794,12 +794,11 @@ ulfs_readdir(void *v)
 	size_t		skipbytes;
 	struct ulfsmount *ump = VFSTOULFS(vp->v_mount);
 	struct lfs *fs = ump->um_lfs;
-	int nswap = ULFS_MPNEEDSWAP(fs);
 	uio = ap->a_uio;
 	count = uio->uio_resid;
 	rcount = count - ((uio->uio_offset + count) & (fs->um_dirblksiz - 1));
 
-	if (rcount < _DIRENT_MINSIZE(cdp) || count < _DIRENT_MINSIZE(ndp))
+	if (rcount < LFS_DIRECTSIZ(0) || count < _DIRENT_MINSIZE(ndp))
 		return EINVAL;
 
 	startoff = uio->uio_offset & ~(fs->um_dirblksiz - 1);
@@ -834,7 +833,7 @@ ulfs_readdir(void *v)
 
 	off = uio->uio_offset;
 	if (ap->a_cookies) {
-		ccount = rcount / _DIRENT_RECLEN(cdp, 1);
+		ccount = rcount / _DIRENT_RECLEN(ndp, 1);
 		ccp = *(ap->a_cookies) = malloc(ccount * sizeof(*ccp),
 		    M_TEMP, M_WAITOK);
 	} else {
@@ -844,11 +843,10 @@ ulfs_readdir(void *v)
 	}
 
 	while (cdp < ecdp) {
-		cdp->d_reclen = ulfs_rw16(cdp->d_reclen, nswap);
 		if (skipbytes > 0) {
-			if (cdp->d_reclen <= skipbytes) {
-				skipbytes -= cdp->d_reclen;
-				cdp = _DIRENT_NEXT(cdp);
+			if (lfs_dir_getreclen(fs, cdp) <= skipbytes) {
+				skipbytes -= lfs_dir_getreclen(fs, cdp);
+				cdp = LFS_NEXTDIR(fs, cdp);
 				continue;
 			}
 			/*
@@ -857,7 +855,7 @@ ulfs_readdir(void *v)
 			error = EINVAL;
 			goto out;
 		}
-		if (cdp->d_reclen == 0) {
+		if (lfs_dir_getreclen(fs, cdp) == 0) {
 			struct dirent *ondp = ndp;
 			ndp->d_reclen = _DIRENT_MINSIZE(ndp);
 			ndp = _DIRENT_NEXT(ndp);
@@ -871,17 +869,17 @@ ulfs_readdir(void *v)
 		if ((char *)(void *)ndp + ndp->d_reclen +
 		    _DIRENT_MINSIZE(ndp) > endp)
 			break;
-		ndp->d_fileno = ulfs_rw32(cdp->d_ino, nswap);
+		ndp->d_fileno = lfs_dir_getino(fs, cdp);
 		(void)memcpy(ndp->d_name, cdp->d_name, ndp->d_namlen);
 		memset(&ndp->d_name[ndp->d_namlen], 0,
 		    ndp->d_reclen - _DIRENT_NAMEOFF(ndp) - ndp->d_namlen);
-		off += cdp->d_reclen;
+		off += lfs_dir_getreclen(fs, cdp);
 		if (ap->a_cookies) {
 			KASSERT(ccp - *(ap->a_cookies) < ccount);
 			*(ccp++) = off;
 		}
 		ndp = _DIRENT_NEXT(ndp);
-		cdp = _DIRENT_NEXT(cdp);
+		cdp = LFS_NEXTDIR(fs, cdp);
 	}
 
 	count = ((char *)(void *)ndp - ndbuf);

Reply via email to