summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Unangst <tedu@cvs.openbsd.org>2003-04-30 22:54:33 +0000
committerTed Unangst <tedu@cvs.openbsd.org>2003-04-30 22:54:33 +0000
commit7d574f0a3d1f4b26821a0e7425e118287467c3fb (patch)
tree14cbe993a735d65bbc9a22ac74301479548f8bbd
parenta7fa64c009c4503b794e61655e126fe5493d6a5c (diff)
only compare suberblock fields that are interesting, instead of trying to
ignore the noninteresting ones. will allow future changes to work with an older fsck. similar to changes in NetBSD and FreeBSD. ok krw@
-rw-r--r--sbin/fsck_ffs/setup.c89
1 files changed, 43 insertions, 46 deletions
diff --git a/sbin/fsck_ffs/setup.c b/sbin/fsck_ffs/setup.c
index 1d8e833aeb3..1765df74cf0 100644
--- a/sbin/fsck_ffs/setup.c
+++ b/sbin/fsck_ffs/setup.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: setup.c,v 1.17 2002/08/23 09:09:04 gluk Exp $ */
+/* $OpenBSD: setup.c,v 1.18 2003/04/30 22:54:32 tedu Exp $ */
/* $NetBSD: setup.c,v 1.27 1996/09/27 22:45:19 christos Exp $ */
/*
@@ -38,7 +38,7 @@
#if 0
static char sccsid[] = "@(#)setup.c 8.5 (Berkeley) 11/23/94";
#else
-static char rcsid[] = "$OpenBSD: setup.c,v 1.17 2002/08/23 09:09:04 gluk Exp $";
+static char rcsid[] = "$OpenBSD: setup.c,v 1.18 2003/04/30 22:54:32 tedu Exp $";
#endif
#endif /* not lint */
@@ -70,6 +70,7 @@ void badsb(int, char *);
int calcsb(char *, int, struct fs *);
static struct disklabel *getdisklabel(char *, int);
static int readsb(int);
+static int cmpsb(struct fs *, struct fs *);
int
setup(char *dev)
@@ -435,53 +436,10 @@ readsb(int listerr)
havesb = 1;
return (1);
}
- /*
- * Set all possible fields that could differ, then do check
- * of whole super block against an alternate super block.
- * When an alternate super-block is specified this check is skipped.
- */
getblk(&asblk, cgsblock(&sblock, sblock.fs_ncg - 1), sblock.fs_sbsize);
if (asblk.b_errs)
return (0);
- altsblock.fs_firstfield = sblock.fs_firstfield;
- altsblock.fs_fscktime = sblock.fs_fscktime;
- altsblock.fs_time = sblock.fs_time;
- altsblock.fs_cstotal = sblock.fs_cstotal;
- altsblock.fs_cgrotor = sblock.fs_cgrotor;
- altsblock.fs_fmod = sblock.fs_fmod;
- altsblock.fs_clean = sblock.fs_clean;
- altsblock.fs_ronly = sblock.fs_ronly;
- altsblock.fs_flags = sblock.fs_flags;
- altsblock.fs_maxcontig = sblock.fs_maxcontig;
- altsblock.fs_minfree = sblock.fs_minfree;
- altsblock.fs_optim = sblock.fs_optim;
- altsblock.fs_rotdelay = sblock.fs_rotdelay;
- altsblock.fs_maxbpg = sblock.fs_maxbpg;
- memcpy(altsblock.fs_ocsp, sblock.fs_ocsp, sizeof sblock.fs_ocsp);
- altsblock.fs_contigdirs = sblock.fs_contigdirs;
- altsblock.fs_csp = sblock.fs_csp;
- altsblock.fs_maxcluster = sblock.fs_maxcluster;
- altsblock.fs_avgfilesize = sblock.fs_avgfilesize;
- altsblock.fs_avgfpdir = sblock.fs_avgfpdir;
- memcpy(altsblock.fs_fsmnt, sblock.fs_fsmnt,
- sizeof sblock.fs_fsmnt);
- memcpy(altsblock.fs_snapinum, sblock.fs_snapinum,
- sizeof sblock.fs_snapinum);
- memcpy(altsblock.fs_sparecon, sblock.fs_sparecon,
- sizeof sblock.fs_sparecon);
- /*
- * The following should not have to be copied.
- */
- altsblock.fs_fsbtodb = sblock.fs_fsbtodb;
- altsblock.fs_interleave = sblock.fs_interleave;
- altsblock.fs_npsect = sblock.fs_npsect;
- altsblock.fs_nrpos = sblock.fs_nrpos;
- altsblock.fs_state = sblock.fs_state;
- altsblock.fs_qbmask = sblock.fs_qbmask;
- altsblock.fs_qfmask = sblock.fs_qfmask;
- altsblock.fs_state = sblock.fs_state;
- altsblock.fs_maxfilesize = sblock.fs_maxfilesize;
- if (memcmp(&sblock, &altsblock, (int)sblock.fs_sbsize)) {
+ if (cmpsb(&sblock, &altsblock)) {
if (debug) {
long *nlp, *olp, *endlp;
@@ -585,3 +543,42 @@ getdisklabel(char *s, int fd)
}
return (&lab);
}
+
+/*
+ * Compare two superblocks
+ */
+static int
+cmpsb(struct fs *sb, struct fs *asb)
+{
+ /*
+ * Only compare fields which should be the same, and ignore ones
+ * likely to change to ensure future compatibility.
+ */
+ if (asb->fs_sblkno != sb->fs_sblkno ||
+ asb->fs_cblkno != sb->fs_cblkno ||
+ asb->fs_iblkno != sb->fs_iblkno ||
+ asb->fs_dblkno != sb->fs_dblkno ||
+ asb->fs_cgoffset != sb->fs_cgoffset ||
+ asb->fs_cgmask != sb->fs_cgmask ||
+ asb->fs_ncg != sb->fs_ncg ||
+ asb->fs_bsize != sb->fs_bsize ||
+ asb->fs_fsize != sb->fs_fsize ||
+ asb->fs_frag != sb->fs_frag ||
+ asb->fs_bmask != sb->fs_bmask ||
+ asb->fs_fmask != sb->fs_fmask ||
+ asb->fs_bshift != sb->fs_bshift ||
+ asb->fs_fshift != sb->fs_fshift ||
+ asb->fs_fragshift != sb->fs_fragshift ||
+ asb->fs_fsbtodb != sb->fs_fsbtodb ||
+ asb->fs_sbsize != sb->fs_sbsize ||
+ asb->fs_nindir != sb->fs_nindir ||
+ asb->fs_inopb != sb->fs_inopb ||
+ asb->fs_cssize != sb->fs_cssize ||
+ asb->fs_cpg != sb->fs_cpg ||
+ asb->fs_ipg != sb->fs_ipg ||
+ asb->fs_fpg != sb->fs_fpg ||
+ asb->fs_magic != sb->fs_magic)
+ return (1);
+ /* they're the same */
+ return (0);
+}