From b9b275f9a616bdd80521f24b7e77f95035dcb7ac Mon Sep 17 00:00:00 2001 From: Yann Dirson Date: Wed, 5 Jul 2023 16:57:26 +0200 Subject: [PATCH] lvutil: use wipefs not dd to clear existing signatures (xapi-project#624) Signed-off-by: Yann Dirson --- drivers/XE_SR_ERRORCODES.xml | 6 ++++++ drivers/lvutil.py | 20 ++++---------------- drivers/util.py | 5 +++++ 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/drivers/XE_SR_ERRORCODES.xml b/drivers/XE_SR_ERRORCODES.xml index 4d3df3355..6f947a8e8 100755 --- a/drivers/XE_SR_ERRORCODES.xml +++ b/drivers/XE_SR_ERRORCODES.xml @@ -898,6 +898,12 @@ 460 + + WipefsFailure + Failed to wipe pre-existing filesystem signature. + 461 + + GenericException SM has thrown a generic python exception diff --git a/drivers/lvutil.py b/drivers/lvutil.py index 717aa7ee3..123fcc5f1 100755 --- a/drivers/lvutil.py +++ b/drivers/lvutil.py @@ -520,24 +520,12 @@ def createVG(root, vgname): f = _openExclusive(dev, True) os.close(f) + + # Wipe any fs signature try: - # Overwrite the disk header, try direct IO first - cmd = [util.CMD_DD, "if=/dev/zero", "of=%s" % dev, "bs=1M", - "count=10", "oflag=direct"] - util.pread2(cmd) + util.wipefs(dev) except util.CommandException as inst: - if inst.code == errno.EPERM: - try: - # Overwrite the disk header, try normal IO - cmd = [util.CMD_DD, "if=/dev/zero", "of=%s" % dev, - "bs=1M", "count=10"] - util.pread2(cmd) - except util.CommandException as inst: - raise xs_errors.XenError('LVMWrite', \ - opterr='device %s' % dev) - else: - raise xs_errors.XenError('LVMWrite', \ - opterr='device %s' % dev) + raise xs_errors.XenError('WipefsFailure', opterr='device %s' % dev) # from inst if not (dev == rootdev): try: diff --git a/drivers/util.py b/drivers/util.py index d90cebc52..354f8ed8a 100755 --- a/drivers/util.py +++ b/drivers/util.py @@ -637,6 +637,11 @@ def zeroOut(path, fromByte, bytes): return True +def wipefs(blockdev): + "Wipe filesystem signatures from `blockdev`" + pread2(["/usr/sbin/wipefs", "-a", blockdev]) + + def match_rootdev(s): regex = re.compile("^PRIMARY_DISK") return regex.search(s, 0)