Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sbin/fsck_ext2fs No longer rely on data in disklabel to dedu...
details: https://anonhg.NetBSD.org/src/rev/5b8314d7605d
branches: trunk
changeset: 997902:5b8314d7605d
user: mlelstv <mlelstv%NetBSD.org@localhost>
date: Sun Mar 31 10:55:58 2019 +0000
description:
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.
diffstat:
sbin/fsck_ext2fs/Makefile | 8 +++-
sbin/fsck_ext2fs/setup.c | 80 ++++++++++++++++++++--------------------------
2 files changed, 41 insertions(+), 47 deletions(-)
diffs (171 lines):
diff -r 1bfe53b12719 -r 5b8314d7605d sbin/fsck_ext2fs/Makefile
--- a/sbin/fsck_ext2fs/Makefile Sun Mar 31 10:52:00 2019 +0000
+++ b/sbin/fsck_ext2fs/Makefile Sun Mar 31 10:55:58 2019 +0000
@@ -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 @@
LDADD+=-lutil
DPADD+=${LIBUTIL}
+
+LDADD+=-lprop
+DPADD+=${LIBPROP}
diff -r 1bfe53b12719 -r 5b8314d7605d sbin/fsck_ext2fs/setup.c
--- a/sbin/fsck_ext2fs/setup.c Sun Mar 31 10:52:00 2019 +0000
+++ b/sbin/fsck_ext2fs/setup.c Sun Mar 31 10:55:58 2019 +0000
@@ -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 @@
#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 @@
#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 @@
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 @@
int
calcsb(const char *dev, int devfd, struct m_ext2fs *fs)
{
- struct disklabel *lp;
- struct partition *pp;
- char *cp;
+ struct dkwedge_info dkw;
+ struct disk_geom geo;
- cp = strchr(dev, '\0');
- if (cp-- == dev ||
- ((*cp < 'a' || *cp > 'a' + MAXPARTITIONS - 1) && !isdigit((unsigned char)*cp))) {
+ 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];
+
+ memset(fs, 0, sizeof(struct m_ext2fs));
+
+ 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
- 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;
+ 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 @@
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)
{
Home |
Main Index |
Thread Index |
Old Index