diff mbox

[v2] btrfs-progs: force overwrite should wipe stale SB

Message ID 1412205729-20938-1-git-send-email-anand.jain@oracle.com (mailing list archive)
State Accepted
Headers show

Commit Message

Anand Jain Oct. 1, 2014, 11:22 p.m. UTC
(I am unable to reproduce the issue, tried to go back with progs versions
but still the same. So as of now this code remains untested, suggest to
wait till we have a reproducible test case).

Here is a test case which says it all..

mkfs.xfs -f $DEV
mkfs.btrfs -f $DEV
mount $DEV $MNT
mount: /dev/vdiskc: more filesystems detected. This should not happen,
       use -t <type> to explicitly specify the filesystem type or
       use wipefs(8) to clean up the device.

mount: you must specify the filesystem type

with this patch btrfs_prepare_device() also wipes old FS if any,
btrfs_prepare_device() is called after we have verified that
user has provided -f option.

v2: to satisfy the backward compatibility issue, replace
blkid_do_wipe() with local wipe function.

Signed-off-by: Anand Jain <anand.jain@oracle.com>
Signed-off-by: David Sterba <dsterba@suse.cz>
---
 utils.c | 38 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)

Comments

David Sterba Oct. 10, 2014, 7:39 a.m. UTC | #1
On Thu, Oct 02, 2014 at 07:22:09AM +0800, Anand Jain wrote:
> (I am unable to reproduce the issue, tried to go back with progs versions
> but still the same. So as of now this code remains untested, suggest to
> wait till we have a reproducible test case).
> 
> Here is a test case which says it all..
> 
> mkfs.xfs -f $DEV
> mkfs.btrfs -f $DEV
> mount $DEV $MNT
> mount: /dev/vdiskc: more filesystems detected. This should not happen,
>        use -t <type> to explicitly specify the filesystem type or
>        use wipefs(8) to clean up the device.
> 
> mount: you must specify the filesystem type
> 
> with this patch btrfs_prepare_device() also wipes old FS if any,
> btrfs_prepare_device() is called after we have verified that
> user has provided -f option.
> 
> v2: to satisfy the backward compatibility issue, replace
> blkid_do_wipe() with local wipe function.

Thank you, works for me, added to 3.17 queue.
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Anand Jain Oct. 10, 2014, 7:47 a.m. UTC | #2
Thanks.
Anand

On 10/10/2014 03:39 PM, David Sterba wrote:
> On Thu, Oct 02, 2014 at 07:22:09AM +0800, Anand Jain wrote:
>> (I am unable to reproduce the issue, tried to go back with progs versions
>> but still the same. So as of now this code remains untested, suggest to
>> wait till we have a reproducible test case).
>>
>> Here is a test case which says it all..
>>
>> mkfs.xfs -f $DEV
>> mkfs.btrfs -f $DEV
>> mount $DEV $MNT
>> mount: /dev/vdiskc: more filesystems detected. This should not happen,
>>         use -t <type> to explicitly specify the filesystem type or
>>         use wipefs(8) to clean up the device.
>>
>> mount: you must specify the filesystem type
>>
>> with this patch btrfs_prepare_device() also wipes old FS if any,
>> btrfs_prepare_device() is called after we have verified that
>> user has provided -f option.
>>
>> v2: to satisfy the backward compatibility issue, replace
>> blkid_do_wipe() with local wipe function.
>
> Thank you, works for me, added to 3.17 queue.
> --
> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" 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-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/utils.c b/utils.c
index fb78dd6..5f21737 100644
--- a/utils.c
+++ b/utils.c
@@ -680,6 +680,42 @@  int btrfs_add_to_fsid(struct btrfs_trans_handle *trans,
 	return 0;
 }
 
+static void btrfs_wipe_existing_sb(int fd)
+{
+	const char *off = NULL;
+	size_t len = 0;
+	loff_t offset;
+	char buf[BUFSIZ];
+	int rc = 0;
+	blkid_probe pr = NULL;
+
+	pr = blkid_new_probe();
+	if (!pr)
+		return;
+
+	if (blkid_probe_set_device(pr, fd, 0, 0))
+		goto out;
+
+	rc = blkid_probe_lookup_value(pr, "SBMAGIC_OFFSET", &off, NULL);
+	if (!rc)
+		rc = blkid_probe_lookup_value(pr, "SBMAGIC", NULL, &len);
+
+	if (rc || len == 0 || off == NULL)
+		goto out;
+
+	offset = strtoll(off, NULL, 10);
+	if (len > sizeof(buf))
+		len = sizeof(buf);
+
+	memset(buf, 0, len);
+	rc = pwrite(fd, buf, len, offset);
+	fsync(fd);
+
+out:
+	blkid_free_probe(pr);
+	return;
+}
+
 int btrfs_prepare_device(int fd, char *file, int zero_end, u64 *block_count_ret,
 			   u64 max_block_count, int *mixed, int discard)
 {
@@ -731,6 +767,8 @@  int btrfs_prepare_device(int fd, char *file, int zero_end, u64 *block_count_ret,
 		return 1;
 	}
 
+	btrfs_wipe_existing_sb(fd);
+
 	*block_count_ret = block_count;
 	return 0;
 }