From: Eric Sandeen Subject: [PATCH, RFC] mke2fs: wipe out old btrfs superblocks Date: Tue, 29 Jan 2013 11:02:46 -0600 Message-ID: <510800B6.4090505@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit To: ext4 development Return-path: Received: from mx1.redhat.com ([209.132.183.28]:5441 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751392Ab3A2RCs (ORCPT ); Tue, 29 Jan 2013 12:02:48 -0500 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r0TH2mIQ007704 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 29 Jan 2013 12:02:48 -0500 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r0TH2ksh020046 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO) for ; Tue, 29 Jan 2013 12:02:48 -0500 Sender: linux-ext4-owner@vger.kernel.org List-ID: 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). Signed-off-by: Eric Sandeen 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);