From owner-cvs-all@FreeBSD.ORG Thu May 22 16:14:52 2003 Return-Path: Delivered-To: cvs-all@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 64ADC37B409 for ; Thu, 22 May 2003 16:14:52 -0700 (PDT) Received: from rootlabs.com (root.org [67.118.192.226]) by mx1.FreeBSD.org (Postfix) with SMTP id 2261E43FBD for ; Thu, 22 May 2003 16:14:50 -0700 (PDT) (envelope-from nate@rootlabs.com) Received: (qmail 95960 invoked by uid 1000); 22 May 2003 23:14:51 -0000 Date: Thu, 22 May 2003 16:14:51 -0700 (PDT) From: Nate Lawson To: Doug Barton In-Reply-To: <20030522183930.564EF37B49D@hub.freebsd.org> Message-ID: <20030522161035.X95941@root.org> References: <20030522183930.564EF37B49D@hub.freebsd.org> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII cc: cvs-src@FreeBSD.org cc: src-committers@FreeBSD.org cc: cvs-all@FreeBSD.org Subject: Re: cvs commit: src/sbin/newfs mkfs.c X-BeenThere: cvs-all@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: CVS commit messages for the entire tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 22 May 2003 23:14:52 -0000 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