Module Name: src
Committed By: dholland
Date: Tue Sep 1 06:16:59 UTC 2015
Modified Files:
src/libexec/lfs_cleanerd: cleaner.h lfs_cleanerd.c
src/sbin/fsck_lfs: dir.c inode.c pass2.c
src/sbin/newfs_lfs: make_lfs.c
src/sys/lib/libsa: ufs.c
src/sys/ufs/lfs: lfs.h lfs_accessors.h lfs_rename.c lfs_vfsops.c
lfs_vnops.c ulfs_dirhash.c ulfs_extern.h ulfs_inode.c ulfs_lookup.c
ulfs_vfsops.c ulfs_vnops.c
Log Message:
Add new accessors for the d_type and d_namlen fields of struct lfs_direct.
Napalm the old byteswap access logic for these.
To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 src/libexec/lfs_cleanerd/cleaner.h
cvs rdiff -u -r1.52 -r1.53 src/libexec/lfs_cleanerd/lfs_cleanerd.c
cvs rdiff -u -r1.37 -r1.38 src/sbin/fsck_lfs/dir.c
cvs rdiff -u -r1.62 -r1.63 src/sbin/fsck_lfs/inode.c
cvs rdiff -u -r1.26 -r1.27 src/sbin/fsck_lfs/pass2.c
cvs rdiff -u -r1.48 -r1.49 src/sbin/newfs_lfs/make_lfs.c
cvs rdiff -u -r1.73 -r1.74 src/sys/lib/libsa/ufs.c
cvs rdiff -u -r1.184 -r1.185 src/sys/ufs/lfs/lfs.h
cvs rdiff -u -r1.21 -r1.22 src/sys/ufs/lfs/lfs_accessors.h
cvs rdiff -u -r1.8 -r1.9 src/sys/ufs/lfs/lfs_rename.c \
src/sys/ufs/lfs/ulfs_dirhash.c
cvs rdiff -u -r1.344 -r1.345 src/sys/ufs/lfs/lfs_vfsops.c
cvs rdiff -u -r1.288 -r1.289 src/sys/ufs/lfs/lfs_vnops.c
cvs rdiff -u -r1.15 -r1.16 src/sys/ufs/lfs/ulfs_extern.h
cvs rdiff -u -r1.10 -r1.11 src/sys/ufs/lfs/ulfs_inode.c
cvs rdiff -u -r1.25 -r1.26 src/sys/ufs/lfs/ulfs_lookup.c
cvs rdiff -u -r1.9 -r1.10 src/sys/ufs/lfs/ulfs_vfsops.c
cvs rdiff -u -r1.27 -r1.28 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/libexec/lfs_cleanerd/cleaner.h
diff -u src/libexec/lfs_cleanerd/cleaner.h:1.14 src/libexec/lfs_cleanerd/cleaner.h:1.15
--- src/libexec/lfs_cleanerd/cleaner.h:1.14 Tue Sep 1 06:10:16 2015
+++ src/libexec/lfs_cleanerd/cleaner.h Tue Sep 1 06:16:58 2015
@@ -21,7 +21,8 @@ struct clfs {
struct dlfs64 u_64;
} lfs_dlfs_u;
unsigned lfs_is64 : 1,
- lfs_dobyteswap : 1;
+ lfs_dobyteswap : 1,
+ lfs_hasolddirfmt : 1;
/* Ifile */
int clfs_ifilefd; /* Ifile file descriptor */
Index: src/libexec/lfs_cleanerd/lfs_cleanerd.c
diff -u src/libexec/lfs_cleanerd/lfs_cleanerd.c:1.52 src/libexec/lfs_cleanerd/lfs_cleanerd.c:1.53
--- src/libexec/lfs_cleanerd/lfs_cleanerd.c:1.52 Tue Sep 1 06:12:04 2015
+++ src/libexec/lfs_cleanerd/lfs_cleanerd.c Tue Sep 1 06:16:58 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: lfs_cleanerd.c,v 1.52 2015/09/01 06:12:04 dholland Exp $ */
+/* $NetBSD: lfs_cleanerd.c,v 1.53 2015/09/01 06:16:58 dholland Exp $ */
/*-
* Copyright (c) 2005 The NetBSD Foundation, Inc.
@@ -270,6 +270,8 @@ init_fs(struct clfs *fs, char *fsname)
}
fs->lfs_is64 = 0; /* XXX notyet */
fs->lfs_dobyteswap = 0; /* XXX notyet */
+ /* XXX: can this ever need to be set? does the cleaner even care? */
+ fs->lfs_hasolddirfmt = 0;
/* If this is not a version 2 filesystem, complain and exit */
if (lfs_sb_getversion(fs) != 2) {
Index: src/sbin/fsck_lfs/dir.c
diff -u src/sbin/fsck_lfs/dir.c:1.37 src/sbin/fsck_lfs/dir.c:1.38
--- src/sbin/fsck_lfs/dir.c:1.37 Tue Sep 1 06:08:37 2015
+++ src/sbin/fsck_lfs/dir.c Tue Sep 1 06:16:58 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: dir.c,v 1.37 2015/09/01 06:08:37 dholland Exp $ */
+/* $NetBSD: dir.c,v 1.38 2015/09/01 06:16:58 dholland Exp $ */
/*
* Copyright (c) 1980, 1986, 1993
@@ -70,6 +70,7 @@ struct lfs_dirtemplate dirhead = {
.dotdot_namlen = 2,
.dotdot_name = ".."
};
+#if 0
struct lfs_odirtemplate odirhead = {
.dot_ino = 0,
.dot_reclen = 12,
@@ -80,6 +81,7 @@ struct lfs_odirtemplate odirhead = {
.dotdot_namlen = 2,
.dotdot_name = ".."
};
+#endif
static int expanddir(struct uvnode *, union lfs_dinode *, char *);
static void freedir(ino_t, ino_t);
@@ -193,8 +195,8 @@ fsck_readdir(struct uvnode *vp, struct i
dp = (struct lfs_direct *) (bp->b_data + idesc->id_loc);
dp->d_reclen = LFS_DIRBLKSIZ;
dp->d_ino = 0;
- dp->d_type = 0;
- dp->d_namlen = 0;
+ lfs_dir_settype(fs, dp, LFS_DT_UNKNOWN);
+ lfs_dir_setnamlen(fs, dp, 0);
dp->d_name[0] = '\0';
if (fix)
VOP_BWRITE(bp);
@@ -266,9 +268,9 @@ dircheck(struct inodesc *idesc, struct l
}
if (dp->d_ino == 0)
return (1);
- size = LFS_DIRSIZ(0, dp, 0);
- namlen = dp->d_namlen;
- type = dp->d_type;
+ size = LFS_DIRSIZ(fs, dp);
+ namlen = lfs_dir_getnamlen(fs, dp);
+ type = lfs_dir_gettype(fs, dp);
if (dp->d_reclen < size ||
idesc->id_filesize < size ||
/* namlen > MAXNAMLEN || */
@@ -366,12 +368,14 @@ mkentry(struct inodesc *idesc)
{
struct lfs_direct *dirp = idesc->id_dirp;
struct lfs_direct newent;
+ unsigned namlen;
int newlen, oldlen;
- newent.d_namlen = strlen(idesc->id_name);
- newlen = LFS_DIRSIZ(0, &newent, 0);
+ namlen = strlen(idesc->id_name);
+ lfs_dir_setnamlen(fs, &newent, namlen);
+ newlen = LFS_DIRSIZ(fs, &newent);
if (dirp->d_ino != 0)
- oldlen = LFS_DIRSIZ(0, dirp, 0);
+ oldlen = LFS_DIRSIZ(fs, dirp);
else
oldlen = 0;
if (dirp->d_reclen - oldlen < newlen)
@@ -381,9 +385,9 @@ mkentry(struct inodesc *idesc)
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;
- dirp->d_type = typemap[idesc->id_parent];
- dirp->d_namlen = newent.d_namlen;
- memcpy(dirp->d_name, idesc->id_name, (size_t) dirp->d_namlen + 1);
+ 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);
return (ALTERED | STOP);
}
@@ -391,11 +395,13 @@ static int
chgino(struct inodesc *idesc)
{
struct lfs_direct *dirp = idesc->id_dirp;
+ int namlen;
- if (memcmp(dirp->d_name, idesc->id_name, (int) dirp->d_namlen + 1))
+ namlen = lfs_dir_getnamlen(fs, dirp);
+ if (memcmp(dirp->d_name, idesc->id_name, namlen + 1))
return (KEEPON);
dirp->d_ino = idesc->id_parent;
- dirp->d_type = typemap[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.62 src/sbin/fsck_lfs/inode.c:1.63
--- src/sbin/fsck_lfs/inode.c:1.62 Tue Sep 1 06:15:02 2015
+++ src/sbin/fsck_lfs/inode.c Tue Sep 1 06:16:58 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: inode.c,v 1.62 2015/09/01 06:15:02 dholland Exp $ */
+/* $NetBSD: inode.c,v 1.63 2015/09/01 06:16:58 dholland Exp $ */
/*-
* Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
@@ -507,8 +507,11 @@ findname(struct inodesc * idesc)
if (dirp->d_ino != idesc->id_parent)
return (KEEPON);
- if ((len = dirp->d_namlen + 1) > MAXPATHLEN) {
+ len = lfs_dir_getnamlen(fs, dirp) + 1;
+ /* XXX this is wrong: namlen+1 can be up to MAXPATHLEN+1 */
+ if (len > MAXPATHLEN) {
/* Truncate it but don't overflow the buffer */
+ /* XXX: this case doesn't null-terminate the result */
len = MAXPATHLEN;
}
/* this is namebuf with utils.h */
Index: src/sbin/fsck_lfs/pass2.c
diff -u src/sbin/fsck_lfs/pass2.c:1.26 src/sbin/fsck_lfs/pass2.c:1.27
--- src/sbin/fsck_lfs/pass2.c:1.26 Wed Aug 12 18:28:00 2015
+++ src/sbin/fsck_lfs/pass2.c Tue Sep 1 06:16:58 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: pass2.c,v 1.26 2015/08/12 18:28:00 dholland Exp $ */
+/* $NetBSD: pass2.c,v 1.27 2015/09/01 06:16:58 dholland Exp $ */
/*
* Copyright (c) 1980, 1986, 1993
@@ -229,24 +229,26 @@ pass2check(struct inodesc * idesc)
if (dirp->d_ino != 0 && strcmp(dirp->d_name, ".") == 0) {
if (dirp->d_ino != idesc->id_number) {
direrror(idesc->id_number, "BAD INODE NUMBER FOR '.'");
- dirp->d_ino = idesc->id_number;
- if (reply("FIX") == 1)
+ if (reply("FIX") == 1) {
+ dirp->d_ino = idesc->id_number;
ret |= ALTERED;
+ }
}
- if (dirp->d_type != LFS_DT_DIR) {
+ if (lfs_dir_gettype(fs, dirp) != LFS_DT_DIR) {
direrror(idesc->id_number, "BAD TYPE VALUE FOR '.'");
- dirp->d_type = LFS_DT_DIR;
- if (reply("FIX") == 1)
+ if (reply("FIX") == 1) {
+ lfs_dir_settype(fs, dirp, LFS_DT_DIR);
ret |= ALTERED;
+ }
}
goto chk1;
}
direrror(idesc->id_number, "MISSING '.'");
proto.d_ino = idesc->id_number;
- proto.d_type = LFS_DT_DIR;
- proto.d_namlen = 1;
+ 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(0, &proto, 0);
+ entrysize = LFS_DIRSIZ(fs, &proto);
if (dirp->d_ino != 0 && strcmp(dirp->d_name, "..") != 0) {
pfatal("CANNOT FIX, FIRST ENTRY IN DIRECTORY CONTAINS %s\n",
dirp->d_name);
@@ -274,12 +276,12 @@ chk1:
goto chk2;
inp = getinoinfo(idesc->id_number);
proto.d_ino = inp->i_parent;
- proto.d_type = LFS_DT_DIR;
- proto.d_namlen = 2;
+ 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(0, &proto, 0);
+ entrysize = LFS_DIRSIZ(fs, &proto);
if (idesc->id_entryno == 0) {
- n = LFS_DIRSIZ(0, dirp, 0);
+ n = LFS_DIRSIZ(fs, dirp);
if (dirp->d_reclen < n + entrysize)
goto chk2;
proto.d_reclen = dirp->d_reclen - n;
@@ -292,9 +294,9 @@ chk1:
}
if (dirp->d_ino != 0 && strcmp(dirp->d_name, "..") == 0) {
inp->i_dotdot = dirp->d_ino;
- if (dirp->d_type != LFS_DT_DIR) {
+ if (lfs_dir_gettype(fs, dirp) != LFS_DT_DIR) {
direrror(idesc->id_number, "BAD TYPE VALUE FOR '..'");
- dirp->d_type = LFS_DT_DIR;
+ lfs_dir_settype(fs, dirp, LFS_DT_DIR);
if (reply("FIX") == 1)
ret |= ALTERED;
}
@@ -327,21 +329,23 @@ chk1:
chk2:
if (dirp->d_ino == 0)
return (ret | KEEPON);
- if (dirp->d_namlen <= 2 &&
+ if (lfs_dir_getnamlen(fs, dirp) <= 2 &&
dirp->d_name[0] == '.' &&
idesc->id_entryno >= 2) {
- if (dirp->d_namlen == 1) {
+ if (lfs_dir_getnamlen(fs, dirp) == 1) {
direrror(idesc->id_number, "EXTRA '.' ENTRY");
- dirp->d_ino = 0;
- if (reply("FIX") == 1)
+ if (reply("FIX") == 1) {
+ dirp->d_ino = 0;
ret |= ALTERED;
+ }
return (KEEPON | ret);
}
if (dirp->d_name[1] == '.') {
direrror(idesc->id_number, "EXTRA '..' ENTRY");
- dirp->d_ino = 0;
- if (reply("FIX") == 1)
+ if (reply("FIX") == 1) {
+ dirp->d_ino = 0;
ret |= ALTERED;
+ }
return (KEEPON | ret);
}
}
@@ -352,20 +356,22 @@ chk2:
n = reply("REMOVE");
} else if (dirp->d_ino == LFS_IFILE_INUM &&
idesc->id_number == ULFS_ROOTINO) {
- if (dirp->d_type != LFS_DT_REG) {
+ if (lfs_dir_gettype(fs, dirp) != LFS_DT_REG) {
fileerror(idesc->id_number, dirp->d_ino,
"BAD TYPE FOR IFILE");
- dirp->d_type = LFS_DT_REG;
- if (reply("FIX") == 1)
+ if (reply("FIX") == 1) {
+ lfs_dir_settype(fs, dirp, LFS_DT_REG);
ret |= ALTERED;
+ }
}
- } else if (((dirp->d_ino == ULFS_WINO && (dirp->d_type != LFS_DT_WHT)) ||
- (dirp->d_ino != ULFS_WINO && dirp->d_type == LFS_DT_WHT))) {
+ } 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;
- dirp->d_type = LFS_DT_WHT;
- if (reply("FIX") == 1)
+ if (reply("FIX") == 1) {
+ lfs_dir_settype(fs, dirp, LFS_DT_WHT);
ret |= ALTERED;
+ }
} else {
again:
switch (statemap[dirp->d_ino]) {
@@ -418,13 +424,13 @@ again:
/* fall through */
case FSTATE:
- if (dirp->d_type != typemap[dirp->d_ino]) {
+ if (lfs_dir_gettype(fs, dirp) != typemap[dirp->d_ino]) {
fileerror(idesc->id_number, dirp->d_ino,
"BAD TYPE VALUE");
if (debug)
pwarn("dir has %d, typemap has %d\n",
- dirp->d_type, typemap[dirp->d_ino]);
- dirp->d_type = typemap[dirp->d_ino];
+ lfs_dir_gettype(fs, dirp), typemap[dirp->d_ino]);
+ lfs_dir_settype(fs, dirp, typemap[dirp->d_ino]);
if (reply("FIX") == 1)
ret |= ALTERED;
}
Index: src/sbin/newfs_lfs/make_lfs.c
diff -u src/sbin/newfs_lfs/make_lfs.c:1.48 src/sbin/newfs_lfs/make_lfs.c:1.49
--- src/sbin/newfs_lfs/make_lfs.c:1.48 Tue Sep 1 06:15:02 2015
+++ src/sbin/newfs_lfs/make_lfs.c Tue Sep 1 06:16:58 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: make_lfs.c,v 1.48 2015/09/01 06:15:02 dholland Exp $ */
+/* $NetBSD: make_lfs.c,v 1.49 2015/09/01 06:16:58 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.48 2015/09/01 06:15:02 dholland Exp $");
+__RCSID("$NetBSD: make_lfs.c,v 1.49 2015/09/01 06:16:58 dholland Exp $");
#endif
#endif /* not lint */
@@ -243,24 +243,62 @@ static const struct lfs lfs_default;
#define UMASK 0755
struct lfs_direct lfs_root_dir[] = {
- { ULFS_ROOTINO, sizeof(struct lfs_direct), LFS_DT_DIR, 1, "."},
- { ULFS_ROOTINO, sizeof(struct lfs_direct), LFS_DT_DIR, 2, ".."},
- /* { LFS_IFILE_INUM, sizeof(struct lfs_direct), LFS_DT_REG, 5, "ifile"}, */
+ {
+ .d_ino = ULFS_ROOTINO,
+ .d_reclen = sizeof(struct lfs_direct),
+ .d_type = LFS_DT_DIR,
+ .d_namlen = 1,
+ .d_name = "."
+ },
+ {
+ .d_ino = ULFS_ROOTINO,
+ .d_reclen = sizeof(struct lfs_direct),
+ .d_type = LFS_DT_DIR,
+ .d_namlen = 2,
+ .d_name = ".."
+ },
+/*
+ {
+ .d_ino = LFS_IFILE_INUM,
+ .d_reclen = sizeof(struct lfs_direct),
+ .d_type = LFS_DT_REG,
+ .d_namlen = 5,
+ .d_name = "ifile"
+ },
+*/
#ifdef MAKE_LF_DIR
- { LOSTFOUNDINO, sizeof(struct lfs_direct), LFS_DT_DIR, 10, "lost+found"},
+ {
+ .d_ino = LOSTFOUNDINO,
+ .d_reclen = sizeof(struct lfs_direct),
+ .d_type = LFS_DT_DIR,
+ .d_namlen = 10,
+ .d_name = "lost+found"
+ },
#endif
};
#ifdef MAKE_LF_DIR
struct lfs_direct lfs_lf_dir[] = {
- { LOSTFOUNDINO, sizeof(struct lfs_direct), LFS_DT_DIR, 1, "." },
- { ULFS_ROOTINO, sizeof(struct lfs_direct), LFS_DT_DIR, 2, ".." },
+ {
+ .d_ino = LOSTFOUNDINO,
+ .d_reclen = sizeof(struct lfs_direct),
+ .d_type = LFS_DT_DIR,
+ .d_reclen = 1,
+ .d_name = "."
+ },
+ {
+ .d_ino = ULFS_ROOTINO,
+ .d_reclen = sizeof(struct lfs_direct),
+ .d_type = LFS_DT_DIR,
+ .d_reclen = 2,
+ .d_name = ".."
+ },
};
#endif
void pwarn(const char *, ...);
static void make_dinode(ino_t, union lfs_dinode *, int, struct lfs *);
-static void make_dir( void *, struct lfs_direct *, int);
+static void make_dir(struct lfs *, void *, struct lfs_direct *, int);
static uint64_t maxfilesize(int);
/*
@@ -347,21 +385,21 @@ make_dinode(ino_t ino, union lfs_dinode
* entries in protodir fit in the first DIRBLKSIZ.
*/
static void
-make_dir(void *bufp, struct lfs_direct *protodir, int entries)
+make_dir(struct lfs *fs, void *bufp, struct lfs_direct *protodir, int entries)
{
char *cp;
int i, spcleft;
spcleft = LFS_DIRBLKSIZ;
for (cp = bufp, i = 0; i < entries - 1; i++) {
- protodir[i].d_reclen = LFS_DIRSIZ(LFS_NEWDIRFMT, &protodir[i], 0);
+ 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)
fatal("%s: %s", special, "directory too big");
}
protodir[i].d_reclen = spcleft;
- memmove(cp, &protodir[i], LFS_DIRSIZ(LFS_NEWDIRFMT, &protodir[i], 0));
+ memmove(cp, &protodir[i], LFS_DIRSIZ(fs, &protodir[i]));
}
int
@@ -423,6 +461,7 @@ make_lfs(int devfd, uint secsize, struct
}
fs->lfs_is64 = is64;
fs->lfs_dobyteswap = dobyteswap;
+ fs->lfs_hasolddirfmt = false;
fs->lfs_ivnode = vp;
fs->lfs_devvp = save_devvp;
@@ -797,7 +836,7 @@ make_lfs(int devfd, uint secsize, struct
VTOI(vp)->i_lfs_fragsize[i - 1] =
roundup(LFS_DIRBLKSIZ, lfs_sb_getfsize(fs));
bread(vp, 0, lfs_sb_getfsize(fs), 0, &bp);
- make_dir(bp->b_data, lfs_root_dir,
+ make_dir(fs, bp->b_data, lfs_root_dir,
sizeof(lfs_root_dir) / sizeof(struct lfs_direct));
VOP_BWRITE(bp);
@@ -817,7 +856,7 @@ make_lfs(int devfd, uint secsize, struct
VTOI(vp)->i_lfs_fragsize[i - 1] =
roundup(DIRBLKSIZ,fs->lfs_fsize);
bread(vp, 0, fs->lfs_fsize, 0, &bp);
- make_dir(bp->b_data, lfs_lf_dir,
+ make_dir(fs, bp->b_data, lfs_lf_dir,
sizeof(lfs_lf_dir) / sizeof(struct lfs_direct));
VOP_BWRITE(bp);
#endif /* MAKE_LF_DIR */
Index: src/sys/lib/libsa/ufs.c
diff -u src/sys/lib/libsa/ufs.c:1.73 src/sys/lib/libsa/ufs.c:1.74
--- src/sys/lib/libsa/ufs.c:1.73 Tue Sep 1 06:12:04 2015
+++ src/sys/lib/libsa/ufs.c Tue Sep 1 06:16:58 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: ufs.c,v 1.73 2015/09/01 06:12:04 dholland Exp $ */
+/* $NetBSD: ufs.c,v 1.74 2015/09/01 06:16:58 dholland Exp $ */
/*-
* Copyright (c) 1993
@@ -108,7 +108,9 @@ struct salfs {
struct dlfs u_32;
struct dlfs64 u_64;
} lfs_dlfs_u;
- unsigned lfs_is64 : 1;
+ unsigned lfs_is64 : 1,
+ lfs_dobyteswap : 1,
+ lfs_hasolddirfmt : 1;
};
/* Get lfs accessors that use struct salfs. */
#define STRUCT_LFS struct salfs
@@ -598,6 +600,8 @@ ufs_open(const char *path, struct open_f
#endif
#if defined(LIBSA_LFS)
fs->lfs_is64 = 0;
+ fs->lfs_dobyteswap = 0;
+ fs->lfs_hasolddirfmt = (fs->fs_maxsymlinklen <= 0);
#endif
#endif
Index: src/sys/ufs/lfs/lfs.h
diff -u src/sys/ufs/lfs/lfs.h:1.184 src/sys/ufs/lfs/lfs.h:1.185
--- src/sys/ufs/lfs/lfs.h:1.184 Tue Sep 1 06:15:46 2015
+++ src/sys/ufs/lfs/lfs.h Tue Sep 1 06:16:59 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: lfs.h,v 1.184 2015/09/01 06:15:46 dholland Exp $ */
+/* $NetBSD: lfs.h,v 1.185 2015/09/01 06:16:59 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 */
@@ -341,29 +341,6 @@
#define LFS_DTTOIF(dirtype) ((dirtype) << 12)
/*
- * The LFS_DIRSIZ macro gives the minimum record length which will hold
- * the directory entry. This requires the amount of space in struct lfs_direct
- * without the d_name field, plus enough space for the name with a terminating
- * null byte (dp->d_namlen+1), rounded up to a 4 byte boundary.
- */
-#define LFS_DIRECTSIZ(namlen) \
- ((sizeof(struct lfs_direct) - (LFS_MAXNAMLEN+1)) + (((namlen)+1 + 3) &~ 3))
-
-#if (BYTE_ORDER == LITTLE_ENDIAN)
-#define LFS_DIRSIZ(oldfmt, dp, needswap) \
- (((oldfmt) && !(needswap)) ? \
- LFS_DIRECTSIZ((dp)->d_type) : LFS_DIRECTSIZ((dp)->d_namlen))
-#else
-#define LFS_DIRSIZ(oldfmt, dp, needswap) \
- (((oldfmt) && (needswap)) ? \
- LFS_DIRECTSIZ((dp)->d_type) : LFS_DIRECTSIZ((dp)->d_namlen))
-#endif
-
-/* Constants for the first argument of LFS_DIRSIZ */
-#define LFS_OLDDIRFMT 1
-#define LFS_NEWDIRFMT 0
-
-/*
* Theoretically, directories can be more than 2Gb in length; however, in
* practice this seems unlikely. So, we define the type doff_t as a 32-bit
* quantity to keep down the cost of doing lookup on a 32-bit machine.
@@ -960,7 +937,8 @@ struct lfs {
/* These fields are set at mount time and are meaningless on disk. */
unsigned lfs_is64 : 1, /* are we lfs64 or lfs32? */
- lfs_dobyteswap : 1; /* are we opposite-endian? */
+ lfs_dobyteswap : 1, /* are we opposite-endian? */
+ lfs_hasolddirfmt : 1; /* dir entries have no d_type */
struct segment *lfs_sp; /* current segment being written */
struct vnode *lfs_ivnode; /* vnode for the ifile */
Index: src/sys/ufs/lfs/lfs_accessors.h
diff -u src/sys/ufs/lfs/lfs_accessors.h:1.21 src/sys/ufs/lfs/lfs_accessors.h:1.22
--- src/sys/ufs/lfs/lfs_accessors.h:1.21 Tue Sep 1 06:13:09 2015
+++ src/sys/ufs/lfs/lfs_accessors.h Tue Sep 1 06:16:59 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: lfs_accessors.h,v 1.21 2015/09/01 06:13:09 dholland Exp $ */
+/* $NetBSD: lfs_accessors.h,v 1.22 2015/09/01 06:16:59 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 */
@@ -202,6 +202,157 @@
#endif
/*
+ * For handling directories we will need to know if the volume is
+ * little-endian.
+ */
+#if BYTE_ORDER == LITTLE_ENDIAN
+#define LFS_LITTLE_ENDIAN_ONDISK(fs) (!(fs)->lfs_dobyteswap)
+#else
+#define LFS_LITTLE_ENDIAN_ONDISK(fs) ((fs)->lfs_dobyteswap)
+#endif
+
+
+/*
+ * directories
+ */
+
+/*
+ * The LFS_DIRSIZ macro gives the minimum record length which will hold
+ * the directory entry. This requires the amount of space in struct lfs_direct
+ * without the d_name field, plus enough space for the name with a terminating
+ * null byte (dp->d_namlen+1), rounded up to a 4 byte boundary.
+ */
+#define LFS_DIRECTSIZ(namlen) \
+ ((sizeof(struct lfs_direct) - (LFS_MAXNAMLEN+1)) + (((namlen)+1 + 3) &~ 3))
+
+#if (BYTE_ORDER == LITTLE_ENDIAN)
+#define LFS_OLDDIRSIZ(oldfmt, dp, needswap) \
+ (((oldfmt) && !(needswap)) ? \
+ LFS_DIRECTSIZ((dp)->d_type) : LFS_DIRECTSIZ((dp)->d_namlen))
+#else
+#define LFS_OLDDIRSIZ(oldfmt, dp, needswap) \
+ (((oldfmt) && (needswap)) ? \
+ LFS_DIRECTSIZ((dp)->d_type) : LFS_DIRECTSIZ((dp)->d_namlen))
+#endif
+
+#define LFS_DIRSIZ(fs, dp) LFS_DIRECTSIZ(lfs_dir_getnamlen(fs, dp))
+
+/* Constants for the first argument of LFS_OLDDIRSIZ */
+#define LFS_OLDDIRFMT 1
+#define LFS_NEWDIRFMT 0
+
+static __unused inline uint8_t
+lfs_dir_gettype(const STRUCT_LFS *fs, const struct lfs_direct *dp)
+{
+ if (fs->lfs_hasolddirfmt) {
+ return LFS_DT_UNKNOWN;
+ }
+ return dp->d_type;
+}
+
+static __unused inline uint8_t
+lfs_dir_getnamlen(const STRUCT_LFS *fs, const struct lfs_direct *dp)
+{
+ if (fs->lfs_hasolddirfmt && LFS_LITTLE_ENDIAN_ONDISK(fs)) {
+ /* low-order byte of old 16-bit namlen field */
+ return dp->d_type;
+ }
+ return dp->d_namlen;
+}
+
+static __unused inline void
+lfs_dir_settype(const STRUCT_LFS *fs, struct lfs_direct *dp, uint8_t type)
+{
+ if (fs->lfs_hasolddirfmt) {
+ /* do nothing */
+ return;
+ }
+ dp->d_type = type;
+}
+
+static __unused inline void
+lfs_dir_setnamlen(const STRUCT_LFS *fs, struct lfs_direct *dp, uint8_t namlen)
+{
+ if (fs->lfs_hasolddirfmt && LFS_LITTLE_ENDIAN_ONDISK(fs)) {
+ /* low-order byte of old 16-bit namlen field */
+ dp->d_type = namlen;
+ }
+ dp->d_namlen = namlen;
+}
+
+/*
+ * These are called "dirt" because they ought to be cleaned up.
+ */
+
+static __unused inline uint8_t
+lfs_dirt_getdottype(const STRUCT_LFS *fs, const struct lfs_dirtemplate *dp)
+{
+ if (fs->lfs_hasolddirfmt) {
+ return LFS_DT_UNKNOWN;
+ }
+ return dp->dot_type;
+}
+
+static __unused inline uint8_t
+lfs_dirt_getdotnamlen(const STRUCT_LFS *fs, const struct lfs_dirtemplate *dp)
+{
+ if (fs->lfs_hasolddirfmt && LFS_LITTLE_ENDIAN_ONDISK(fs)) {
+ /* low-order byte of old 16-bit namlen field */
+ return dp->dot_type;
+ }
+ return dp->dot_namlen;
+}
+
+static __unused inline uint8_t
+lfs_dirt_getdotdottype(const STRUCT_LFS *fs, const struct lfs_dirtemplate *dp)
+{
+ if (fs->lfs_hasolddirfmt) {
+ return LFS_DT_UNKNOWN;
+ }
+ return dp->dotdot_type;
+}
+
+static __unused inline uint8_t
+lfs_dirt_getdotdotnamlen(const STRUCT_LFS *fs, const struct lfs_dirtemplate *dp)
+{
+ if (fs->lfs_hasolddirfmt && LFS_LITTLE_ENDIAN_ONDISK(fs)) {
+ /* low-order byte of old 16-bit namlen field */
+ return dp->dotdot_type;
+ }
+ return dp->dotdot_namlen;
+}
+
+static __unused inline void
+lfs_dirt_settypes(const STRUCT_LFS *fs, struct lfs_dirtemplate *dtp,
+ unsigned dt1, unsigned dt2)
+{
+ if (fs->lfs_hasolddirfmt) {
+ /* do nothing */
+ return;
+ }
+ dtp->dot_type = dt1;
+ dtp->dotdot_type = dt2;
+}
+
+static __unused inline void
+lfs_dirt_setnamlens(const STRUCT_LFS *fs, struct lfs_dirtemplate *dtp,
+ unsigned len1, unsigned len2)
+{
+ if (fs->lfs_hasolddirfmt && LFS_LITTLE_ENDIAN_ONDISK(fs)) {
+ /* low-order bytes of old 16-bit namlen field */
+ dtp->dot_type = len1;
+ dtp->dotdot_type = len2;
+ /* clear the high-order bytes */
+ dtp->dot_namlen = 0;
+ dtp->dotdot_namlen = 0;
+ return;
+ }
+ dtp->dot_namlen = len1;
+ dtp->dotdot_namlen = len2;
+}
+
+
+/*
* dinodes
*/
Index: src/sys/ufs/lfs/lfs_rename.c
diff -u src/sys/ufs/lfs/lfs_rename.c:1.8 src/sys/ufs/lfs/lfs_rename.c:1.9
--- src/sys/ufs/lfs/lfs_rename.c:1.8 Fri Mar 27 17:27:56 2015
+++ src/sys/ufs/lfs/lfs_rename.c Tue Sep 1 06:16:59 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: lfs_rename.c,v 1.8 2015/03/27 17:27:56 riastradh Exp $ */
+/* $NetBSD: lfs_rename.c,v 1.9 2015/09/01 06:16:59 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.8 2015/03/27 17:27:56 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_rename.c,v 1.9 2015/09/01 06:16:59 dholland Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -124,6 +124,7 @@ __KERNEL_RCSID(0, "$NetBSD: lfs_rename.c
#include <ufs/lfs/ulfs_extern.h>
#include <ufs/lfs/lfs.h>
+#include <ufs/lfs/lfs_accessors.h>
#include <ufs/lfs/lfs_extern.h>
/*
@@ -329,20 +330,16 @@ ulfs_rename_ulr_overlap_p(const struct u
static int /* XXX int? uint8_t? */
ulfs_direct_namlen(const struct lfs_direct *ep, const struct vnode *vp)
{
- bool swap;
+ struct lfs *fs;
KASSERT(ep != NULL);
KASSERT(vp != NULL);
KASSERT(VTOI(vp) != NULL);
KASSERT(VTOI(vp)->i_ump != NULL);
+ KASSERT(VTOI(vp)->i_lfs != NULL);
+ fs = VTOI(vp)->i_lfs;
-#if (BYTE_ORDER == LITTLE_ENDIAN)
- swap = (ULFS_IPNEEDSWAP(VTOI(vp)) == 0);
-#else
- swap = (ULFS_IPNEEDSWAP(VTOI(vp)) != 0);
-#endif
-
- return ((FSFMT(vp) && swap)? ep->d_type : ep->d_namlen);
+ return lfs_dir_getnamlen(fs, ep);
}
/*
@@ -598,21 +595,16 @@ static int /* XXX int? uint8_t? */
ulfs_dirbuf_dotdot_namlen(const struct lfs_dirtemplate *dirbuf,
const struct vnode *vp)
{
- bool swap;
+ struct lfs *fs;
KASSERT(dirbuf != NULL);
KASSERT(vp != NULL);
KASSERT(VTOI(vp) != NULL);
KASSERT(VTOI(vp)->i_ump != NULL);
+ KASSERT(VTOI(vp)->i_lfs != NULL);
+ fs = VTOI(vp)->i_lfs;
-#if (BYTE_ORDER == LITTLE_ENDIAN)
- swap = (ULFS_IPNEEDSWAP(VTOI(vp)) == 0);
-#else
- swap = (ULFS_IPNEEDSWAP(VTOI(vp)) != 0);
-#endif
-
- return ((FSFMT(vp) && swap)?
- dirbuf->dotdot_type : dirbuf->dotdot_namlen);
+ return lfs_dirt_getdotdotnamlen(fs, dirbuf);
}
/*
Index: src/sys/ufs/lfs/ulfs_dirhash.c
diff -u src/sys/ufs/lfs/ulfs_dirhash.c:1.8 src/sys/ufs/lfs/ulfs_dirhash.c:1.9
--- src/sys/ufs/lfs/ulfs_dirhash.c:1.8 Tue Feb 25 18:30:13 2014
+++ src/sys/ufs/lfs/ulfs_dirhash.c Tue Sep 1 06:16:59 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: ulfs_dirhash.c,v 1.8 2014/02/25 18:30:13 pooka Exp $ */
+/* $NetBSD: ulfs_dirhash.c,v 1.9 2015/09/01 06:16:59 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.8 2014/02/25 18:30:13 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ulfs_dirhash.c,v 1.9 2015/09/01 06:16:59 dholland Exp $");
/*
* This implements a hash-based lookup scheme for ULFS directories.
@@ -49,6 +49,8 @@ __KERNEL_RCSID(0, "$NetBSD: ulfs_dirhash
#include <sys/sysctl.h>
#include <sys/atomic.h>
+#include <ufs/lfs/lfs.h>
+#include <ufs/lfs/lfs_accessors.h>
#include <ufs/lfs/ulfs_inode.h>
#include <ufs/lfs/ulfs_dirhash.h>
#include <ufs/lfs/ulfsmount.h>
@@ -112,13 +114,13 @@ static struct sysctllog *ulfsdirhash_sys
int
ulfsdirhash_build(struct inode *ip)
{
+ struct lfs *fs = ip->i_lfs;
struct dirhash *dh;
struct buf *bp = NULL;
struct lfs_direct *ep;
struct vnode *vp;
doff_t bmask, pos;
int dirblocks, i, j, memreqd, nblocks, narrays, nslots, slot;
- const int needswap = ULFS_IPNEEDSWAP(ip);
int dirblksiz = ip->i_lfs->um_dirblksiz;
/* Check if we can/should use dirhash. */
@@ -234,12 +236,13 @@ ulfsdirhash_build(struct inode *ip)
}
if (ep->d_ino != 0) {
/* Add the entry (simplified ulfsdirhash_add). */
- slot = ulfsdirhash_hash(dh, ep->d_name, ep->d_namlen);
+ slot = ulfsdirhash_hash(dh, ep->d_name,
+ lfs_dir_getnamlen(fs, ep));
while (DH_ENTRY(dh, slot) != DIRHASH_EMPTY)
slot = WRAPINCR(slot, dh->dh_hlen);
dh->dh_hused++;
DH_ENTRY(dh, slot) = pos;
- ulfsdirhash_adjfree(dh, pos, -LFS_DIRSIZ(0, ep, needswap),
+ ulfsdirhash_adjfree(dh, pos, -LFS_DIRSIZ(fs, ep),
dirblksiz);
}
pos += ep->d_reclen;
@@ -323,13 +326,13 @@ int
ulfsdirhash_lookup(struct inode *ip, const char *name, int namelen, doff_t *offp,
struct buf **bpp, doff_t *prevoffp)
{
+ struct lfs *fs = ip->i_lfs;
struct dirhash *dh, *dh_next;
struct lfs_direct *dp;
struct vnode *vp;
struct buf *bp;
doff_t blkoff, bmask, offset, prevoff;
int i, slot;
- const int needswap = ULFS_IPNEEDSWAP(ip);
int dirblksiz = ip->i_lfs->um_dirblksiz;
if ((dh = ip->i_dirhash) == NULL)
@@ -429,7 +432,7 @@ restart:
brelse(bp, 0);
return (EJUSTRETURN);
}
- if (dp->d_namlen == namelen &&
+ if (lfs_dir_getnamlen(fs, dp) == namelen &&
memcmp(dp->d_name, name, namelen) == 0) {
/* Found. Get the prev offset if needed. */
if (prevoffp != NULL) {
@@ -448,7 +451,7 @@ restart:
/* Check for sequential access, and update offset. */
if (dh->dh_seqopt == 0 && dh->dh_seqoff == offset)
dh->dh_seqopt = 1;
- dh->dh_seqoff = offset + LFS_DIRSIZ(0, dp, needswap);
+ dh->dh_seqoff = offset + LFS_DIRSIZ(fs, dp);
DIRHASH_UNLOCK(dh);
*bpp = bp;
@@ -497,12 +500,12 @@ restart:
doff_t
ulfsdirhash_findfree(struct inode *ip, int slotneeded, int *slotsize)
{
+ struct lfs *fs = ip->i_lfs;
struct lfs_direct *dp;
struct dirhash *dh;
struct buf *bp;
doff_t pos, slotstart;
int dirblock, error, freebytes, i;
- const int needswap = ULFS_IPNEEDSWAP(ip);
int dirblksiz = ip->i_lfs->um_dirblksiz;
if ((dh = ip->i_dirhash) == NULL)
@@ -540,7 +543,7 @@ ulfsdirhash_findfree(struct inode *ip, i
brelse(bp, 0);
return (-1);
}
- if (dp->d_ino == 0 || dp->d_reclen > LFS_DIRSIZ(0, dp, needswap))
+ if (dp->d_ino == 0 || dp->d_reclen > LFS_DIRSIZ(fs, dp))
break;
i += dp->d_reclen;
dp = (struct lfs_direct *)((char *)dp + dp->d_reclen);
@@ -557,7 +560,7 @@ ulfsdirhash_findfree(struct inode *ip, i
while (i < dirblksiz && freebytes < slotneeded) {
freebytes += dp->d_reclen;
if (dp->d_ino != 0)
- freebytes -= LFS_DIRSIZ(0, dp, needswap);
+ freebytes -= LFS_DIRSIZ(fs, dp);
if (dp->d_reclen == 0) {
DIRHASH_UNLOCK(dh);
brelse(bp, 0);
@@ -620,9 +623,9 @@ ulfsdirhash_enduseful(struct inode *ip)
void
ulfsdirhash_add(struct inode *ip, struct lfs_direct *dirp, doff_t offset)
{
+ struct lfs *fs = ip->i_lfs;
struct dirhash *dh;
int slot;
- const int needswap = ULFS_IPNEEDSWAP(ip);
int dirblksiz = ip->i_lfs->um_dirblksiz;
if ((dh = ip->i_dirhash) == NULL)
@@ -647,7 +650,7 @@ ulfsdirhash_add(struct inode *ip, struct
}
/* Find a free hash slot (empty or deleted), and add the entry. */
- slot = ulfsdirhash_hash(dh, dirp->d_name, dirp->d_namlen);
+ slot = ulfsdirhash_hash(dh, dirp->d_name, lfs_dir_getnamlen(fs, dirp));
while (DH_ENTRY(dh, slot) >= 0)
slot = WRAPINCR(slot, dh->dh_hlen);
if (DH_ENTRY(dh, slot) == DIRHASH_EMPTY)
@@ -655,7 +658,7 @@ ulfsdirhash_add(struct inode *ip, struct
DH_ENTRY(dh, slot) = offset;
/* Update the per-block summary info. */
- ulfsdirhash_adjfree(dh, offset, -LFS_DIRSIZ(0, dirp, needswap), dirblksiz);
+ ulfsdirhash_adjfree(dh, offset, -LFS_DIRSIZ(fs, dirp), dirblksiz);
DIRHASH_UNLOCK(dh);
}
@@ -667,9 +670,9 @@ ulfsdirhash_add(struct inode *ip, struct
void
ulfsdirhash_remove(struct inode *ip, struct lfs_direct *dirp, doff_t offset)
{
+ struct lfs *fs = ip->i_lfs;
struct dirhash *dh;
int slot;
- const int needswap = ULFS_IPNEEDSWAP(ip);
int dirblksiz = ip->i_lfs->um_dirblksiz;
if ((dh = ip->i_dirhash) == NULL)
@@ -684,13 +687,14 @@ ulfsdirhash_remove(struct inode *ip, str
KASSERT(offset < dh->dh_dirblks * dirblksiz);
/* Find the entry */
- slot = ulfsdirhash_findslot(dh, dirp->d_name, dirp->d_namlen, offset);
+ slot = ulfsdirhash_findslot(dh, dirp->d_name,
+ lfs_dir_getnamlen(fs, dirp), offset);
/* Remove the hash entry. */
ulfsdirhash_delslot(dh, slot);
/* Update the per-block summary info. */
- ulfsdirhash_adjfree(dh, offset, LFS_DIRSIZ(0, dirp, needswap), dirblksiz);
+ ulfsdirhash_adjfree(dh, offset, LFS_DIRSIZ(fs, dirp), dirblksiz);
DIRHASH_UNLOCK(dh);
}
@@ -702,6 +706,7 @@ void
ulfsdirhash_move(struct inode *ip, struct lfs_direct *dirp, doff_t oldoff,
doff_t newoff)
{
+ struct lfs *fs = ip->i_lfs;
struct dirhash *dh;
int slot;
@@ -717,7 +722,8 @@ ulfsdirhash_move(struct inode *ip, struc
KASSERT(oldoff < dh->dh_dirblks * ip->i_lfs->um_dirblksiz &&
newoff < dh->dh_dirblks * ip->i_lfs->um_dirblksiz);
/* Find the entry, and update the offset. */
- slot = ulfsdirhash_findslot(dh, dirp->d_name, dirp->d_namlen, oldoff);
+ slot = ulfsdirhash_findslot(dh, dirp->d_name,
+ lfs_dir_getnamlen(fs, dirp), oldoff);
DH_ENTRY(dh, slot) = newoff;
DIRHASH_UNLOCK(dh);
}
@@ -822,10 +828,10 @@ ulfsdirhash_dirtrunc(struct inode *ip, d
void
ulfsdirhash_checkblock(struct inode *ip, char *sbuf, doff_t offset)
{
+ struct lfs *fs = ip->i_lfs;
struct dirhash *dh;
struct lfs_direct *dp;
int block, ffslot, i, nfree;
- const int needswap = ULFS_IPNEEDSWAP(ip);
int dirblksiz = ip->i_lfs->um_dirblksiz;
if (!ulfs_dirhashcheck)
@@ -866,9 +872,10 @@ ulfsdirhash_checkblock(struct inode *ip,
}
/* Check that the entry exists (will panic if it doesn't). */
- ulfsdirhash_findslot(dh, dp->d_name, dp->d_namlen, offset + i);
+ ulfsdirhash_findslot(dh, dp->d_name, lfs_dir_getnamlen(fs, dp),
+ offset + i);
- nfree += dp->d_reclen - LFS_DIRSIZ(0, dp, needswap);
+ nfree += dp->d_reclen - LFS_DIRSIZ(fs, dp);
}
if (i != dirblksiz)
panic("ulfsdirhash_checkblock: bad dir end");
Index: src/sys/ufs/lfs/lfs_vfsops.c
diff -u src/sys/ufs/lfs/lfs_vfsops.c:1.344 src/sys/ufs/lfs/lfs_vfsops.c:1.345
--- src/sys/ufs/lfs/lfs_vfsops.c:1.344 Tue Sep 1 06:11:06 2015
+++ src/sys/ufs/lfs/lfs_vfsops.c Tue Sep 1 06:16:59 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: lfs_vfsops.c,v 1.344 2015/09/01 06:11:06 dholland Exp $ */
+/* $NetBSD: lfs_vfsops.c,v 1.345 2015/09/01 06:16:59 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.344 2015/09/01 06:11:06 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_vfsops.c,v 1.345 2015/09/01 06:16:59 dholland Exp $");
#if defined(_KERNEL_OPT)
#include "opt_lfs.h"
@@ -958,6 +958,7 @@ lfs_mountfs(struct vnode *devvp, struct
memcpy(&fs->lfs_dlfs_u.u_32, tdfs, sizeof(struct dlfs));
fs->lfs_is64 = false; /* XXX notyet */
fs->lfs_dobyteswap = false; /* XXX notyet */
+ fs->lfs_hasolddirfmt = false; /* set for real below */
/* Compatibility */
if (lfs_sb_getversion(fs) < 2) {
@@ -1065,6 +1066,8 @@ lfs_mountfs(struct vnode *devvp, struct
mp->mnt_fs_bshift = lfs_sb_getbshift(fs);
if (fs->um_maxsymlinklen > 0)
mp->mnt_iflag |= IMNT_DTYPE;
+ else
+ fs->lfs_hasolddirfmt = true;
ump->um_mountp = mp;
ump->um_dev = dev;
Index: src/sys/ufs/lfs/lfs_vnops.c
diff -u src/sys/ufs/lfs/lfs_vnops.c:1.288 src/sys/ufs/lfs/lfs_vnops.c:1.289
--- src/sys/ufs/lfs/lfs_vnops.c:1.288 Tue Sep 1 06:08:37 2015
+++ src/sys/ufs/lfs/lfs_vnops.c Tue Sep 1 06:16:59 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: lfs_vnops.c,v 1.288 2015/09/01 06:08:37 dholland Exp $ */
+/* $NetBSD: lfs_vnops.c,v 1.289 2015/09/01 06:16:59 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.288 2015/09/01 06:08:37 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.289 2015/09/01 06:16:59 dholland Exp $");
#ifdef _KERNEL_OPT
#include "opt_compat_netbsd.h"
@@ -944,19 +944,8 @@ lfs_mkdir(void *v)
ULFS_MPNEEDSWAP(fs));
dirtemplate.dotdot_reclen = ulfs_rw16(dirtemplate.dotdot_reclen,
ULFS_MPNEEDSWAP(fs));
- if (fs->um_maxsymlinklen <= 0) {
-#if BYTE_ORDER == LITTLE_ENDIAN
- if (ULFS_MPNEEDSWAP(fs) == 0)
-#else
- if (ULFS_MPNEEDSWAP(fs) != 0)
-#endif
- {
- dirtemplate.dot_type = dirtemplate.dot_namlen;
- dirtemplate.dotdot_type = dirtemplate.dotdot_namlen;
- dirtemplate.dot_namlen = dirtemplate.dotdot_namlen = 0;
- } else
- dirtemplate.dot_type = dirtemplate.dotdot_type = 0;
- }
+ lfs_dirt_settypes(fs, &dirtemplate, LFS_DT_DIR, LFS_DT_DIR);
+ lfs_dirt_setnamlens(fs, &dirtemplate, 1, 2);
if ((error = lfs_balloc(tvp, (off_t)0, dirblksiz, cnp->cn_cred,
B_CLRBUF, &bp)) != 0)
goto bad;
Index: src/sys/ufs/lfs/ulfs_extern.h
diff -u src/sys/ufs/lfs/ulfs_extern.h:1.15 src/sys/ufs/lfs/ulfs_extern.h:1.16
--- src/sys/ufs/lfs/ulfs_extern.h:1.15 Sun May 31 15:48:03 2015
+++ src/sys/ufs/lfs/ulfs_extern.h Tue Sep 1 06:16:59 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: ulfs_extern.h,v 1.15 2015/05/31 15:48:03 hannken Exp $ */
+/* $NetBSD: ulfs_extern.h,v 1.16 2015/09/01 06:16:59 dholland Exp $ */
/* from NetBSD: ufs_extern.h,v 1.72 2012/05/09 00:21:18 riastradh Exp */
/*-
@@ -114,6 +114,8 @@ void ulfs_dirbad(struct inode *, doff_t,
int ulfs_dirbadentry(struct vnode *, struct lfs_direct *, int);
void ulfs_makedirentry(struct inode *, struct componentname *,
struct lfs_direct *);
+void ulfs_makedirentry_bytype(struct lfs *, struct componentname *,
+ ino_t, unsigned /*dtype*/, struct lfs_direct *);
int ulfs_direnter(struct vnode *, const struct ulfs_lookup_results *,
struct vnode *, struct lfs_direct *,
struct componentname *, struct buf *);
Index: src/sys/ufs/lfs/ulfs_inode.c
diff -u src/sys/ufs/lfs/ulfs_inode.c:1.10 src/sys/ufs/lfs/ulfs_inode.c:1.11
--- src/sys/ufs/lfs/ulfs_inode.c:1.10 Sun May 31 15:48:03 2015
+++ src/sys/ufs/lfs/ulfs_inode.c Tue Sep 1 06:16:59 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: ulfs_inode.c,v 1.10 2015/05/31 15:48:03 hannken Exp $ */
+/* $NetBSD: ulfs_inode.c,v 1.11 2015/09/01 06:16:59 dholland Exp $ */
/* from NetBSD: ufs_inode.c,v 1.89 2013/01/22 09:39:18 dholland Exp */
/*
@@ -38,7 +38,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ulfs_inode.c,v 1.10 2015/05/31 15:48:03 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ulfs_inode.c,v 1.11 2015/09/01 06:16:59 dholland Exp $");
#if defined(_KERNEL_OPT)
#include "opt_lfs.h"
@@ -58,6 +58,8 @@ __KERNEL_RCSID(0, "$NetBSD: ulfs_inode.c
#include <sys/fstrans.h>
#include <sys/kmem.h>
+#include <ufs/lfs/lfs.h>
+#include <ufs/lfs/lfs_accessors.h>
#include <ufs/lfs/lfs_extern.h>
#include <ufs/lfs/ulfs_inode.h>
Index: src/sys/ufs/lfs/ulfs_lookup.c
diff -u src/sys/ufs/lfs/ulfs_lookup.c:1.25 src/sys/ufs/lfs/ulfs_lookup.c:1.26
--- src/sys/ufs/lfs/ulfs_lookup.c:1.25 Sat Jul 11 11:04:48 2015
+++ src/sys/ufs/lfs/ulfs_lookup.c Tue Sep 1 06:16:59 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: ulfs_lookup.c,v 1.25 2015/07/11 11:04:48 mlelstv Exp $ */
+/* $NetBSD: ulfs_lookup.c,v 1.26 2015/09/01 06:16:59 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.25 2015/07/11 11:04:48 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ulfs_lookup.c,v 1.26 2015/09/01 06:16:59 dholland Exp $");
#ifdef _KERNEL_OPT
#include "opt_lfs.h"
@@ -59,6 +59,8 @@ __KERNEL_RCSID(0, "$NetBSD: ulfs_lookup.
#include <sys/proc.h>
#include <sys/kmem.h>
+#include <ufs/lfs/lfs.h>
+#include <ufs/lfs/lfs_accessors.h>
#include <ufs/lfs/lfs_extern.h>
#include <ufs/lfs/ulfs_inode.h>
@@ -348,7 +350,7 @@ searchloop:
int size = ulfs_rw16(ep->d_reclen, needswap);
if (ep->d_ino != 0)
- size -= LFS_DIRSIZ(FSFMT(vdp), ep, needswap);
+ size -= LFS_DIRSIZ(fs, ep);
if (size > 0) {
if (size >= slotneeded) {
slotstatus = FOUND;
@@ -376,17 +378,7 @@ searchloop:
if (ep->d_ino) {
int namlen;
-#if (BYTE_ORDER == LITTLE_ENDIAN)
- if (FSFMT(vdp) && needswap == 0)
- namlen = ep->d_type;
- else
- namlen = ep->d_namlen;
-#else
- if (FSFMT(vdp) && needswap != 0)
- namlen = ep->d_type;
- else
- namlen = ep->d_namlen;
-#endif
+ namlen = lfs_dir_getnamlen(fs, ep);
if (namlen == cnp->cn_namelen &&
!memcmp(cnp->cn_nameptr, ep->d_name,
(unsigned)namlen)) {
@@ -397,7 +389,7 @@ foundentry:
* Save directory entry's inode number and
* reclen, and release directory buffer.
*/
- if (!FSFMT(vdp) && ep->d_type == LFS_DT_WHT) {
+ if (!FSFMT(vdp) && lfs_dir_gettype(fs, ep) == LFS_DT_WHT) {
slotstatus = FOUND;
slotoffset = results->ulr_offset;
slotsize = ulfs_rw16(ep->d_reclen,
@@ -528,10 +520,10 @@ found:
* Check that directory length properly reflects presence
* of this entry.
*/
- if (results->ulr_offset + LFS_DIRSIZ(FSFMT(vdp), ep, needswap) > dp->i_size) {
+ if (results->ulr_offset + LFS_DIRSIZ(fs, ep) > dp->i_size) {
ulfs_dirbad(dp, results->ulr_offset, "i_size too small");
dp->i_size =
- results->ulr_offset + LFS_DIRSIZ(FSFMT(vdp), ep, needswap);
+ results->ulr_offset + LFS_DIRSIZ(fs, ep);
DIP_ASSIGN(dp, size, dp->i_size);
dp->i_flag |= IN_CHANGE | IN_UPDATE;
}
@@ -679,28 +671,17 @@ ulfs_dirbadentry(struct vnode *dp, struc
const int needswap = ULFS_MPNEEDSWAP(fs);
int dirblksiz = fs->um_dirblksiz;
-#if (BYTE_ORDER == LITTLE_ENDIAN)
- if (FSFMT(dp) && needswap == 0)
- namlen = ep->d_type;
- else
- namlen = ep->d_namlen;
-#else
- if (FSFMT(dp) && needswap != 0)
- namlen = ep->d_type;
- else
- namlen = ep->d_namlen;
-#endif
+ 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(FSFMT(dp), ep, needswap) ||
+ ulfs_rw16(ep->d_reclen, needswap) < 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),
- (u_long)LFS_DIRSIZ(FSFMT(dp), ep, needswap),
+ (u_long)LFS_DIRSIZ(fs, ep),
namlen, dp->v_mount->mnt_flag, entryoffsetinblock,
dirblksiz);
goto bad;
@@ -724,19 +705,34 @@ bad:
* Construct a new directory entry after a call to namei, using the
* name in the componentname argument cnp. The argument ip is the
* inode to which the new directory entry will refer.
+ *
+ * Does not set d_reclen.
*/
void
ulfs_makedirentry(struct inode *ip, struct componentname *cnp,
struct lfs_direct *newdirp)
{
+ struct lfs *fs = ip->i_lfs;
+
newdirp->d_ino = ip->i_number;
- newdirp->d_namlen = cnp->cn_namelen;
memcpy(newdirp->d_name, cnp->cn_nameptr, (size_t)cnp->cn_namelen);
newdirp->d_name[cnp->cn_namelen] = '\0';
- if (FSFMT(ITOV(ip)))
- newdirp->d_type = 0;
- else
- newdirp->d_type = LFS_IFTODT(ip->i_mode);
+ lfs_dir_setnamlen(fs, newdirp, cnp->cn_namelen);
+ lfs_dir_settype(fs, newdirp, LFS_IFTODT(ip->i_mode));
+}
+
+/*
+ * Similar but for special inodes.
+ */
+void
+ulfs_makedirentry_bytype(struct lfs *fs, struct componentname *cnp,
+ ino_t inum, unsigned dtype, struct lfs_direct *newdirp)
+{
+ newdirp->d_ino = 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);
+ lfs_dir_settype(fs, newdirp, dtype);
}
/*
@@ -754,6 +750,12 @@ ulfs_makedirentry(struct inode *ip, stru
* The link count of the target inode is *not* incremented; the
* caller does that.
*
+ * DIRP should have been filled in by ulfs_makedirentry(). Manual
+ * initialization should be avoided, but if needed should be
+ * equivalent to ulfs_makedirentry in byteswapping, use of accessor
+ * functions, etc.; otherwise we might byteswap too many times or not
+ * enough.
+ *
* If ulr->ulr_count is 0, ulfs_lookup did not find space to insert the
* directory entry. ulr_offset, which is the place to put the entry,
* should be on a block boundary (and should be at the end of the
@@ -791,7 +793,7 @@ ulfs_direnter(struct vnode *dvp, const s
cr = cnp->cn_cred;
dp = VTOI(dvp);
- newentrysize = LFS_DIRSIZ(0, dirp, 0);
+ newentrysize = LFS_DIRSIZ(fs, dirp);
if (ulr->ulr_count == 0) {
/*
@@ -812,17 +814,7 @@ ulfs_direnter(struct vnode *dvp, const s
uvm_vnp_setsize(dvp, dp->i_size);
dirp->d_reclen = ulfs_rw16(dirblksiz, needswap);
dirp->d_ino = ulfs_rw32(dirp->d_ino, needswap);
- if (FSFMT(dvp)) {
-#if (BYTE_ORDER == LITTLE_ENDIAN)
- if (needswap == 0) {
-#else
- if (needswap != 0) {
-#endif
- u_char tmp = dirp->d_namlen;
- dirp->d_namlen = dirp->d_type;
- dirp->d_type = tmp;
- }
- }
+ /* 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
@@ -880,7 +872,7 @@ 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(FSFMT(dvp), ep, needswap) : 0;
+ 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; ) {
uint16_t reclen;
@@ -907,7 +899,7 @@ ulfs_direnter(struct vnode *dvp, const s
dsize = 0;
continue;
}
- dsize = LFS_DIRSIZ(FSFMT(dvp), nep, needswap);
+ dsize = LFS_DIRSIZ(fs, nep);
spacefree += reclen - dsize;
#ifdef LFS_DIRHASH
if (dp->i_dirhash != NULL)
@@ -928,7 +920,7 @@ ulfs_direnter(struct vnode *dvp, const s
*/
if (ep->d_ino == 0 ||
(ulfs_rw32(ep->d_ino, needswap) == ULFS_WINO &&
- memcmp(ep->d_name, dirp->d_name, dirp->d_namlen) == 0)) {
+ 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;
@@ -941,17 +933,7 @@ ulfs_direnter(struct vnode *dvp, const s
}
dirp->d_reclen = ulfs_rw16(dirp->d_reclen, needswap);
dirp->d_ino = ulfs_rw32(dirp->d_ino, needswap);
- if (FSFMT(dvp)) {
-#if (BYTE_ORDER == LITTLE_ENDIAN)
- if (needswap == 0) {
-#else
- if (needswap != 0) {
-#endif
- u_char tmp = dirp->d_namlen;
- dirp->d_namlen = dirp->d_type;
- dirp->d_type = tmp;
- }
- }
+ /* d_type/d_namlen are handled in ulfs_makedirentry */
#ifdef LFS_DIRHASH
if (dp->i_dirhash != NULL && (ep->d_ino == 0 ||
dirp->d_reclen == spacefree))
@@ -1023,6 +1005,7 @@ ulfs_dirremove(struct vnode *dvp, const
struct inode *ip, int flags, int isrmdir)
{
struct inode *dp = VTOI(dvp);
+ struct lfs *fs = dp->i_lfs;
struct lfs_direct *ep;
struct buf *bp;
int error;
@@ -1037,7 +1020,7 @@ ulfs_dirremove(struct vnode *dvp, const
if (error)
return (error);
ep->d_ino = ulfs_rw32(ULFS_WINO, needswap);
- ep->d_type = LFS_DT_WHT;
+ lfs_dir_settype(fs, ep, LFS_DT_WHT);
goto out;
}
@@ -1126,6 +1109,7 @@ ulfs_dirrewrite(struct inode *dp, off_t
struct inode *oip, ino_t newinum, int newtype,
int isrmdir, int iflags)
{
+ struct lfs *fs = dp->i_lfs;
struct buf *bp;
struct lfs_direct *ep;
struct vnode *vdp = ITOV(dp);
@@ -1135,8 +1119,7 @@ ulfs_dirrewrite(struct inode *dp, off_t
if (error)
return (error);
ep->d_ino = ulfs_rw32(newinum, ULFS_IPNEEDSWAP(dp));
- if (!FSFMT(vdp))
- ep->d_type = newtype;
+ lfs_dir_settype(fs, ep, newtype);
oip->i_nlink--;
DIP_ASSIGN(oip, nlink, oip->i_nlink);
oip->i_flag |= IN_CHANGE;
@@ -1164,6 +1147,7 @@ ulfs_dirrewrite(struct inode *dp, off_t
int
ulfs_dirempty(struct inode *ip, ino_t parentino, kauth_cred_t cred)
{
+ struct lfs *fs = ip->i_lfs;
doff_t off;
struct lfs_dirtemplate dbuf;
struct lfs_direct *dp = (struct lfs_direct *)&dbuf;
@@ -1189,17 +1173,7 @@ ulfs_dirempty(struct inode *ip, ino_t pa
if (dp->d_ino == 0 || ulfs_rw32(dp->d_ino, needswap) == ULFS_WINO)
continue;
/* accept only "." and ".." */
-#if (BYTE_ORDER == LITTLE_ENDIAN)
- if (FSFMT(ITOV(ip)) && needswap == 0)
- namlen = dp->d_type;
- else
- namlen = dp->d_namlen;
-#else
- if (FSFMT(ITOV(ip)) && needswap != 0)
- namlen = dp->d_type;
- else
- namlen = dp->d_namlen;
-#endif
+ namlen = lfs_dir_getnamlen(fs, dp);
if (namlen > 2)
return (0);
if (dp->d_name[0] != '.')
Index: src/sys/ufs/lfs/ulfs_vfsops.c
diff -u src/sys/ufs/lfs/ulfs_vfsops.c:1.9 src/sys/ufs/lfs/ulfs_vfsops.c:1.10
--- src/sys/ufs/lfs/ulfs_vfsops.c:1.9 Sun May 31 15:48:03 2015
+++ src/sys/ufs/lfs/ulfs_vfsops.c Tue Sep 1 06:16:59 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: ulfs_vfsops.c,v 1.9 2015/05/31 15:48:03 hannken Exp $ */
+/* $NetBSD: ulfs_vfsops.c,v 1.10 2015/09/01 06:16:59 dholland Exp $ */
/* from NetBSD: ufs_vfsops.c,v 1.52 2013/01/22 09:39:18 dholland Exp */
/*
@@ -38,7 +38,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ulfs_vfsops.c,v 1.9 2015/05/31 15:48:03 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ulfs_vfsops.c,v 1.10 2015/09/01 06:16:59 dholland Exp $");
#if defined(_KERNEL_OPT)
#include "opt_lfs.h"
@@ -58,6 +58,7 @@ __KERNEL_RCSID(0, "$NetBSD: ulfs_vfsops.
#include <miscfs/specfs/specdev.h>
#include <ufs/lfs/lfs.h>
+#include <ufs/lfs/lfs_accessors.h>
#include <ufs/lfs/ulfs_quotacommon.h>
#include <ufs/lfs/ulfs_inode.h>
#include <ufs/lfs/ulfsmount.h>
Index: src/sys/ufs/lfs/ulfs_vnops.c
diff -u src/sys/ufs/lfs/ulfs_vnops.c:1.27 src/sys/ufs/lfs/ulfs_vnops.c:1.28
--- src/sys/ufs/lfs/ulfs_vnops.c:1.27 Tue Sep 1 06:08:37 2015
+++ src/sys/ufs/lfs/ulfs_vnops.c Tue Sep 1 06:16:59 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: ulfs_vnops.c,v 1.27 2015/09/01 06:08:37 dholland Exp $ */
+/* $NetBSD: ulfs_vnops.c,v 1.28 2015/09/01 06:16:59 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.27 2015/09/01 06:08:37 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ulfs_vnops.c,v 1.28 2015/09/01 06:16:59 dholland Exp $");
#if defined(_KERNEL_OPT)
#include "opt_lfs.h"
@@ -97,6 +97,10 @@ __KERNEL_RCSID(0, "$NetBSD: ulfs_vnops.c
#include <miscfs/fifofs/fifo.h>
#include <miscfs/genfs/genfs.h>
+#include <ufs/lfs/lfs_extern.h>
+#include <ufs/lfs/lfs.h>
+#include <ufs/lfs/lfs_accessors.h>
+
#include <ufs/lfs/ulfs_inode.h>
#include <ufs/lfs/ulfsmount.h>
#include <ufs/lfs/ulfs_bswap.h>
@@ -104,9 +108,6 @@ __KERNEL_RCSID(0, "$NetBSD: ulfs_vnops.c
#ifdef LFS_DIRHASH
#include <ufs/lfs/ulfs_dirhash.h>
#endif
-#include <ufs/lfs/lfs_extern.h>
-#include <ufs/lfs/lfs.h>
-#include <ufs/lfs/lfs_accessors.h>
#include <uvm/uvm.h>
@@ -646,12 +647,8 @@ ulfs_whiteout(void *v)
#endif
newdir = pool_cache_get(ulfs_direct_cache, PR_WAITOK);
- newdir->d_ino = ULFS_WINO;
- newdir->d_namlen = cnp->cn_namelen;
- memcpy(newdir->d_name, cnp->cn_nameptr,
- (size_t)cnp->cn_namelen);
- newdir->d_name[cnp->cn_namelen] = '\0';
- newdir->d_type = LFS_DT_WHT;
+ ulfs_makedirentry_bytype(fs, cnp, ULFS_WINO, LFS_DT_WHT,
+ newdir);
error = ulfs_direnter(dvp, ulr, NULL, newdir, cnp, NULL);
pool_cache_put(ulfs_direct_cache, newdir);
break;
@@ -798,11 +795,6 @@ ulfs_readdir(void *v)
struct ulfsmount *ump = VFSTOULFS(vp->v_mount);
struct lfs *fs = ump->um_lfs;
int nswap = ULFS_MPNEEDSWAP(fs);
-#if BYTE_ORDER == LITTLE_ENDIAN
- int needswap = fs->um_maxsymlinklen <= 0 && nswap == 0;
-#else
- int needswap = fs->um_maxsymlinklen <= 0 && nswap != 0;
-#endif
uio = ap->a_uio;
count = uio->uio_resid;
rcount = count - ((uio->uio_offset + count) & (fs->um_dirblksiz - 1));
@@ -873,13 +865,8 @@ ulfs_readdir(void *v)
cdp = ecdp;
break;
}
- if (needswap) {
- ndp->d_type = cdp->d_namlen;
- ndp->d_namlen = cdp->d_type;
- } else {
- ndp->d_type = cdp->d_type;
- ndp->d_namlen = cdp->d_namlen;
- }
+ ndp->d_type = lfs_dir_gettype(fs, cdp);
+ ndp->d_namlen = lfs_dir_getnamlen(fs, cdp);
ndp->d_reclen = _DIRENT_RECLEN(ndp, ndp->d_namlen);
if ((char *)(void *)ndp + ndp->d_reclen +
_DIRENT_MINSIZE(ndp) > endp)