[libvirt] [PATCH] storage: forbid rebuilding existing disk storage pools

Guido Günther agx at sigxcpu.org
Mon Nov 14 17:20:59 UTC 2011


On Mon, Nov 14, 2011 at 12:58:08PM +0800, Osier Yang wrote:
> 于 2011年11月13日 00:19, Guido Günther 写道:
> >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.
> >Cheers,
> >  -- Guido
> >
> >---
> >  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;
> >  }
> >
> >  /**
> 
> Looks fine, and having the flags is better, ACK
Pushed. Thanks.
 -- Guido




More information about the libvir-list mailing list