]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
ESX: add virStorageVolGetInfo in iSCSI backend.
authorDawid Zamirski <dzamirski@dattobackup.com>
Fri, 25 Apr 2014 18:20:41 +0000 (14:20 -0400)
committerMatthias Bolte <matthias.bolte@googlemail.com>
Sat, 10 May 2014 15:35:03 +0000 (17:35 +0200)
Since the ESX storage implements VMFS and iSCSI storage backends and
chooses relevant backend dynamically at runtime, there was a segfault
when issuing vol-info on iSCSI volume due to unimplemented
virStorageGetInfo function. This patch implements that function that was
missing in iSCSI backend and returns expected result without a segfault.

src/esx/esx_storage_backend_iscsi.c

index 4619629760f160f65408739ee2fd98466002b36a..41f895d235b9357fad0d538a79e0753ffecfac7e 100644 (file)
@@ -621,6 +621,52 @@ esxStorageVolCreateXMLFrom(virStoragePoolPtr pool ATTRIBUTE_UNUSED,
 
 
 
+static int
+esxStorageVolGetInfo(virStorageVolPtr volume,
+                     virStorageVolInfoPtr info)
+{
+    int result = -1;
+    esxPrivate *priv = volume->conn->storagePrivateData;
+    esxVI_ScsiLun *scsiLunList = NULL;
+    esxVI_ScsiLun *scsiLun;
+    esxVI_HostScsiDisk *hostScsiDisk = NULL;
+
+    if (esxVI_LookupScsiLunList(priv->primary, &scsiLunList) < 0) {
+        goto cleanup;
+    }
+
+    for (scsiLun = scsiLunList; scsiLun;
+         scsiLun = scsiLun->_next) {
+        hostScsiDisk = esxVI_HostScsiDisk_DynamicCast(scsiLun);
+
+        if (hostScsiDisk &&
+            STREQ(hostScsiDisk->deviceName, volume->name)) {
+            break;
+        }
+    }
+
+    if (!hostScsiDisk) {
+        virReportError(VIR_ERR_NO_STORAGE_VOL,
+                       _("Could not find volume with name: %s"),
+                       volume->name);
+        goto cleanup;
+    }
+
+    info->type = VIR_STORAGE_VOL_BLOCK;
+    info->capacity = hostScsiDisk->capacity->block->value *
+                     hostScsiDisk->capacity->blockSize->value;
+    info->allocation = info->capacity;
+
+    result = 0;
+
+ cleanup:
+    esxVI_ScsiLun_Free(&scsiLunList);
+
+    return result;
+}
+
+
+
 static char *
 esxStorageVolGetXMLDesc(virStorageVolPtr volume,
                         unsigned int flags)
@@ -752,6 +798,7 @@ virStorageDriver esxStorageBackendISCSI = {
     .storageVolLookupByKey = esxStorageVolLookupByKey, /* 1.0.1 */
     .storageVolCreateXML = esxStorageVolCreateXML, /* 1.0.1 */
     .storageVolCreateXMLFrom = esxStorageVolCreateXMLFrom, /* 1.0.1 */
+    .storageVolGetInfo = esxStorageVolGetInfo, /* 1.2.5 */
     .storageVolGetXMLDesc = esxStorageVolGetXMLDesc, /* 1.0.1 */
     .storageVolDelete = esxStorageVolDelete, /* 1.0.1 */
     .storageVolWipe = esxStorageVolWipe, /* 1.0.1 */