[libvirt] Extensions to the libvirt Storage API

Patrick Dignan pat_dignan at dell.com
Tue Jul 27 23:28:01 UTC 2010


Hi Everyone,

I'm looking at implementing some functionality in libvirt that would 
allow it to call functions in an unpublished iSCSI library.  Some of the 
functionality I wish to implement is not currently part of the libvirt 
storage API.  I wanted to suggest the following additions to the storage 
API: grow volumes, show whether thin provisioning is enabled, enable 
thin provisioning, disable thin provisioning, create snapshots, and 
delete snapshots.  I've added a patch at the end of the mail showing how 
I think these functions should be implemented.  Note that I have not 
included details about the virStorageSnapshotDefPtr yet, that's the next 
step.

Perhaps this should be in a separate mail for better threading, but it 
seems a bit strange to me that the storage interface isn't pluggable in 
the traditional sense.  In order to add a backend to libvirt, one has to 
make modifications all over the place, for example: virt-inst, the 
Makefile.am, the configure.ac, storage_backend.h, and several other 
places.  It would make sense to me to make this pluggable such that 
someone could just load in a library that implements the required 
functions and some identifying information (eg type of storage, 
description, etc).  A list of supported backends could be stored in 
empty files in a directory somewhere, or some similar hack.  This way 
someone could write a plugin for tgtd for example, or in my case the 
library I'm working with.  I think this would also help others with 
writing plugins for more storage backends.  How difficult do you think 
this would be?  I'm willing to do a reasonable amount of work to get 
this implemented, but I want to know what the experts think!

Best,

Patrick Dignan

--- libvirt-0.8.2.orig/src/storage/storage_backend.h    2010-06-16 
17:27:22.000000000 -0500
+++ libvirt-0.8.2.work/src/storage/storage_backend.h    2010-07-27 
16:36:08.321439851 -0500
@@ -43,6 +43,13 @@
  typedef int (*virStorageBackendBuildVolFrom)(virConnectPtr conn, 
virStoragePoolObjPtr pool,
                                               virStorageVolDefPtr 
origvol, virStorageVolDefPtr newvol,
                                               unsigned int flags);
+typedef int (*virStorageBackendGrowVol)(virConnectPtr conn, 
virStoragePoolObjPtr pool, virStorageVolDefPtr vol, unsigned long long 
newsize);
+typedef bool (*virStorageBackendThinProvisionShow)(virConnectPtr conn, 
virStoragePoolObjPtr pool, virStorageVolDefPtr vol);
+typedef int (*virStorageBackendThinProvisionEnable)(virConnectPtr conn, 
virStoragePoolObjPtr pool, virStorageVolDefPtr vol);
+typedef int (*virStorageBackendThinProvisionDisable)(virConnectPtr 
conn, virStoragePoolObjPtr pool, virStorageVolDefPtr vol);
+
+typedef int (virStorageBackendCreateSnapshot)(virConnectPtr conn, 
virStoragePoolObjPtr pool, virStorageVolDefPtr vol, 
virStorageSnapshotDefPtr snapshot);
+typedef int (virStorageBackendDeleteSnapshot)(virConnectPtr conn, 
virStoragePoolObjPtr pool, virStorageVolDefPtr vol, 
virStorageSnapshotDefPtr snapshot);

  /* File creation/cloning functions used for cloning between backends */
  int virStorageBackendCreateRaw(virConnectPtr conn,
@@ -76,6 +83,12 @@
      virStorageBackendCreateVol createVol;
      virStorageBackendRefreshVol refreshVol;
      virStorageBackendDeleteVol deleteVol;
+    virStorageBackendGrowVol growVol;
+    virStorageBackendThinProvisionShow thinProvisionShow;
+    virStorageBackendThinProvisionEnable thinProvisionEnable;
+    virStorageBackendThinProvisionDisable thinProvisionDisable;
+    virStorageBackendCreateSnapshot createSnapshot;
+    virStorageBackendDeleteSnapshot deleteSnapshot;
  };

  virStorageBackendPtr virStorageBackendForType(int type);




More information about the libvir-list mailing list