Module Name:    src
Committed By:   dholland
Date:           Mon Sep 21 01:24:58 UTC 2015

Modified Files:
        src/sbin/dump_lfs: lfs_inode.c
        src/sbin/newfs_lfs: make_lfs.c
        src/sys/ufs/lfs: lfs_accessors.h

Log Message:
Fix some assorted 32-bit assumptions not yet otherwise handled.

Also apply patch to fix the overt problem in PR 50246: newfs was
calculating ifpb wrong for volumes with non-default block sizes.


To generate a diff of this commit:
cvs rdiff -u -r1.26 -r1.27 src/sbin/dump_lfs/lfs_inode.c
cvs rdiff -u -r1.56 -r1.57 src/sbin/newfs_lfs/make_lfs.c
cvs rdiff -u -r1.32 -r1.33 src/sys/ufs/lfs/lfs_accessors.h

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

Modified files:

Index: src/sbin/dump_lfs/lfs_inode.c
diff -u src/sbin/dump_lfs/lfs_inode.c:1.26 src/sbin/dump_lfs/lfs_inode.c:1.27
--- src/sbin/dump_lfs/lfs_inode.c:1.26	Tue Sep  1 06:12:04 2015
+++ src/sbin/dump_lfs/lfs_inode.c	Mon Sep 21 01:24:58 2015
@@ -1,4 +1,4 @@
-/*      $NetBSD: lfs_inode.c,v 1.26 2015/09/01 06:12:04 dholland Exp $ */
+/*      $NetBSD: lfs_inode.c,v 1.27 2015/09/21 01:24:58 dholland Exp $ */
 
 /*-
  * Copyright (c) 1980, 1991, 1993, 1994
@@ -39,7 +39,7 @@ __COPYRIGHT("@(#) Copyright (c) 1980, 19
 #if 0
 static char sccsid[] = "@(#)main.c      8.6 (Berkeley) 5/1/95";
 #else
-__RCSID("$NetBSD: lfs_inode.c,v 1.26 2015/09/01 06:12:04 dholland Exp $");
+__RCSID("$NetBSD: lfs_inode.c,v 1.27 2015/09/21 01:24:58 dholland Exp $");
 #endif
 #endif /* not lint */
 
@@ -239,8 +239,7 @@ lfs_bmap(struct lfs *fs, union lfs_dinod
 				return UNASSIGNED;
 			/* printf("lbn %d: parent is the triple\n", -lbn); */
 			bread(LFS_FSBTODB(sblock, up), bp, lfs_sb_getbsize(sblock));
-			/* XXX ondisk32 */
-			return (daddr_t)((int32_t *)bp)[off];
+			return lfs_iblock_get(fs, bp, off);
 		} else /* residue == 0 */ {
 			/* Single indirect.  Two cases. */
 			if(lbn < BASE_TINDIR) {
@@ -272,8 +271,7 @@ lfs_bmap(struct lfs *fs, union lfs_dinod
 	if(up == UNASSIGNED || up == LFS_UNUSED_DADDR)
 		return UNASSIGNED;
 	bread(LFS_FSBTODB(sblock, up), bp, lfs_sb_getbsize(sblock));
-	/* XXX ondisk32 */
-	return (daddr_t)((int32_t *)bp)[off];
+	return lfs_iblock_get(fs, bp, off);
 }
 
 static IFILE *

Index: src/sbin/newfs_lfs/make_lfs.c
diff -u src/sbin/newfs_lfs/make_lfs.c:1.56 src/sbin/newfs_lfs/make_lfs.c:1.57
--- src/sbin/newfs_lfs/make_lfs.c:1.56	Mon Sep 21 01:24:23 2015
+++ src/sbin/newfs_lfs/make_lfs.c	Mon Sep 21 01:24:58 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: make_lfs.c,v 1.56 2015/09/21 01:24:23 dholland Exp $	*/
+/*	$NetBSD: make_lfs.c,v 1.57 2015/09/21 01:24: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.56 2015/09/21 01:24:23 dholland Exp $");
+__RCSID("$NetBSD: make_lfs.c,v 1.57 2015/09/21 01:24:58 dholland Exp $");
 #endif
 #endif /* not lint */
 
@@ -268,19 +268,17 @@ void pwarn(const char *, ...);
 static void make_dinode(ino_t, union lfs_dinode *, int, struct lfs *);
 static void make_dir(struct lfs *, void *,
 		const struct dirproto *, unsigned);
-static uint64_t maxfilesize(int);
 
 /*
  * calculate the maximum file size allowed with the specified block shift.
  */
 static uint64_t
-maxfilesize(int bshift)
+maxfilesize(struct lfs *fs, int bshift)
 {
 	uint64_t nptr; /* number of block pointers per block */
 	uint64_t maxblock;
 
-	/* XXX ondisk32 */
-	nptr = (1 << bshift) / sizeof(uint32_t);
+	nptr = (1 << bshift) / LFS_BLKPTRSIZE(fs);
 	maxblock = ULFS_NDADDR + nptr + nptr * nptr + nptr * nptr * nptr;
 
 	return maxblock << bshift;
@@ -522,9 +520,8 @@ make_lfs(int devfd, uint secsize, struct
 		lfs_sb_setfrag(fs, lfs_numfrags(fs, bsize));
 		lfs_sb_setfbmask(fs, lfs_sb_getfrag(fs) - 1);
 		lfs_sb_setfbshift(fs, lfs_log2(lfs_sb_getfrag(fs)));
-		lfs_sb_setifpb(fs, bsize / sizeof(IFILE));
-		/* XXX ondisk32 */
-		lfs_sb_setnindir(fs, bsize / sizeof(int32_t));
+		lfs_sb_setifpb(fs, bsize / IFILE_ENTRYSIZE(fs));
+		lfs_sb_setnindir(fs, bsize / LFS_BLKPTRSIZE(fs));
 	}
 
 	if (lfs_sb_getversion(fs) == 1) {
@@ -597,7 +594,7 @@ make_lfs(int devfd, uint secsize, struct
 	lfs_sb_setnseg(fs, lfs_sb_getdsize(fs) / lfs_segtod(fs, 1));
 
 	lfs_sb_setnclean(fs, lfs_sb_getnseg(fs) - 1);
-	lfs_sb_setmaxfilesize(fs, maxfilesize(lfs_sb_getbshift(fs)));
+	lfs_sb_setmaxfilesize(fs, maxfilesize(fs, lfs_sb_getbshift(fs)));
 
 	if (minfreeseg == 0)
 		lfs_sb_setminfreeseg(fs, lfs_sb_getnseg(fs) / DFL_MIN_FREE_SEGS);

Index: src/sys/ufs/lfs/lfs_accessors.h
diff -u src/sys/ufs/lfs/lfs_accessors.h:1.32 src/sys/ufs/lfs/lfs_accessors.h:1.33
--- src/sys/ufs/lfs/lfs_accessors.h:1.32	Mon Sep 21 01:24:39 2015
+++ src/sys/ufs/lfs/lfs_accessors.h	Mon Sep 21 01:24:58 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_accessors.h,v 1.32 2015/09/21 01:24:39 dholland Exp $	*/
+/*	$NetBSD: lfs_accessors.h,v 1.33 2015/09/21 01:24:58 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  */
@@ -770,6 +770,9 @@ lfs_fi_setblock(STRUCT_LFS *fs, FINFO *f
  * Index file inode entries.
  */
 
+#define IFILE_ENTRYSIZE(fs) \
+	((fs)->lfs_is64 ? sizeof(IFILE64) : sizeof(IFILE32))
+
 /*
  * LFSv1 compatibility code is not allowed to touch if_atime, since it
  * may not be mapped!
@@ -1445,7 +1448,7 @@ lfs_blocks_sub(STRUCT_LFS *fs, union lfs
  * This approximates the old formula of E = C * M / D when D is close to T,
  * but avoids falsely reporting "disk full" when the sample size (D) is small.
  */
-#define LFS_EST_CMETA(F) (int32_t)((					\
+#define LFS_EST_CMETA(F) ((						\
 	(lfs_sb_getdmeta(F) * (int64_t)lfs_sb_getnclean(F)) / 		\
 	(lfs_sb_getnseg(F))))
 
@@ -1457,7 +1460,7 @@ lfs_blocks_sub(STRUCT_LFS *fs, union lfs
 			  lfs_sb_getbfree(F) - LFS_EST_CMETA(F) : 0)
 
 /* Amount of non-meta space not available to mortal man */
-#define LFS_EST_RSVD(F) (int32_t)((LFS_EST_NONMETA(F) *			     \
+#define LFS_EST_RSVD(F) ((LFS_EST_NONMETA(F) *			     \
 				   (u_int64_t)lfs_sb_getminfree(F)) /	     \
 				  100)
 

Reply via email to