summaryrefslogtreecommitdiff
path: root/utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils.c')
-rw-r--r--utils.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/utils.c b/utils.c
index 32a795e4..a7277281 100644
--- a/utils.c
+++ b/utils.c
@@ -678,6 +678,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)
{
@@ -729,6 +765,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;
}