[Pkg-libvirt-commits] [SCM] Libvirt Debian packaging branch, master, updated. debian/0.9.7-2
Guido Günther
agx at sigxcpu.org
Sun Nov 13 07:15:11 UTC 2011
The following commit has been merged in the master branch:
commit 5b558280cb3298bb28ce7d26def850828a066f0b
Author: Guido Günther <agx at sigxcpu.org>
Date: Sat Nov 12 17:22:43 2011 +0100
storage: forbid rebuilding existing disk storage pools
wiping all it's data.
diff --git a/debian/patches/series b/debian/patches/series
index 28c11bd..7353752 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -9,3 +9,4 @@ virsh-Initialize-library-before-calling-virResetLast.patch
Disable-daemon-start-test.patch
Disable-gnulib-s-test-nonplocking-pipe.sh.patch
Disable-failing-virnetsockettest.patch
+storage-forbid-rebuilding-existing-disk-storage-pool.patch
diff --git a/debian/patches/storage-forbid-rebuilding-existing-disk-storage-pool.patch b/debian/patches/storage-forbid-rebuilding-existing-disk-storage-pool.patch
new file mode 100644
index 0000000..d0c7792
--- /dev/null
+++ b/debian/patches/storage-forbid-rebuilding-existing-disk-storage-pool.patch
@@ -0,0 +1,112 @@
+From: =?UTF-8?q?Guido=20G=C3=BCnther?= <agx at sigxcpu.org>
+Date: Sat, 12 Nov 2011 13:31:52 +0100
+Subject: storage: forbid rebuilding existing disk storage pools
+
+which would blow away all volumes. Honor VIR_STORAGE_POOL_BUILD_OVERWRITE
+to force a rebuild.
+
+This was caught by libvirt-tck's storage/110-disk-pool.t.
+---
+ src/storage/storage_backend_disk.c | 72 ++++++++++++++++++++++++++++++++++--
+ 1 files changed, 68 insertions(+), 4 deletions(-)
+
+diff --git a/src/storage/storage_backend_disk.c b/src/storage/storage_backend_disk.c
+index 82d6e8a..995ad2f 100644
+--- a/src/storage/storage_backend_disk.c
++++ b/src/storage/storage_backend_disk.c
+@@ -335,6 +335,40 @@ virStorageBackendDiskRefreshPool(virConnectPtr conn ATTRIBUTE_UNUSED,
+
+
+ /**
++ * Check for a valid disk label (partition table) on device
++ *
++ * return: 0 - valid disk label found
++ * >0 - no or unrecognized disk label
++ * <0 - error finding the disk label
++ */
++static int
++virStorageBackendDiskFindLabel(const char* device)
++{
++ const char *const args[] = {
++ device, "print", "--script", NULL,
++ };
++ virCommandPtr cmd = virCommandNew(PARTED);
++ char *output = NULL;
++ int ret = -1;
++
++ virCommandAddArgSet(cmd, args);
++ virCommandAddEnvString(cmd, "LC_ALL=C");
++ virCommandSetOutputBuffer(cmd, &output);
++
++ /* if parted succeeds we have a valid partition table */
++ ret = virCommandRun(cmd, NULL);
++ if (ret < 0) {
++ if (strstr (output, "unrecognised disk label"))
++ ret = 1;
++ }
++
++ virCommandFree(cmd);
++ VIR_FREE(output);
++ return ret;
++}
++
++
++/**
+ * Write a new partition table header
+ */
+ static int
+@@ -342,6 +376,8 @@ virStorageBackendDiskBuildPool(virConnectPtr conn ATTRIBUTE_UNUSED,
+ virStoragePoolObjPtr pool,
+ unsigned int flags)
+ {
++ bool ok_to_mklabel = false;
++ int ret = -1;
+ /* eg parted /dev/sda mklabel msdos */
+ const char *prog[] = {
+ PARTED,
+@@ -353,12 +389,40 @@ virStorageBackendDiskBuildPool(virConnectPtr conn ATTRIBUTE_UNUSED,
+ NULL,
+ };
+
+- virCheckFlags(0, -1);
++ virCheckFlags(VIR_STORAGE_POOL_BUILD_OVERWRITE |
++ VIR_STORAGE_POOL_BUILD_NO_OVERWRITE, ret);
+
+- if (virRun(prog, NULL) < 0)
+- return -1;
++ if (flags == (VIR_STORAGE_POOL_BUILD_OVERWRITE |
++ VIR_STORAGE_POOL_BUILD_NO_OVERWRITE)) {
++ virStorageReportError(VIR_ERR_OPERATION_INVALID,
++ _("Overwrite and no overwrite flags"
++ " are mutually exclusive"));
++ goto error;
++ }
+
+- return 0;
++ if (flags & VIR_STORAGE_POOL_BUILD_OVERWRITE)
++ ok_to_mklabel = true;
++ else {
++ int check;
++
++ check = virStorageBackendDiskFindLabel (
++ pool->def->source.devices[0].path);
++ if (check > 0) {
++ ok_to_mklabel = true;
++ } else if (check < 0) {
++ virStorageReportError(VIR_ERR_OPERATION_FAILED,
++ _("Error checking for disk label"));
++ } else {
++ virStorageReportError(VIR_ERR_OPERATION_INVALID,
++ _("Disk label already present"));
++ }
++ }
++
++ if (ok_to_mklabel)
++ ret = virRun(prog, NULL);
++
++error:
++ return ret;
+ }
+
+ /**
+--
--
Libvirt Debian packaging
More information about the Pkg-libvirt-commits
mailing list