From 05c46f5c2267a52a2011d5ce0cd4fce1f5334761 Mon Sep 17 00:00:00 2001 From: John Ferlan Date: Thu, 1 Oct 2015 09:30:28 -0400 Subject: [PATCH] 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. --- 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 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 */ -- 2.47.2