[libvirt] [PATCH] storage: dir: adapts .wipeVol for ploop volumes

Mikhail Feoktistov mfeoktistov at virtuozzo.com
Tue May 17 14:39:53 UTC 2016



On 16.05.2016 10:19, Olga Krishtal wrote:
> The modification of .volWipe callback wipes ploop volume using one of
> given wiping algorithm: dod, nnsa, etc.
> However, in case of ploop volume we need to reinitialize root.hds and DiskDescriptor.xml.
>
> Signed-off-by: Olga Krishtal <okrishtal at virtuozzo.com>
> ---
>   src/storage/storage_backend.c | 58 ++++++++++++++++++++++++++++++++++++++-----
>   1 file changed, 52 insertions(+), 6 deletions(-)
>
> diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c
> index d47a76a..367a887 100644
> --- a/src/storage/storage_backend.c
> +++ b/src/storage/storage_backend.c
> @@ -2295,6 +2295,45 @@ virStorageBackendWipeLocal(virStorageVolDefPtr vol,
>       return ret;
>   }
>   
> +static int
> +virStorageBackendVolWipePloop(virStorageVolDefPtr vol)
> +{
> +    virCommandPtr cmd = NULL;
> +    char *target_path = NULL;
> +    char *disk_desc = NULL;
> +    int ret = -1;
> +
> +    if (virAsprintf(&target_path, "%s/root.hds", vol->target.path) < 0)
> +        goto cleanup;
> +
> +    if (virAsprintf(&disk_desc, "%s/DiskDescriptor.xml", vol->target.path) < 0)
> +        goto cleanup;
> +
> +    if (virFileRemove(disk_desc, 0, 0) < 0) {
> +        virReportError(errno, _("Failed to delete DiskDescriptor.xml of volume '%s'"),
> +                       vol->target.path);
> +        goto cleanup;
> +    }
> +    if (virFileRemove(target_path, 0, 0) < 0) {
> +        virReportError(errno, _("failed to delete root.hds of volume '%s'"),
> +                       vol->target.path);
> +        goto cleanup;
> +    }
> +
> +    cmd = virCommandNewArgList("ploop", "init", "-s", NULL);
> +
> +    virCommandAddArgFormat(cmd, "%lluM", VIR_DIV_UP(vol->target.capacity,
> +                                                        (1024 * 1024)));
> +    virCommandAddArgList(cmd, "-t", "ext4", NULL);
> +    virCommandAddArgFormat(cmd, "%s/root.hds", vol->target.path);
> +    ret = virCommandRun(cmd, NULL);
> +
> + cleanup:
> +    VIR_FREE(disk_desc);
> +    VIR_FREE(target_path);
> +    virCommandFree(cmd);
> +    return ret;
> +}
>   
>   int
>   virStorageBackendVolWipeLocal(virConnectPtr conn ATTRIBUTE_UNUSED,
> @@ -2307,6 +2346,8 @@ virStorageBackendVolWipeLocal(virConnectPtr conn ATTRIBUTE_UNUSED,
>       const char *alg_char = NULL;
>       struct stat st;
>       virCommandPtr cmd = NULL;
> +    char *path = NULL;
> +    char *target_path = vol->target.path;
>   
>       virCheckFlags(0, -1);
>   
> @@ -2314,12 +2355,12 @@ virStorageBackendVolWipeLocal(virConnectPtr conn ATTRIBUTE_UNUSED,
>                 vol->target.path, algorithm);
>   
>       if (vol->target.format == VIR_STORAGE_FILE_PLOOP) {
> -        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> -                       _("wiping for ploop volumes is not supported"));
> -        goto cleanup;
> +        if (virAsprintf(&path, "%s/root.hds", vol->target.path) < 0)
> +            goto cleanup;
> +        target_path = path;
>       }
>   
> -    fd = open(vol->target.path, O_RDWR);
> +    fd = open(target_path, O_RDWR);
>       if (fd == -1) {
>           virReportSystemError(errno,
>                                _("Failed to open storage volume with path '%s'"),
> @@ -2376,13 +2417,12 @@ virStorageBackendVolWipeLocal(virConnectPtr conn ATTRIBUTE_UNUSED,
>       if (algorithm != VIR_STORAGE_VOL_WIPE_ALG_ZERO) {
>           cmd = virCommandNew(SCRUB);
>           virCommandAddArgList(cmd, "-f", "-p", alg_char,
> -                             vol->target.path, NULL);
> +                             target_path, NULL);
>   
>           if (virCommandRun(cmd, NULL) < 0)
>               goto cleanup;
>   
>           ret = 0;
> -        goto cleanup;
>       } else {
>           if (S_ISREG(st.st_mode) && st.st_blocks < (st.st_size / DEV_BSIZE)) {
>               ret = virStorageBackendVolZeroSparseFileLocal(vol, st.st_size, fd);
> @@ -2392,10 +2432,16 @@ virStorageBackendVolWipeLocal(virConnectPtr conn ATTRIBUTE_UNUSED,
>                                                vol->target.allocation,
>                                                st.st_blksize);
>           }
> +        if (ret < 0)
> +            goto cleanup;
>       }
>   
> +    if (vol->target.format == VIR_STORAGE_FILE_PLOOP)
> +        ret = virStorageBackendVolWipePloop(vol);
> +
>    cleanup:
>       virCommandFree(cmd);
> +    VIR_FREE(path);
>       VIR_FORCE_CLOSE(fd);
>       return ret;
>   }

Ack




More information about the libvir-list mailing list