]> xenbits.xensource.com Git - libvirt.git/commitdiff
storage: Split out volume wiping as separate backend function
authorPeter Krempa <pkrempa@redhat.com>
Mon, 7 Jul 2014 14:50:11 +0000 (16:50 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 17 Jul 2014 08:12:34 +0000 (10:12 +0200)
For non-local storage drivers we can't expect to use the "scrub" tool to
wipe the volume. Split the code into a separate backend function so that
we can add protocol specific code later.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1118710

src/storage/storage_backend.h
src/storage/storage_backend_disk.c
src/storage/storage_backend_fs.c
src/storage/storage_backend_iscsi.c
src/storage/storage_backend_logical.c
src/storage/storage_backend_mpath.c
src/storage/storage_backend_scsi.c
src/storage/storage_driver.c

index 5e251d7b79a7c7cd6a0765b5ccc85914e3848c3e..e48da5bbecf2a3d4a8747a9e9c7e6a11f0648dc2 100644 (file)
@@ -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);
index f900dee5948e0e58b4627bb0ba449dece6c2086b..d85f13f05dc2e2a4be34625b5db807c4f42e65b8 100644 (file)
@@ -794,4 +794,5 @@ virStorageBackend virStorageBackendDisk = {
     .buildVolFrom = virStorageBackendDiskBuildVolFrom,
     .uploadVol = virStorageBackendVolUploadLocal,
     .downloadVol = virStorageBackendVolDownloadLocal,
+    .wipeVol = virStorageBackendVolWipeLocal,
 };
index 32471a76aacf06f9426ef2dff8e128a4a724e14e..40cc1f4059baad2b32d1ae766f80324e220a0f2c 100644 (file)
@@ -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,
 };
 
 
index 73455712f7bf4533e5eee6d2fba9824fc45bf850..1d0cf73962c0f5f7bc938a0c54b92e0278ec0b03 100644 (file)
@@ -476,4 +476,5 @@ virStorageBackend virStorageBackendISCSI = {
     .findPoolSources = virStorageBackendISCSIFindPoolSources,
     .uploadVol = virStorageBackendVolUploadLocal,
     .downloadVol = virStorageBackendVolDownloadLocal,
+    .wipeVol = virStorageBackendVolWipeLocal,
 };
index 60ad5f2f55ccdce674927f2d73fba211df876989..ab1e64befbb13076289ca8ca73081d49b7a6cfaa 100644 (file)
@@ -846,4 +846,5 @@ virStorageBackend virStorageBackendLogical = {
     .deleteVol = virStorageBackendLogicalDeleteVol,
     .uploadVol = virStorageBackendVolUploadLocal,
     .downloadVol = virStorageBackendVolDownloadLocal,
+    .wipeVol = virStorageBackendVolWipeLocal,
 };
index 402faa0935c004f415e0de37052bddf2837b89f4..f21ae4cafed424c180193a80417e0c42384d2a13 100644 (file)
@@ -289,4 +289,5 @@ virStorageBackend virStorageBackendMpath = {
     .refreshPool = virStorageBackendMpathRefreshPool,
     .uploadVol = virStorageBackendVolUploadLocal,
     .downloadVol = virStorageBackendVolDownloadLocal,
+    .wipeVol = virStorageBackendVolWipeLocal,
 };
index 0b44f7145d6216bec55f5c3166d63569f7ecbdbc..dfb663b75e352b4ad84e77de194833221f22f13c 100644 (file)
@@ -730,4 +730,5 @@ virStorageBackend virStorageBackendSCSI = {
     .stopPool = virStorageBackendSCSIStopPool,
     .uploadVol = virStorageBackendVolUploadLocal,
     .downloadVol = virStorageBackendVolDownloadLocal,
+    .wipeVol = virStorageBackendVolWipeLocal,
 };
index 97571e8fe64d816ecbc8ab0b5e78b9e06b895fed..441da21897cd1a5409a185c7ed6193e448f10aeb 100644 (file)
@@ -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);