[lvm-devel] [PATCH 2/2] python-lvm: Add lv snapshot

Tony Asleson tasleson at redhat.com
Fri Nov 16 02:53:23 UTC 2012


Signed-off-by: Tony Asleson <tasleson at redhat.com>
---
 python/liblvm.c | 68 ++++++++++++++++++++++++++++++++++++++++++---------------
 1 file changed, 51 insertions(+), 17 deletions(-)

diff --git a/python/liblvm.c b/python/liblvm.c
index 831493e..c31a62f 100644
--- a/python/liblvm.c
+++ b/python/liblvm.c
@@ -72,6 +72,15 @@ static PyObject *LibLVMError;
 		}							\
 	} while (0)
 
+#define LV_VALID(lvobject)						\
+	do {								\
+		VG_VALID(lvobject->parent_vgobj);			\
+		if (!lvobject->lv) {					\
+			PyErr_SetString(PyExc_UnboundLocalError, "LV object invalid"); \
+			return NULL;					\
+		}							\
+	} while (0)
+
 static PyObject *
 liblvm_get_last_error(void)
 {
@@ -862,16 +871,26 @@ liblvm_lvm_vg_get_tags(vgobject *self)
 	return pytuple;
 }
 
+enum lv_create { PY_LV_LINEAR, PY_LV_SNAPSHOT };
+
 static PyObject *
-liblvm_lvm_vg_create_lv_linear(vgobject *self, PyObject *args)
+_liblvm_lv_create(void *self, PyObject *args, enum lv_create op)
 {
-	const char *vgname;
+	const char *name;
 	uint64_t size;
 	lvobject *lvobj;
+	vgobject *vgp = NULL;
+	lvobject *lvp = NULL;
 
-	VG_VALID(self);
+	if (op == PY_LV_LINEAR) {
+		vgp = (vgobject *)self;
+		VG_VALID(vgp);
+	} else {
+		lvp = (lvobject *)self;
+		LV_VALID(lvp);
+	}
 
-	if (!PyArg_ParseTuple(args, "sl", &vgname, &size)) {
+	if (!PyArg_ParseTuple(args, "sl", &name, &size)) {
 		return NULL;
 	}
 
@@ -881,23 +900,47 @@ liblvm_lvm_vg_create_lv_linear(vgobject *self, PyObject *args)
 	/* Initialize the parent ptr in case lv create fails and we dealloc lvobj */
 	lvobj->parent_vgobj = NULL;
 
-	if ((lvobj->lv = lvm_vg_create_lv_linear(self->vg, vgname, size)) == NULL) {
+	if (op == PY_LV_LINEAR) {
+		lvobj->lv = lvm_vg_create_lv_linear(vgp->vg, name, size);
+
+		if(lvobj->lv) {
+			lvobj->parent_vgobj = self;
+		}
+	} else {
+		lvobj->lv = lvm_lv_snapshot(lvp->lv, name, size);
+		if(lvobj->lv) {
+			lvobj->parent_vgobj = lvp->parent_vgobj;
+		}
+	}
+
+	if(!lvobj->lv) {
 		PyErr_SetObject(LibLVMError, liblvm_get_last_error());
 		Py_DECREF(lvobj);
 		return NULL;
 	}
 
-	lvobj->parent_vgobj = self;
 	Py_INCREF(lvobj->parent_vgobj);
 
 	return (PyObject *)lvobj;
 }
 
+static PyObject *
+liblvm_lvm_vg_create_lv_linear(vgobject *self, PyObject *args)
+{
+	return _liblvm_lv_create(self, args, PY_LV_LINEAR);
+}
+
+static PyObject *
+liblvm_lvm_lv_snapshot(lvobject *self, PyObject *args)
+{
+	return _liblvm_lv_create(self, args, PY_LV_SNAPSHOT);
+}
+
 static void
 liblvm_lv_dealloc(lvobject *self)
 {
 	/* We can dealloc an object that didn't get fully created */
-	if (self->parent_vgobj)	
+	if (self->parent_vgobj)
 		Py_DECREF(self->parent_vgobj);
 	PyObject_Del(self);
 }
@@ -1035,16 +1078,6 @@ liblvm_pv_dealloc(pvobject *self)
 
 /* LV Methods */
 
-#define LV_VALID(lvobject)						\
-	do {								\
-		VG_VALID(lvobject->parent_vgobj);			\
-		if (!lvobject->lv) {					\
-			PyErr_SetString(PyExc_UnboundLocalError, "LV object invalid"); \
-			return NULL;					\
-		}							\
-	} while (0)
-
-
 static PyObject *
 liblvm_lvm_lv_get_name(lvobject *self)
 {
@@ -1580,6 +1613,7 @@ static PyMethodDef liblvm_lv_methods[] = {
 	{ "rename",		(PyCFunction)liblvm_lvm_lv_rename, METH_VARARGS },
 	{ "resize",		(PyCFunction)liblvm_lvm_lv_resize, METH_VARARGS },
 	{ "listLVsegs",		(PyCFunction)liblvm_lvm_lv_list_lvsegs, METH_NOARGS },
+	{ "snapshot",		(PyCFunction)liblvm_lvm_lv_snapshot, METH_VARARGS },
 	{ NULL,	     NULL}   /* sentinel */
 };
 
-- 
1.7.11.7




More information about the lvm-devel mailing list