From 90267b28544ec3e3fd9034b66e219c73c7cd4929 Mon Sep 17 00:00:00 2001 From: dougb Date: Thu, 22 May 2003 18:38:54 +0000 Subject: 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 Reviewed by: kirk Approved by: re (scottl) --- sbin/newfs/mkfs.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'sbin/newfs') diff --git a/sbin/newfs/mkfs.c b/sbin/newfs/mkfs.c index 58e736d..ea576ef 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. -- cgit v1.1