Module Name:    src
Committed By:   dholland
Date:           Mon Sep 21 01:22:18 UTC 2015

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

Log Message:
Oops; LFS_DIRECTSIZ() is going to need the fs as an argument.

Also, it turns out that dirhash needs a compile-time-constant version
of LFS_DIRECTSIZ(LFS_MAXNAMLEN+1), independent of 64-vs-32, so create
LFS_MAXDIRENTRYSIZE for this. Sigh.


To generate a diff of this commit:
cvs rdiff -u -r1.44 -r1.45 src/sbin/fsck_lfs/dir.c
cvs rdiff -u -r1.32 -r1.33 src/sbin/fsck_lfs/pass2.c
cvs rdiff -u -r1.54 -r1.55 src/sbin/newfs_lfs/make_lfs.c
cvs rdiff -u -r1.29 -r1.30 src/sys/ufs/lfs/lfs_accessors.h
cvs rdiff -u -r1.14 -r1.15 src/sys/ufs/lfs/lfs_rename.c
cvs rdiff -u -r1.291 -r1.292 src/sys/ufs/lfs/lfs_vnops.c
cvs rdiff -u -r1.12 -r1.13 src/sys/ufs/lfs/ulfs_dirhash.c
cvs rdiff -u -r1.6 -r1.7 src/sys/ufs/lfs/ulfs_dirhash.h
cvs rdiff -u -r1.32 -r1.33 src/sys/ufs/lfs/ulfs_lookup.c \
    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.44 src/sbin/fsck_lfs/dir.c:1.45
--- src/sbin/fsck_lfs/dir.c:1.44	Sun Sep 20 04:51:43 2015
+++ src/sbin/fsck_lfs/dir.c	Mon Sep 21 01:22:18 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: dir.c,v 1.44 2015/09/20 04:51:43 dholland Exp $	 */
+/* $NetBSD: dir.c,v 1.45 2015/09/21 01:22:18 dholland Exp $	 */
 
 /*
  * Copyright (c) 1980, 1986, 1993
@@ -376,7 +376,7 @@ mkentry(struct inodesc *idesc)
 
 	/* figure the length needed for id_name */
 	namlen = strlen(idesc->id_name);
-	newreclen = LFS_DIRECTSIZ(namlen);
+	newreclen = LFS_DIRECTSIZ(fs, namlen);
 
 	/* find the minimum record length for the existing name */
 	if (lfs_dir_getino(fs, dirp) != 0)
@@ -688,19 +688,19 @@ allocdir(ino_t parent, ino_t request, in
 	dirp = (struct lfs_dirheader *)bp->b_data;
 	/* . */
 	lfs_dir_setino(fs, dirp, ino);
-	lfs_dir_setreclen(fs, dirp, LFS_DIRECTSIZ(1));
+	lfs_dir_setreclen(fs, dirp, LFS_DIRECTSIZ(fs, 1));
 	lfs_dir_settype(fs, dirp, LFS_DT_DIR);
 	lfs_dir_setnamlen(fs, dirp, 1);
 	lfs_copydirname(fs, lfs_dir_nameptr(fs, dirp), ".", 1,
-			LFS_DIRECTSIZ(1));
+			LFS_DIRECTSIZ(fs, 1));
 	/* .. */
 	dirp = LFS_NEXTDIR(fs, dirp);
 	lfs_dir_setino(fs, dirp, parent);
-	lfs_dir_setreclen(fs, dirp, LFS_DIRBLKSIZ - LFS_DIRECTSIZ(1));
+	lfs_dir_setreclen(fs, dirp, LFS_DIRBLKSIZ - LFS_DIRECTSIZ(fs, 1));
 	lfs_dir_settype(fs, dirp, LFS_DT_DIR);
 	lfs_dir_setnamlen(fs, dirp, 2);
 	lfs_copydirname(fs, lfs_dir_nameptr(fs, dirp), "..", 2,
-			LFS_DIRBLKSIZ - LFS_DIRECTSIZ(1));
+			LFS_DIRBLKSIZ - LFS_DIRECTSIZ(fs, 1));
 	for (cp = &bp->b_data[LFS_DIRBLKSIZ];
 	    cp < &bp->b_data[lfs_sb_getfsize(fs)];
 	    cp += LFS_DIRBLKSIZ) {

Index: src/sbin/fsck_lfs/pass2.c
diff -u src/sbin/fsck_lfs/pass2.c:1.32 src/sbin/fsck_lfs/pass2.c:1.33
--- src/sbin/fsck_lfs/pass2.c:1.32	Tue Sep 15 15:02:25 2015
+++ src/sbin/fsck_lfs/pass2.c	Mon Sep 21 01:22:18 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: pass2.c,v 1.32 2015/09/15 15:02:25 dholland Exp $	 */
+/* $NetBSD: pass2.c,v 1.33 2015/09/21 01:22:18 dholland Exp $	 */
 
 /*
  * Copyright (c) 1980, 1986, 1993
@@ -247,7 +247,7 @@ pass2check(struct inodesc * idesc)
 	lfs_dir_setino(fs, &proto, idesc->id_number);
 	lfs_dir_settype(fs, &proto, LFS_DT_DIR);
 	lfs_dir_setnamlen(fs, &proto, 1);
-	entrysize = LFS_DIRECTSIZ(1);
+	entrysize = LFS_DIRECTSIZ(fs, 1);
 	lfs_dir_setreclen(fs, &proto, entrysize);
 	if (lfs_dir_getino(fs, dirp) != 0 && strcmp(lfs_dir_nameptr(fs, dirp), "..") != 0) {
 		pfatal("CANNOT FIX, FIRST ENTRY IN DIRECTORY CONTAINS %s\n",
@@ -283,7 +283,7 @@ chk1:
 	lfs_dir_setino(fs, &proto, inp->i_parent);
 	lfs_dir_settype(fs, &proto, LFS_DT_DIR);
 	lfs_dir_setnamlen(fs, &proto, 2);
-	entrysize = LFS_DIRECTSIZ(2);
+	entrysize = LFS_DIRECTSIZ(fs, 2);
 	lfs_dir_setreclen(fs, &proto, entrysize);
 	if (idesc->id_entryno == 0) {
 		n = LFS_DIRSIZ(fs, dirp);

Index: src/sbin/newfs_lfs/make_lfs.c
diff -u src/sbin/newfs_lfs/make_lfs.c:1.54 src/sbin/newfs_lfs/make_lfs.c:1.55
--- src/sbin/newfs_lfs/make_lfs.c:1.54	Tue Sep 15 15:02:25 2015
+++ src/sbin/newfs_lfs/make_lfs.c	Mon Sep 21 01:22:18 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: make_lfs.c,v 1.54 2015/09/15 15:02:25 dholland Exp $	*/
+/*	$NetBSD: make_lfs.c,v 1.55 2015/09/21 01:22:18 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.54 2015/09/15 15:02:25 dholland Exp $");
+__RCSID("$NetBSD: make_lfs.c,v 1.55 2015/09/21 01:22:18 dholland Exp $");
 #endif
 #endif /* not lint */
 
@@ -366,7 +366,7 @@ make_dir(struct lfs *fs, void *bufp,
 	ep = bufp;
 	for (i = 0; i < numentries; i++) {
 		namlen = strlen(protodir[i].dp_name);
-		reclen = LFS_DIRECTSIZ(namlen);
+		reclen = LFS_DIRECTSIZ(fs, namlen);
 		if (spaceleft < reclen)
 			fatal("%s: %s", special, "directory too big");
 

Index: src/sys/ufs/lfs/lfs_accessors.h
diff -u src/sys/ufs/lfs/lfs_accessors.h:1.29 src/sys/ufs/lfs/lfs_accessors.h:1.30
--- src/sys/ufs/lfs/lfs_accessors.h:1.29	Sun Sep 20 04:51:43 2015
+++ src/sys/ufs/lfs/lfs_accessors.h	Mon Sep 21 01:22:18 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_accessors.h,v 1.29 2015/09/20 04:51:43 dholland Exp $	*/
+/*	$NetBSD: lfs_accessors.h,v 1.30 2015/09/21 01:22:18 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  */
@@ -222,9 +222,17 @@
  * 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) \
+#define	LFS_DIRECTSIZ(fs, namlen) \
 	(sizeof(struct lfs_dirheader) + (((namlen)+1 + 3) &~ 3))
 
+/*
+ * The size of the largest possible directory entry. This is
+ * used by ulfs_dirhash to figure the size of an array, so we
+ * need a single constant value true for both lfs32 and lfs64.
+ */
+#define LFS_MAXDIRENTRYSIZE \
+	(sizeof(struct lfs_dirheader) + (((LFS_MAXNAMLEN+1)+1 + 3) & ~3))
+
 #if (BYTE_ORDER == LITTLE_ENDIAN)
 #define LFS_OLDDIRSIZ(oldfmt, dp, needswap)	\
     (((oldfmt) && !(needswap)) ?		\
@@ -235,7 +243,7 @@
     LFS_DIRECTSIZ((dp)->d_type) : LFS_DIRECTSIZ((dp)->d_namlen))
 #endif
 
-#define LFS_DIRSIZ(fs, dp) LFS_DIRECTSIZ(lfs_dir_getnamlen(fs, dp))
+#define LFS_DIRSIZ(fs, dp) LFS_DIRECTSIZ(fs, lfs_dir_getnamlen(fs, dp))
 
 /* Constants for the first argument of LFS_OLDDIRSIZ */
 #define LFS_OLDDIRFMT	1

Index: src/sys/ufs/lfs/lfs_rename.c
diff -u src/sys/ufs/lfs/lfs_rename.c:1.14 src/sys/ufs/lfs/lfs_rename.c:1.15
--- src/sys/ufs/lfs/lfs_rename.c:1.14	Sun Sep 20 04:51:43 2015
+++ src/sys/ufs/lfs/lfs_rename.c	Mon Sep 21 01:22:18 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_rename.c,v 1.14 2015/09/20 04:51:43 dholland Exp $	*/
+/*	$NetBSD: lfs_rename.c,v 1.15 2015/09/21 01:22:18 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.14 2015/09/20 04:51:43 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_rename.c,v 1.15 2015/09/21 01:22:18 dholland Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -942,7 +942,7 @@ ulfs_gro_rename(struct mount *mp, kauth_
 		 * the position is the record length of the . entry,
 		 * namely LFS_DIRECTSIZ(1).
 		 */
-		position = LFS_DIRECTSIZ(1);
+		position = LFS_DIRECTSIZ(fs, 1);
 		error = ulfs_dirrewrite(VTOI(fvp), position,
 		    VTOI(fdvp), VTOI(tdvp)->i_number, LFS_DT_DIR, 0, IN_CHANGE);
 #if 0		/* XXX This branch was not in ulfs_rename! */

Index: src/sys/ufs/lfs/lfs_vnops.c
diff -u src/sys/ufs/lfs/lfs_vnops.c:1.291 src/sys/ufs/lfs/lfs_vnops.c:1.292
--- src/sys/ufs/lfs/lfs_vnops.c:1.291	Sun Sep 20 04:51:43 2015
+++ src/sys/ufs/lfs/lfs_vnops.c	Mon Sep 21 01:22:18 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_vnops.c,v 1.291 2015/09/20 04:51:43 dholland Exp $	*/
+/*	$NetBSD: lfs_vnops.c,v 1.292 2015/09/21 01:22:18 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.291 2015/09/20 04:51:43 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.292 2015/09/21 01:22:18 dholland Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_compat_netbsd.h"
@@ -942,19 +942,19 @@ lfs_mkdir(void *v)
 
 	/* . */
 	lfs_dir_setino(fs, dirp, ip->i_number);
-	lfs_dir_setreclen(fs, dirp, LFS_DIRECTSIZ(1));
+	lfs_dir_setreclen(fs, dirp, LFS_DIRECTSIZ(fs, 1));
 	lfs_dir_settype(fs, dirp, LFS_DT_DIR);
 	lfs_dir_setnamlen(fs, dirp, 1);
 	lfs_copydirname(fs, lfs_dir_nameptr(fs, dirp), ".", 1,
-			LFS_DIRECTSIZ(1));
+			LFS_DIRECTSIZ(fs, 1));
 	dirp = LFS_NEXTDIR(fs, dirp);
 	/* .. */
 	lfs_dir_setino(fs, dirp, dp->i_number);
-	lfs_dir_setreclen(fs, dirp, dirblksiz - LFS_DIRECTSIZ(1));
+	lfs_dir_setreclen(fs, dirp, dirblksiz - LFS_DIRECTSIZ(fs, 1));
 	lfs_dir_settype(fs, dirp, LFS_DT_DIR);
 	lfs_dir_setnamlen(fs, dirp, 2);
 	lfs_copydirname(fs, lfs_dir_nameptr(fs, dirp), "..", 2,
-			dirblksiz - LFS_DIRECTSIZ(1));
+			dirblksiz - LFS_DIRECTSIZ(fs, 1));
 
 	/*
 	 * Directory set up; now install its entry in the parent directory.

Index: src/sys/ufs/lfs/ulfs_dirhash.c
diff -u src/sys/ufs/lfs/ulfs_dirhash.c:1.12 src/sys/ufs/lfs/ulfs_dirhash.c:1.13
--- src/sys/ufs/lfs/ulfs_dirhash.c:1.12	Tue Sep 15 15:02:25 2015
+++ src/sys/ufs/lfs/ulfs_dirhash.c	Mon Sep 21 01:22:18 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: ulfs_dirhash.c,v 1.12 2015/09/15 15:02:25 dholland Exp $	*/
+/*	$NetBSD: ulfs_dirhash.c,v 1.13 2015/09/21 01:22:18 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.12 2015/09/15 15:02:25 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ulfs_dirhash.c,v 1.13 2015/09/21 01:22:18 dholland Exp $");
 
 /*
  * This implements a hash-based lookup scheme for ULFS directories.
@@ -148,7 +148,7 @@ ulfsdirhash_build(struct inode *ip)
 	vp = ip->i_vnode;
 	/* Allocate 50% more entries than this dir size could ever need. */
 	KASSERT(ip->i_size >= dirblksiz);
-	nslots = ip->i_size / LFS_DIRECTSIZ(1);
+	nslots = ip->i_size / LFS_DIRECTSIZ(fs, 1);
 	nslots = (nslots * 3 + 1) / 2;
 	narrays = howmany(nslots, DH_NBLKOFF);
 	nslots = narrays * DH_NBLKOFF;

Index: src/sys/ufs/lfs/ulfs_dirhash.h
diff -u src/sys/ufs/lfs/ulfs_dirhash.h:1.6 src/sys/ufs/lfs/ulfs_dirhash.h:1.7
--- src/sys/ufs/lfs/ulfs_dirhash.h:1.6	Tue Sep 15 15:02:25 2015
+++ src/sys/ufs/lfs/ulfs_dirhash.h	Mon Sep 21 01:22:18 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: ulfs_dirhash.h,v 1.6 2015/09/15 15:02:25 dholland Exp $	*/
+/*	$NetBSD: ulfs_dirhash.h,v 1.7 2015/09/21 01:22:18 dholland Exp $	*/
 /*  from NetBSD: dirhash.h,v 1.6 2008/06/04 11:33:19 ad Exp  */
 
 /*
@@ -48,8 +48,8 @@
 #define DIRHASH_DEL	(-2)	/* deleted entry; may be part of chain */
 
 #define DIRALIGN	4
-#define DH_NFSTATS	(LFS_DIRECTSIZ(LFS_MAXNAMLEN + 1) / DIRALIGN)
-				 /* max DIRALIGN words in a directory entry */
+#define DH_NFSTATS	(LFS_MAXDIRENTRYSIZE / DIRALIGN)
+			 /* max DIRALIGN words in a directory entry */
 
 /*
  * Dirhash uses a score mechanism to achieve a hybrid between a

Index: src/sys/ufs/lfs/ulfs_lookup.c
diff -u src/sys/ufs/lfs/ulfs_lookup.c:1.32 src/sys/ufs/lfs/ulfs_lookup.c:1.33
--- src/sys/ufs/lfs/ulfs_lookup.c:1.32	Tue Sep 15 15:02:25 2015
+++ src/sys/ufs/lfs/ulfs_lookup.c	Mon Sep 21 01:22:18 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: ulfs_lookup.c,v 1.32 2015/09/15 15:02:25 dholland Exp $	*/
+/*	$NetBSD: ulfs_lookup.c,v 1.33 2015/09/21 01:22:18 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.32 2015/09/15 15:02:25 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ulfs_lookup.c,v 1.33 2015/09/21 01:22:18 dholland Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_lfs.h"
@@ -221,7 +221,7 @@ ulfs_lookup(void *v)
 	slotfreespace = slotsize = slotneeded = 0;
 	if ((nameiop == CREATE || nameiop == RENAME) && (flags & ISLASTCN)) {
 		slotstatus = NONE;
-		slotneeded = LFS_DIRECTSIZ(cnp->cn_namelen);
+		slotneeded = LFS_DIRECTSIZ(fs, cnp->cn_namelen);
 	}
 
 	/*
@@ -783,7 +783,7 @@ ulfs_direnter(struct vnode *dvp, const s
 	cr = cnp->cn_cred;
 
 	dp = VTOI(dvp);
-	newentrysize = LFS_DIRECTSIZ(namlen);
+	newentrysize = LFS_DIRECTSIZ(fs, namlen);
 
 	if (ulr->ulr_count == 0) {
 		/*
Index: src/sys/ufs/lfs/ulfs_vnops.c
diff -u src/sys/ufs/lfs/ulfs_vnops.c:1.32 src/sys/ufs/lfs/ulfs_vnops.c:1.33
--- src/sys/ufs/lfs/ulfs_vnops.c:1.32	Tue Sep 15 15:02:25 2015
+++ src/sys/ufs/lfs/ulfs_vnops.c	Mon Sep 21 01:22:18 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: ulfs_vnops.c,v 1.32 2015/09/15 15:02:25 dholland Exp $	*/
+/*	$NetBSD: ulfs_vnops.c,v 1.33 2015/09/21 01:22:18 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.32 2015/09/15 15:02:25 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ulfs_vnops.c,v 1.33 2015/09/21 01:22:18 dholland Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_lfs.h"
@@ -791,7 +791,7 @@ ulfs_readdir(void *v)
 	count = uio->uio_resid;
 	rcount = count - ((uio->uio_offset + count) & (fs->um_dirblksiz - 1));
 
-	if (rcount < LFS_DIRECTSIZ(0) || count < _DIRENT_MINSIZE(ndp))
+	if (rcount < LFS_DIRECTSIZ(fs, 0) || count < _DIRENT_MINSIZE(ndp))
 		return EINVAL;
 
 	startoff = uio->uio_offset & ~(fs->um_dirblksiz - 1);

Reply via email to