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);