Module Name:    src
Committed By:   mlelstv
Date:           Sun Mar 31 10:55:58 UTC 2019

Modified Files:
        src/sbin/fsck_ext2fs: Makefile setup.c

Log Message:
No longer rely on data in disklabel to deduce alternate superblock
positions from block size. Instead use the same defaults as newfs_ext2fs.

Side effect is that fsck_ext2fs now works with wedges.


To generate a diff of this commit:
cvs rdiff -u -r1.17 -r1.18 src/sbin/fsck_ext2fs/Makefile
cvs rdiff -u -r1.37 -r1.38 src/sbin/fsck_ext2fs/setup.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_ext2fs/Makefile
diff -u src/sbin/fsck_ext2fs/Makefile:1.17 src/sbin/fsck_ext2fs/Makefile:1.18
--- src/sbin/fsck_ext2fs/Makefile:1.17	Tue Mar  4 21:07:22 2014
+++ src/sbin/fsck_ext2fs/Makefile	Sun Mar 31 10:55:58 2019
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile,v 1.17 2014/03/04 21:07:22 joerg Exp $
+#	$NetBSD: Makefile,v 1.18 2019/03/31 10:55:58 mlelstv Exp $
 #	@(#)Makefile	8.1 (Berkeley) 6/5/93
 
 .include <bsd.own.mk>
@@ -6,7 +6,8 @@
 PROG=	fsck_ext2fs
 MAN=    fsck_ext2fs.8
 SRCS=	dir.c inode.c main.c pass1.c pass1b.c pass2.c pass3.c pass4.c \
-	pass5.c fsutil.c setup.c utilities.c ext2fs_bswap.c
+	pass5.c fsutil.c setup.c utilities.c ext2fs_bswap.c \
+	partutil.c
 FSCK=	${NETBSDSRCDIR}/sbin/fsck
 CPPFLAGS+= -I${FSCK}
 .PATH:	${NETBSDSRCDIR}/sys/ufs/ext2fs ${FSCK}
@@ -17,3 +18,6 @@ CWARNFLAGS.clang+=	-Wno-error=tautologic
 
 LDADD+=-lutil
 DPADD+=${LIBUTIL}
+
+LDADD+=-lprop
+DPADD+=${LIBPROP}

Index: src/sbin/fsck_ext2fs/setup.c
diff -u src/sbin/fsck_ext2fs/setup.c:1.37 src/sbin/fsck_ext2fs/setup.c:1.38
--- src/sbin/fsck_ext2fs/setup.c:1.37	Sun Mar 31 10:52:00 2019
+++ src/sbin/fsck_ext2fs/setup.c	Sun Mar 31 10:55:58 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: setup.c,v 1.37 2019/03/31 10:52:00 mlelstv Exp $	*/
+/*	$NetBSD: setup.c,v 1.38 2019/03/31 10:55:58 mlelstv Exp $	*/
 
 /*
  * Copyright (c) 1980, 1986, 1993
@@ -58,7 +58,7 @@
 #if 0
 static char sccsid[] = "@(#)setup.c	8.5 (Berkeley) 11/23/94";
 #else
-__RCSID("$NetBSD: setup.c,v 1.37 2019/03/31 10:52:00 mlelstv Exp $");
+__RCSID("$NetBSD: setup.c,v 1.38 2019/03/31 10:55:58 mlelstv Exp $");
 #endif
 #endif /* not lint */
 
@@ -70,7 +70,7 @@ __RCSID("$NetBSD: setup.c,v 1.37 2019/03
 #include <ufs/ext2fs/ext2fs.h>
 #include <sys/stat.h>
 #include <sys/ioctl.h>
-#include <sys/disklabel.h>
+#include <sys/disk.h>
 #include <sys/file.h>
 
 #include <errno.h>
@@ -84,19 +84,31 @@ __RCSID("$NetBSD: setup.c,v 1.37 2019/03
 #include "fsck.h"
 #include "extern.h"
 #include "fsutil.h"
+#include "partutil.h"
 #include "exitvalues.h"
 
 void badsb(int, const char *);
 int calcsb(const char *, int, struct m_ext2fs *);
-static struct disklabel *getdisklabel(const char *, int);
 static int readsb(int);
 
+/*    
+ * For file systems smaller than SMALL_FSSIZE we use the S_DFL_* defaults,
+ * otherwise if less than MEDIUM_FSSIZE use M_DFL_*, otherwise use 
+ * L_DFL_*.
+ */
+#define SMALL_FSSIZE    ((4 * 1024 * 1024) / secsize)        /* 4MB */  
+#define S_DFL_BSIZE     1024 
+#define MEDIUM_FSSIZE   ((512 * 1024 * 1024) / secsize)      /* 512MB */
+#define M_DFL_BSIZE     1024 
+#define L_DFL_BSIZE     4096
+
 int
 setup(const char *dev)
 {
 	long cg, asked, i;
 	long bmapsize;
-	struct disklabel *lp;
+	struct disk_geom geo;
+	struct dkwedge_info dkw;
 	off_t sizepb;
 	struct stat statb;
 	struct m_ext2fs proto;
@@ -137,8 +149,8 @@ setup(const char *dev)
 	asblk.b_un.b_buf = malloc(SBSIZE);
 	if (sblk.b_un.b_buf == NULL || asblk.b_un.b_buf == NULL)
 		errexit("cannot allocate space for superblock");
-	if ((lp = getdisklabel(NULL, fsreadfd)) != NULL)
-		dev_bsize = secsize = lp->d_secsize;
+	if (getdiskinfo(dev, fsreadfd, NULL, &geo, &dkw) != -1)
+		dev_bsize = secsize = geo.dg_secsize;
 	else
 		dev_bsize = secsize = DEV_BSIZE;
 	/*
@@ -488,35 +500,27 @@ badsb(int listerr, const char *s)
 int
 calcsb(const char *dev, int devfd, struct m_ext2fs *fs)
 {
-	struct disklabel *lp;
-	struct partition *pp;
-	char *cp;
-
-	cp = strchr(dev, '\0');
-	if (cp-- == dev ||
-	    ((*cp < 'a' || *cp > 'a' + MAXPARTITIONS - 1) && !isdigit((unsigned char)*cp))) {
+	struct dkwedge_info dkw;
+	struct disk_geom geo;
+
+	if (getdiskinfo(dev, devfd, NULL, &geo, &dkw) == -1)
+		pfatal("%s: CANNOT FIGURE OUT FILE SYSTEM PARTITION\n", dev);
+	if (dkw.dkw_parent[0] == '\0') {
 		pfatal("%s: CANNOT FIGURE OUT FILE SYSTEM PARTITION\n", dev);
 		return 0;
 	}
-	lp = getdisklabel(dev, devfd);
-	if (isdigit((unsigned char)*cp))
-		pp = &lp->d_partitions[0];
-	else
-		pp = &lp->d_partitions[*cp - 'a'];
-	if (pp->p_fstype != FS_EX2FS) {
-		pfatal("%s: NOT LABELED AS A EXT2 FILE SYSTEM (%s)\n",
-		    dev, pp->p_fstype < FSMAXTYPES ?
-		    fstypenames[pp->p_fstype] : "unknown");
-		return 0;
-	}
-	if (pp->p_fsize == 0) {
-		pfatal("%s: PARTITION SIZE IS 0\n", dev);
-		return 0;
-	}
+
 	memset(fs, 0, sizeof(struct m_ext2fs));
-	fs->e2fs_bsize = pp->p_fsize;
-	fs->e2fs.e2fs_log_bsize = ilog2(pp->p_fsize / 1024);
-	fs->e2fs.e2fs_bcount = (pp->p_size * DEV_BSIZE) / fs->e2fs_bsize;
+
+	if (dkw.dkw_size < (uint64_t)SMALL_FSSIZE)
+		fs->e2fs_bsize = S_DFL_BSIZE;
+	else if (dkw.dkw_size < (uint64_t)MEDIUM_FSSIZE)
+		fs->e2fs_bsize = M_DFL_BSIZE;
+	else
+		fs->e2fs_bsize = L_DFL_BSIZE;
+
+	fs->e2fs.e2fs_log_bsize = ilog2(fs->e2fs_bsize / 1024);
+	fs->e2fs.e2fs_bcount = (fs->e2fs_bsize * DEV_BSIZE) / fs->e2fs_bsize;
 	fs->e2fs.e2fs_first_dblock = (fs->e2fs.e2fs_log_bsize == 0) ? 1 : 0;
 	fs->e2fs.e2fs_bpg = fs->e2fs_bsize * NBBY;
 	fs->e2fs_bshift = LOG_MINBSIZE + fs->e2fs.e2fs_log_bsize;
@@ -532,20 +536,6 @@ calcsb(const char *dev, int devfd, struc
 	return 1;
 }
 
-static struct disklabel *
-getdisklabel(const char *s, int fd)
-{
-	static struct disklabel lab;
-
-	if (ioctl(fd, DIOCGDINFO, (char *)&lab) < 0) {
-		if (s == NULL)
-			return NULL;
-		pwarn("ioctl (GCINFO): %s\n", strerror(errno));
-		errexit("%s: can't read disk label", s);
-	}
-	return &lab;
-}
-
 daddr_t
 cgoverhead(int c)
 {

Reply via email to