On 1/29/13 11:02 AM, Eric Sandeen wrote: > btrfs sticks superblocks at 64k, 64M, and 256G. If we don't > overwrite those, libblkid may accidentally identify an ext* > filesystem with old btrfs superblocks as btrfs, and we'll > be sad. > > libblkid provides a blkid_wipe_fs() functionality to zero > all existing signatures, but that'd break our handy-dandy > undo capability, I think. So I'm not sure we have any > other choice but to do it ourselves. > > There is a slight error here in that if the mkfs > does not span the entire device, we won't overwrite > signatures past the end of the filesystem, but that case > should be pretty rare. (The same slight error in logic > applies to the existing "wipe old MD superblock" path). Sorry, sent the wrong version, this one does it unconditionally and doesn't test !noaction. I'll fix that & resend. Feel free to comment on the general idea, though. :) -Eric > Signed-off-by: Eric Sandeen <sandeen@xxxxxxxxxx > Resolves-RHBZ: 902512 > --- > > diff --git a/misc/mke2fs.c b/misc/mke2fs.c > index bbf477a..e68c705 100644 > --- a/misc/mke2fs.c > +++ b/misc/mke2fs.c > @@ -2307,6 +2307,32 @@ static int mke2fs_discard_device(ext2_filsys fs) > return retval; > } > > +static int mke2fs_wipe_btrfs(ext2_filsys fs) > +{ > + int blocks; /* nr of blocks to zero */ > + blk64_t start; /* location to zero out */ > + int retval = 0; /* accumulate any failures */ > + > + blocks = 1; > + if (fs->blocksize < 4096) > + blocks = 4096 / fs->blocksize; > + /* > + * Wipe out any old btrfs superblocks, at > + * 64k, 64M, and 256G. > + */ > + start = 64ULL * 1024 / fs->blocksize; > + retval += ext2fs_zero_blocks2(fs, start, blocks, NULL, NULL); > + start = 64ULL * 1024 * 1024 / fs->blocksize; > + if (start + blocks <= ext2fs_blocks_count(fs->super)) > + retval += ext2fs_zero_blocks2(fs, start, blocks, NULL, NULL); > + start = 256ULL * 1024 * 1024 * 1024 / fs->blocksize; > + if (start + blocks <= ext2fs_blocks_count(fs->super)) > + retval += ext2fs_zero_blocks2(fs, start, blocks, NULL, NULL); > + /* free the static zeroing buffer */ > + ext2fs_zero_blocks2(0, 0, 0, 0, 0); > + return retval; > +} > + > static void fix_cluster_bg_counts(ext2_filsys fs) > { > blk64_t cluster, num_clusters, tot_free; > @@ -2439,6 +2465,9 @@ int main (int argc, char *argv[]) > itable_zeroed = 1; > } > } > + retval = mke2fs_wipe_btrfs(fs); > + if (retval) > + printf(_("Failed to wipe old btrfs super locations\n")); > > sprintf(tdb_string, "tdb_data_size=%d", fs->blocksize <= 4096 ? > 32768 : fs->blocksize * 8); > > -- > To unsubscribe from this list: send the line "unsubscribe linux-ext4" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html