[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