diff options
-rw-r--r-- | sbin/fsck_ffs/setup.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/sbin/fsck_ffs/setup.c b/sbin/fsck_ffs/setup.c index 23fa7c7e7d3..70c738ed436 100644 --- a/sbin/fsck_ffs/setup.c +++ b/sbin/fsck_ffs/setup.c @@ -1,4 +1,4 @@ -/* $OpenBSD: setup.c,v 1.37 2007/06/01 23:42:35 pedro Exp $ */ +/* $OpenBSD: setup.c,v 1.38 2008/06/09 21:56:06 otto Exp $ */ /* $NetBSD: setup.c,v 1.27 1996/09/27 22:45:19 christos Exp $ */ /* @@ -34,7 +34,7 @@ #if 0 static char sccsid[] = "@(#)setup.c 8.5 (Berkeley) 11/23/94"; #else -static const char rcsid[] = "$OpenBSD: setup.c,v 1.37 2007/06/01 23:42:35 pedro Exp $"; +static const char rcsid[] = "$OpenBSD: setup.c,v 1.38 2008/06/09 21:56:06 otto Exp $"; #endif #endif /* not lint */ @@ -73,6 +73,8 @@ long numdirs, listmax, inplast; * Possible locations for the superblock. */ static const int sbtry[] = SBLOCKSEARCH; +/* locations the 1st alternate sb can be at */ +static const int altsbtry[] = { 32, 64, 128, 144, 160, 192, 256 }; int setup(char *dev) @@ -132,6 +134,14 @@ setup(char *dev) return(0); if (reply("LOOK FOR ALTERNATE SUPERBLOCKS") == 0) return (0); + for (i = 0; i < sizeof(altsbtry) / sizeof(altsbtry[0]); i++) { + bflag = altsbtry[i]; + /* proto partially setup by calcsb */ + if (readsb(0) != 0 && + proto.fs_fsize == sblock.fs_fsize && + proto.fs_bsize == sblock.fs_bsize) + goto found; + } for (cg = 0; cg < proto.fs_ncg; cg++) { bflag = fsbtodb(&proto, cgsblock(&proto, cg)); if (readsb(0) != 0) @@ -147,6 +157,7 @@ setup(char *dev) "INFORMATION; SEE fsck_ffs(8)."); return(0); } +found: doskipclean = 0; pwarn("USING ALTERNATE SUPERBLOCK AT %d\n", bflag); } @@ -577,7 +588,7 @@ readsb(int listerr) } } badsb(listerr, - "VALUES IN SUPER BLOCK DISAGREE WITH THOSE IN FIRST ALTERNATE"); + "VALUES IN SUPER BLOCK DISAGREE WITH THOSE IN LAST ALTERNATE"); return (0); } out: |