Patchwork [RFC] mke2fs: wipe out old btrfs superblocks

login
register
mail settings
Submitter Eric Sandeen
Date Jan. 29, 2013, 5:02 p.m.
Message ID <510800B6.4090505@redhat.com>
Download mbox | patch
Permalink /patch/216604/
State Superseded
Headers show

Comments

Eric Sandeen - Jan. 29, 2013, 5:02 p.m.
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 <sandeen@redhat.com
Resolves-RHBZ: 902512
---


--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Eric Sandeen - Jan. 29, 2013, 5:05 p.m.
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@redhat.com
> 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@vger.kernel.org
> 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@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch

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);