From a32bb1b53a1341fd3d4dc5e9c097269ba45a0efe Mon Sep 17 00:00:00 2001
From: Doug Barton <dougb@FreeBSD.org>
Date: Thu, 22 May 2003 18:38:54 +0000
Subject: [PATCH] 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.

PR:		bin/51619
Submitted by:	Lukas Ertl <l.ertl@univie.ac.at>
Reviewed by:	kirk
Approved by:	re (scottl)
---
 sbin/newfs/mkfs.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/sbin/newfs/mkfs.c b/sbin/newfs/mkfs.c
index 58e736db5eaf..ea576efd2676 100644
--- a/sbin/newfs/mkfs.c
+++ b/sbin/newfs/mkfs.c
@@ -113,6 +113,12 @@ mkfs(struct partition *pp, char *fsys)
 	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
@@ -425,6 +431,24 @@ mkfs(struct partition *pp, char *fsys)
 	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.