linux-ext4.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH, RFC] mke2fs: wipe out old btrfs superblocks
@ 2013-01-29 17:02 Eric Sandeen
  2013-01-29 17:05 ` Eric Sandeen
  2013-01-29 17:10 ` [PATCH, RFC V2] " Eric Sandeen
  0 siblings, 2 replies; 4+ messages in thread
From: Eric Sandeen @ 2013-01-29 17:02 UTC (permalink / raw)
  To: ext4 development

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

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


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH, RFC] mke2fs: wipe out old btrfs superblocks
  2013-01-29 17:02 [PATCH, RFC] mke2fs: wipe out old btrfs superblocks Eric Sandeen
@ 2013-01-29 17:05 ` Eric Sandeen
  2013-01-29 17:10 ` [PATCH, RFC V2] " Eric Sandeen
  1 sibling, 0 replies; 4+ messages in thread
From: Eric Sandeen @ 2013-01-29 17:05 UTC (permalink / raw)
  To: ext4 development

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
> 


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH, RFC V2] mke2fs: wipe out old btrfs superblocks
  2013-01-29 17:02 [PATCH, RFC] mke2fs: wipe out old btrfs superblocks Eric Sandeen
  2013-01-29 17:05 ` Eric Sandeen
@ 2013-01-29 17:10 ` Eric Sandeen
  2013-01-30  9:50   ` Lukáš Czerner
  1 sibling, 1 reply; 4+ messages in thread
From: Eric Sandeen @ 2013-01-29 17:10 UTC (permalink / raw)
  To: ext4 development

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

v2: skip this on "noaction"

I decided not to be tricky about previous zero-returning
discards, there seems to be little point to that, we're
just doing 3 IOs post discard, at worst.

diff --git a/misc/mke2fs.c b/misc/mke2fs.c
index bbf477a..0c67134 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;
@@ -2440,6 +2466,12 @@ int main (int argc, char *argv[])
 		}
 	}
 
+	if (!noaction) {
+		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);
 	io_channel_set_options(fs->io, tdb_string);



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH, RFC V2] mke2fs: wipe out old btrfs superblocks
  2013-01-29 17:10 ` [PATCH, RFC V2] " Eric Sandeen
@ 2013-01-30  9:50   ` Lukáš Czerner
  0 siblings, 0 replies; 4+ messages in thread
From: Lukáš Czerner @ 2013-01-30  9:50 UTC (permalink / raw)
  To: Eric Sandeen; +Cc: ext4 development, Karel Zak

On Tue, 29 Jan 2013, Eric Sandeen wrote:

> Date: Tue, 29 Jan 2013 11:10:49 -0600
> From: Eric Sandeen <sandeen@redhat.com>
> To: ext4 development <linux-ext4@vger.kernel.org>
> Subject: [PATCH, RFC V2] mke2fs: wipe out old btrfs superblocks
> 
> 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
> ---

Hi Eric,

right we really need this functionality, but I think that we should
rather use blkid to wipe all the signatures.

Unfortunately as you already mentioned we have "undo" functionality
which makes things a little bit more complicated, because we can not
let blkid just wipe it for us. It should rather provide us the information
about the position of the signatures so we can wipe it of ourselves.

After the discussion with Karel Zak I think that the best approach
would be to blkid export blkid_probe_postwipe_reset() for us, so we
can walk the "chain" provided by blkid and do the actual wipe.

However it might be worth having this patch anyway since it solves
the situation right away without waiting for newer version of blkid
library.

btw. I have one comment bellow.

Thanks!
-Lukas

> 
> v2: skip this on "noaction"
> 
> I decided not to be tricky about previous zero-returning
> discards, there seems to be little point to that, we're
> just doing 3 IOs post discard, at worst.
> 
> diff --git a/misc/mke2fs.c b/misc/mke2fs.c
> index bbf477a..0c67134 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;
> @@ -2440,6 +2466,12 @@ int main (int argc, char *argv[])
>  		}
>  	}
>  
> +	if (!noaction) {
> +		retval = mke2fs_wipe_btrfs(fs);
> +		if (retval)
> +			printf(_("Failed to wipe old btrfs super locations\n"));
> +	}
> +

We might want to move the wipe after io_channel_set_options(). I am
not sure whether it will have any impact but since we'll be using
the io_channel I think it should be already set up.

>  	sprintf(tdb_string, "tdb_data_size=%d", fs->blocksize <= 4096 ?
>  		32768 : fs->blocksize * 8);
>  	io_channel_set_options(fs->io, tdb_string);
> 
> 
> --
> 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
> 

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2013-01-30  9:50 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-01-29 17:02 [PATCH, RFC] mke2fs: wipe out old btrfs superblocks Eric Sandeen
2013-01-29 17:05 ` Eric Sandeen
2013-01-29 17:10 ` [PATCH, RFC V2] " Eric Sandeen
2013-01-30  9:50   ` Lukáš Czerner

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).