diff --git a/src/storage/storage_backend.h b/src/storage/storage_backend.h index 5e251d7b79a7c7cd6a0765b5ccc85914e3848c3e..e48da5bbecf2a3d4a8747a9e9c7e6a11f0648dc2 100644 --- a/src/storage/storage_backend.h +++ b/src/storage/storage_backend.h @@ -87,6 +87,11 @@ typedef int (*virStorageBackendVolumeUpload)(virConnectPtr conn, unsigned long long offset, unsigned long long len, unsigned int flags); +typedef int (*virStorageBackendVolumeWipe)(virConnectPtr conn, + virStoragePoolObjPtr pool, + virStorageVolDefPtr vol, + unsigned int algorithm, + unsigned int flags); /* File creation/cloning functions used for cloning between backends */ int virStorageBackendCreateRaw(virConnectPtr conn, @@ -150,6 +155,7 @@ struct _virStorageBackend { virStorageBackendVolumeResize resizeVol; virStorageBackendVolumeUpload uploadVol; virStorageBackendVolumeDownload downloadVol; + virStorageBackendVolumeWipe wipeVol; }; virStorageBackendPtr virStorageBackendForType(int type); diff --git a/src/storage/storage_backend_disk.c b/src/storage/storage_backend_disk.c index f900dee5948e0e58b4627bb0ba449dece6c2086b..d85f13f05dc2e2a4be34625b5db807c4f42e65b8 100644 --- a/src/storage/storage_backend_disk.c +++ b/src/storage/storage_backend_disk.c @@ -794,4 +794,5 @@ virStorageBackend virStorageBackendDisk = { .buildVolFrom = virStorageBackendDiskBuildVolFrom, .uploadVol = virStorageBackendVolUploadLocal, .downloadVol = virStorageBackendVolDownloadLocal, + .wipeVol = virStorageBackendVolWipeLocal, }; diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c index 32471a76aacf06f9426ef2dff8e128a4a724e14e..40cc1f4059baad2b32d1ae766f80324e220a0f2c 100644 --- a/src/storage/storage_backend_fs.c +++ b/src/storage/storage_backend_fs.c @@ -1301,6 +1301,7 @@ virStorageBackend virStorageBackendDirectory = { .resizeVol = virStorageBackendFileSystemVolResize, .uploadVol = virStorageBackendVolUploadLocal, .downloadVol = virStorageBackendVolDownloadLocal, + .wipeVol = virStorageBackendVolWipeLocal, }; #if WITH_STORAGE_FS @@ -1321,6 +1322,7 @@ virStorageBackend virStorageBackendFileSystem = { .resizeVol = virStorageBackendFileSystemVolResize, .uploadVol = virStorageBackendVolUploadLocal, .downloadVol = virStorageBackendVolDownloadLocal, + .wipeVol = virStorageBackendVolWipeLocal, }; virStorageBackend virStorageBackendNetFileSystem = { .type = VIR_STORAGE_POOL_NETFS, @@ -1340,6 +1342,7 @@ virStorageBackend virStorageBackendNetFileSystem = { .resizeVol = virStorageBackendFileSystemVolResize, .uploadVol = virStorageBackendVolUploadLocal, .downloadVol = virStorageBackendVolDownloadLocal, + .wipeVol = virStorageBackendVolWipeLocal, }; diff --git a/src/storage/storage_backend_iscsi.c b/src/storage/storage_backend_iscsi.c index 73455712f7bf4533e5eee6d2fba9824fc45bf850..1d0cf73962c0f5f7bc938a0c54b92e0278ec0b03 100644 --- a/src/storage/storage_backend_iscsi.c +++ b/src/storage/storage_backend_iscsi.c @@ -476,4 +476,5 @@ virStorageBackend virStorageBackendISCSI = { .findPoolSources = virStorageBackendISCSIFindPoolSources, .uploadVol = virStorageBackendVolUploadLocal, .downloadVol = virStorageBackendVolDownloadLocal, + .wipeVol = virStorageBackendVolWipeLocal, }; diff --git a/src/storage/storage_backend_logical.c b/src/storage/storage_backend_logical.c index 60ad5f2f55ccdce674927f2d73fba211df876989..ab1e64befbb13076289ca8ca73081d49b7a6cfaa 100644 --- a/src/storage/storage_backend_logical.c +++ b/src/storage/storage_backend_logical.c @@ -846,4 +846,5 @@ virStorageBackend virStorageBackendLogical = { .deleteVol = virStorageBackendLogicalDeleteVol, .uploadVol = virStorageBackendVolUploadLocal, .downloadVol = virStorageBackendVolDownloadLocal, + .wipeVol = virStorageBackendVolWipeLocal, }; diff --git a/src/storage/storage_backend_mpath.c b/src/storage/storage_backend_mpath.c index 402faa0935c004f415e0de37052bddf2837b89f4..f21ae4cafed424c180193a80417e0c42384d2a13 100644 --- a/src/storage/storage_backend_mpath.c +++ b/src/storage/storage_backend_mpath.c @@ -289,4 +289,5 @@ virStorageBackend virStorageBackendMpath = { .refreshPool = virStorageBackendMpathRefreshPool, .uploadVol = virStorageBackendVolUploadLocal, .downloadVol = virStorageBackendVolDownloadLocal, + .wipeVol = virStorageBackendVolWipeLocal, }; diff --git a/src/storage/storage_backend_scsi.c b/src/storage/storage_backend_scsi.c index 0b44f7145d6216bec55f5c3166d63569f7ecbdbc..dfb663b75e352b4ad84e77de194833221f22f13c 100644 --- a/src/storage/storage_backend_scsi.c +++ b/src/storage/storage_backend_scsi.c @@ -730,4 +730,5 @@ virStorageBackend virStorageBackendSCSI = { .stopPool = virStorageBackendSCSIStopPool, .uploadVol = virStorageBackendVolUploadLocal, .downloadVol = virStorageBackendVolDownloadLocal, + .wipeVol = virStorageBackendVolWipeLocal, }; diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c index 97571e8fe64d816ecbc8ab0b5e78b9e06b895fed..441da21897cd1a5409a185c7ed6193e448f10aeb 100644 --- a/src/storage/storage_driver.c +++ b/src/storage/storage_driver.c @@ -2100,6 +2100,7 @@ storageVolWipePattern(virStorageVolPtr obj, unsigned int algorithm, unsigned int flags) { + virStorageBackendPtr backend; virStoragePoolObjPtr pool = NULL; virStorageVolDefPtr vol = NULL; int ret = -1; @@ -2113,7 +2114,7 @@ storageVolWipePattern(virStorageVolPtr obj, return -1; } - if (!(vol = virStorageVolDefFromVol(obj, &pool, NULL))) + if (!(vol = virStorageVolDefFromVol(obj, &pool, &backend))) return -1; @@ -2134,10 +2135,13 @@ storageVolWipePattern(virStorageVolPtr obj, goto cleanup; } - if (virStorageBackendVolWipeLocal(obj->conn, pool, vol, algorithm, flags) < 0) + if (!backend->wipeVol) { + virReportError(VIR_ERR_NO_SUPPORT, "%s", + _("storage pool doesn't support volume wiping")); goto cleanup; + } - ret = 0; + ret = backend->wipeVol(obj->conn, pool, vol, algorithm, flags); cleanup: virStoragePoolObjUnlock(pool);