Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 22 May 2003 16:14:51 -0700 (PDT)
From:      Nate Lawson <nate@root.org>
To:        Doug Barton <dougb@FreeBSD.org>
Cc:        cvs-all@FreeBSD.org
Subject:   Re: cvs commit: src/sbin/newfs mkfs.c
Message-ID:  <20030522161035.X95941@root.org>
In-Reply-To: <20030522183930.564EF37B49D@hub.freebsd.org>
References:  <20030522183930.564EF37B49D@hub.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, 22 May 2003, Doug Barton wrote:
>   When newfs'ing a partition with UFS2 that had previously been newfs'ed
>   with UFS1, the UFS1 superblocks were not deleted. This allowed any
>   RELENG_4 (or other non-UFS2-aware) fsck to think it knew how to "fix"
>   the file system, resulting in severe data scrambling.
>
>   This patch is a more advanced version than the one originally submitted.
>   Lukas improved it based on feedback from Kirk, and testing by me. It
>   blanks all UFS1 superblocks (if any) during a UFS2 newfs, thereby causing
>   fsck's that are not UFS2 aware to generate the "SEARCH FOR ALTERNATE
>   SUPER-BLOCK FAILED" message, and exit without damaging the fs.

It's great to see user-friendly fixes hitting the tree.  We really need
more seatbelts.

> --- src/sbin/newfs/mkfs.c:1.76	Sat May 10 11:58:17 2003
> +++ src/sbin/newfs/mkfs.c	Thu May 22 11:38:54 2003
> @@ -113,6 +113,12 @@
>  	quad_t sizepb;
>  	int width;
>  	char tmpbuf[100];	/* XXX this will break in about 2,500 years */
> +	union {
> +		struct fs fdummy;
> +		char cdummy[SBLOCKSIZE];
> +	} dummy;
> +#define fsdummy dummy.fdummy
> +#define chdummy dummy.cdummy
>
>  	/*
>  	 * Our blocks == sector size, and the version of UFS we are using is

Should we have compatibility structs for past versions of the superblock?
It seems the union would be unnecessary if you had a "struct fs1".

> @@ -425,6 +431,24 @@
>  	if (sblock.fs_flags & FS_DOSOFTDEP)
>  		printf("\twith soft updates\n");
>  #	undef B2MBFACTOR
> +
> +	/*
> +	 * Wipe out old UFS1 superblock(s) if necessary.
> +	 */
> +	if (!Nflag && Oflag != 1) {
> +		i = bread(&disk, SBLOCK_UFS1 / disk.d_bsize, chdummy, SBLOCKSIZE);
> +		if (i == -1)
> +			err(1, "can't read old UFS1 superblock: %s", disk.d_error);
> +
> +		if (fsdummy.fs_magic == FS_UFS1_MAGIC) {
> +			fsdummy.fs_magic = 0;
> +			bwrite(&disk, SBLOCK_UFS1 / disk.d_bsize, chdummy, SBLOCKSIZE);
> +			for (i = 0; i < fsdummy.fs_ncg; i++)
> +				bwrite(&disk, fsbtodb(&fsdummy, cgsblock(&fsdummy, i)),
> +	                    chdummy, SBLOCKSIZE);
> +		}
> +	}
> +
>  	/*
>  	 * Now build the cylinders group blocks and
>  	 * then print out indices of cylinder groups.

I must be missing something -- I can't see how this wipes out the
alternate superblocks and not just the first one.

-Nate



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