diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c index a112ccd680..ed31efc399 100644 --- a/src/storage/storage_backend.c +++ b/src/storage/storage_backend.c @@ -2646,87 +2646,80 @@ virStorageBackendFindGlusterPoolSources(const char *host ATTRIBUTE_UNUSED, * Use the blkid_ APIs in order to get details regarding whether a file * system exists on the disk already. * - * Returns @virStoragePoolProbeResult value, where any error will also - * set the error message. + * Returns: + * -1: An error was encountered, with error message set + * 0: No file system found */ -static virStoragePoolProbeResult +static int virStorageBackendBLKIDFindFS(const char *device, const char *format) { - virStoragePoolProbeResult ret = FILESYSTEM_PROBE_ERROR; + int ret = -1; blkid_probe probe = NULL; const char *fstype = NULL; - char *names[2], *libblkid_format = NULL; VIR_DEBUG("Probing for existing filesystem of type %s on device %s", format, device); if (blkid_known_fstype(format) == 0) { virReportError(VIR_ERR_STORAGE_PROBE_FAILED, - _("Not capable of probing for " - "filesystem of type %s"), + _("Not capable of probing for filesystem of " + "type %s, requires --overwrite"), format); - goto error; + return -1; } - probe = blkid_new_probe_from_filename(device); - if (probe == NULL) { + if (!(probe = blkid_new_probe_from_filename(device))) { virReportError(VIR_ERR_STORAGE_PROBE_FAILED, - _("Failed to create filesystem probe " - "for device %s"), + _("Failed to create filesystem probe for device %s"), device); - goto error; + return -1; } - if (VIR_STRDUP(libblkid_format, format) < 0) - goto error; - - names[0] = libblkid_format; - names[1] = NULL; - - blkid_probe_filter_superblocks_type(probe, - BLKID_FLTR_ONLYIN, - names); - if (blkid_do_probe(probe) != 0) { VIR_INFO("No filesystem of type '%s' found on device '%s'", format, device); - ret = FILESYSTEM_PROBE_NOT_FOUND; } else if (blkid_probe_lookup_value(probe, "TYPE", &fstype, NULL) == 0) { - virReportError(VIR_ERR_STORAGE_POOL_BUILT, - _("Existing filesystem of type '%s' found on " - "device '%s'"), - fstype, device); - ret = FILESYSTEM_PROBE_FOUND; + if (STREQ(fstype, format)) { + virReportError(VIR_ERR_STORAGE_POOL_BUILT, + _("Device '%s' already contains a filesystem " + "of type '%s'"), + device, fstype); + } else { + virReportError(VIR_ERR_STORAGE_POOL_BUILT, + _("Existing filesystem of type '%s' found on " + "device '%s', requires --overwrite"), + fstype, device); + } + goto cleanup; } if (blkid_do_probe(probe) != 1) { virReportError(VIR_ERR_STORAGE_PROBE_FAILED, "%s", _("Found additional probes to run, " "filesystem probing may be incorrect")); - ret = FILESYSTEM_PROBE_ERROR; + goto cleanup; } - error: - VIR_FREE(libblkid_format); + ret = 0; - if (probe != NULL) - blkid_free_probe(probe); + cleanup: + blkid_free_probe(probe); return ret; } #else /* #if WITH_BLKID */ -static virStoragePoolProbeResult +static int virStorageBackendBLKIDFindFS(const char *device ATTRIBUTE_UNUSED, const char *format ATTRIBUTE_UNUSED) { virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("probing for filesystems is unsupported " "by this build")); - return FILESYSTEM_PROBE_ERROR; + return -1; } #endif /* #if WITH_BLKID */ @@ -2746,6 +2739,5 @@ bool virStorageBackendDeviceIsEmpty(const char *devpath, const char *format) { - return virStorageBackendBLKIDFindFS(devpath, format) == - FILESYSTEM_PROBE_NOT_FOUND; + return virStorageBackendBLKIDFindFS(devpath, format) == 0; } diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c index a85e39c547..ba4f598975 100644 --- a/src/storage/storage_backend_fs.c +++ b/src/storage/storage_backend_fs.c @@ -712,12 +712,15 @@ virStorageBackendMakeFileSystem(virStoragePoolObjPtr pool, * * Build a directory or FS based storage pool. * - * If no flag is set, it only makes the directory; If - * VIR_STORAGE_POOL_BUILD_NO_OVERWRITE set, it probes to determine if - * filesystem already exists on the target device, renurning an error - * if exists, or using mkfs to format the target device if not; If - * VIR_STORAGE_POOL_BUILD_OVERWRITE is set, mkfs is always executed, - * any existed data on the target device is overwritten unconditionally. + * If no flag is set, it only makes the directory. + * + * If VIR_STORAGE_POOL_BUILD_NO_OVERWRITE set, it probes to determine if + * any filesystem already exists on the target device, returning an error + * if one exists. If no filesystem already exists, use mkfs to format the + * target device. + * + * If VIR_STORAGE_POOL_BUILD_OVERWRITE is set, mkfs is always executed and + * any existing data on the target device is overwritten unconditionally. * * The underlying source device is mounted for FS based pools. * diff --git a/src/storage/storage_backend_fs.h b/src/storage/storage_backend_fs.h index 347ea9be5c..94fe11138c 100644 --- a/src/storage/storage_backend_fs.h +++ b/src/storage/storage_backend_fs.h @@ -31,11 +31,6 @@ extern virStorageBackend virStorageBackendFileSystem; extern virStorageBackend virStorageBackendNetFileSystem; # endif -typedef enum { - FILESYSTEM_PROBE_FOUND, - FILESYSTEM_PROBE_NOT_FOUND, - FILESYSTEM_PROBE_ERROR, -} virStoragePoolProbeResult; extern virStorageBackend virStorageBackendDirectory; extern virStorageFileBackend virStorageFileBackendFile; diff --git a/tools/virsh-pool.c b/tools/virsh-pool.c index 8313be8684..45b538efac 100644 --- a/tools/virsh-pool.c +++ b/tools/virsh-pool.c @@ -48,7 +48,7 @@ {.name = "no-overwrite", \ .type = VSH_OT_BOOL, \ .flags = 0, \ - .help = N_("do not overwrite an existing pool of this type") \ + .help = N_("do not overwrite any existing data") \ } \ #define VIRSH_COMMON_OPT_POOL_OVERWRITE \ diff --git a/tools/virsh.pod b/tools/virsh.pod index c29f16dca7..6af319e6be 100644 --- a/tools/virsh.pod +++ b/tools/virsh.pod @@ -3466,20 +3466,24 @@ Configure whether I should automatically start at boot. Build a given pool. Options I<--overwrite> and I<--no-overwrite> can only be used for -B a filesystem or disk pool. For a file system pool if -neither of them is specified, B makes the directory. If -I<--no-overwrite> is specified, it probes to determine if a -filesystem already exists on the target device, returning an error -if exists, or using mkfs to format the target device if not. If -I<--overwrite> is specified, mkfs is always executed and any existing -data on the target device is overwritten unconditionally. For a disk -pool, if neither of them is specified or I<--no-overwrite> is specified, -B will use 'parted --print' in order to determine if the -disk already has a label before attempting to create one. Only if a disk -does not already have one will a label be created. If I<--overwrite> is -specified or it's been determined that the disk doesn't already have one, -'parted mklabel' will be used to create a label of the format specified -by the pool source format type or "dos" if not specified for the pool. +B a filesystem or disk pool. + +For a file system pool if neither flag is specified, then B +just makes the target path directory and no attempt to run mkfs on the +target volume device. If I<--no-overwrite> is specified, it probes to +determine if a filesystem already exists on the target device, returning +an error if one exists or using mkfs to format the target device if not. +If I<--overwrite> is specified, mkfs is always executed and any existing +data on the target device is overwritten unconditionally. + +For a disk pool, if neither of them is specified or I<--no-overwrite> +is specified, B will use 'parted --print' in order to +determine if the disk already has a label before attempting to create +one. Only if a disk does not already have one will a label be created. +If I<--overwrite> is specified or it's been determined that the disk +doesn't already have one, 'parted mklabel' will be used to create a +label of the format specified by the pool source format type or "dos" +if not specified for the pool. =item B I [I<--build>] [[I<--overwrite>] | [I<--no-overwrite>]]