Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 11 Mar 2008 19:47:09 -0700
From:      Xin LI <delphij@delphij.net>
To:        Dieter <freebsd@sopwith.solgatos.com>
Cc:        freebsd-bugs@FreeBSD.org
Subject:   Re: kern/119638: [ffs] fsck_ffs -b 32 doesn't repair primary	superblock
Message-ID:  <47D7442D.2080600@delphij.net>
In-Reply-To: <200803120230.m2C2U32p094690@freefall.freebsd.org>
References:  <200803120230.m2C2U32p094690@freefall.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Dieter wrote:
> The following reply was made to PR kern/119638; it has been noted by GNATS.
> 
> From: Dieter <freebsd@sopwith.solgatos.com>
> To: Yoshihiro Ota <ota@j.email.ne.jp>
> Cc: bug-followup@FreeBSD.org
> Subject: Re: kern/119638: [ffs] fsck_ffs -b 32 doesn't repair primary superblock 
> Date: Tue, 11 Mar 2008 14:31:49 +0100
> 
>  > Was your filesystem on /dev/da0s1 "UFS version 1?"
>  > 
>  > See "man fsck_ffs":
>  > 
>  >      -b      Use the block specified immediately after the flag as the super
>  >              block for the file system.  An alternate super block is usually
>  >              located at block 32 for UFS1, and block 160 for UFS2.
>  > 
>  > If you had UFS2, which is the default since 5.1-RELEASE for almost 4 years,
>  > you should have used 160, instead.
>  
>  AAAUUGHH!!!
>  
>  For decades, FFS always used 32 as the first backup superblock, and
>  now some rocket scientist has broken it.  Now we have some random
>  block.  :-(   160?  I'm getting block 256 as the first alternate.
>  
>  Despite this, fsck was perfectly happy using whatever bits happened to be at
>  block 32 and mangled the filesystem accordingly.  Except it didn't repair
>  the primary superblock for some reason.
>  
>  Fsck accepting block 32 when it isn't really the superblock is a whole
>  other (more difficult) problem.  If block 32 is a data block, there is
>  nothing stopping it from looking like a superblock.  Have to think about
>  that one.

Are you really sure?  Without a signature (UFS1_MAGIC or UFS2_MAGIC) in 
the superblock, fsck_ffs would not allow you to use that block as an 
alternative superblock...

>  This PR is about fsck not repairing the primary superblock.  Why didn't
>  fsck repair the primary superblock once it had mangled everything else
>  into compliance?

Try this:

Index: fsutil.c
===================================================================
RCS file: /home/ncvs/src/sbin/fsck_ffs/fsutil.c,v
retrieving revision 1.26
diff -u -p -r1.26 fsutil.c
--- fsutil.c    31 Oct 2006 22:06:56 -0000      1.26
+++ fsutil.c    22 Feb 2008 00:50:43 -0000
@@ -301,7 +301,7 @@ ckfini(int markclean)
         if (havesb && cursnapshot == 0 && sblock.fs_magic == 
FS_UFS2_MAGIC &&
             sblk.b_bno != sblock.fs_sblockloc / dev_bsize &&
             !preen && reply("UPDATE STANDARD SUPERBLOCK")) {
-               sblk.b_bno = sblock.fs_sblockloc / dev_bsize;
+               sblk.b_bno = SBLOCK_UFS2 / dev_bsize;
                 sbdirty();
                 flush(fswritefd, &sblk);
         }

Cheers,
-- 
Xin LI <delphij@delphij.net>	http://www.delphij.net/
FreeBSD - The Power to Serve!



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?47D7442D.2080600>