From: John Ferlan Date: Thu, 1 Oct 2015 13:30:28 +0000 (-0400) Subject: storage: Add param to check whether we can write a disk label X-Git-Tag: v1.2.21-rc1~126 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=05c46f5c2267a52a2011d5ce0cd4fce1f5334761;p=thirdparty%2Flibvirt.git storage: Add param to check whether we can write a disk label 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. --- diff --git a/src/storage/storage_backend_disk.c b/src/storage/storage_backend_disk.c index da2a4d4929..6f9fab17eb 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 */