Modify virStorageBackendDiskValidLabel to add a 'writelabel' parameter. While initially for the purpose of determining whether the label should be written during DiskBuild, a future use during DiskStart could determine whether the pool should be started using the label found. Augment the error messages also to give a hint as to what someone may need to do or why the command failed. Signed-off-by: John Ferlan <jferlan@xxxxxxxxxx> --- src/storage/storage_backend_disk.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/src/storage/storage_backend_disk.c b/src/storage/storage_backend_disk.c index da2a4d4..6f9fab1 100644 --- a/src/storage/storage_backend_disk.c +++ b/src/storage/storage_backend_disk.c @@ -435,24 +435,40 @@ virStorageBackendDiskFindLabel(const char* device) * Determine whether the label on the disk is valid or in a known format * for the purpose of rewriting the label during build * + * When 'writelabel' is true, if we find a valid disk label on the device, + * then we shouldn't be attempting to write as the volume may contain + * data. Force the usage of the overwrite flag to the build command in + * order to be certain. When the disk label is unrecognized, then it + * should be safe to write. + * * Return: True if it's OK * False if something's wrong */ static bool -virStorageBackendDiskValidLabel(const char *device) +virStorageBackendDiskValidLabel(const char *device, + bool writelabel) { bool valid = false; int check; check = virStorageBackendDiskFindLabel(device); if (check > 0) { - valid = true; + if (writelabel) + valid = true; + else + virReportError(VIR_ERR_OPERATION_FAILED, "%s", + _("Unrecognized disk label found, requires build")); } else if (check < 0) { virReportError(VIR_ERR_OPERATION_FAILED, "%s", - _("Error checking for disk label")); + _("Error checking for disk label, failed to get " + "disk partition information")); } else { - virReportError(VIR_ERR_OPERATION_INVALID, "%s", - _("Disk label already present")); + if (writelabel) + virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("Valid disk label already present, " + "requires --overwrite")); + else + valid = true; } return valid; } @@ -481,7 +497,8 @@ virStorageBackendDiskBuildPool(virConnectPtr conn ATTRIBUTE_UNUSED, ok_to_mklabel = true; else ok_to_mklabel = virStorageBackendDiskValidLabel( - pool->def->source.devices[0].path); + pool->def->source.devices[0].path, + true); if (ok_to_mklabel) { /* eg parted /dev/sda mklabel --script msdos */ -- 2.1.0 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list