diff options
author | Ted Unangst <tedu@cvs.openbsd.org> | 2003-04-30 22:54:33 +0000 |
---|---|---|
committer | Ted Unangst <tedu@cvs.openbsd.org> | 2003-04-30 22:54:33 +0000 |
commit | 7d574f0a3d1f4b26821a0e7425e118287467c3fb (patch) | |
tree | 14cbe993a735d65bbc9a22ac74301479548f8bbd | |
parent | a7fa64c009c4503b794e61655e126fe5493d6a5c (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.c | 89 |
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); +} |