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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list