[PATCH pyblock 2/2]: Only install our own dm_log handler while doing dm stuff

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



We share the same memory space inside the python process with other
potentially libdevmapper users, for example libparted used libdevmapper too
having our dm_log handler installed, and thus getting called when
libparted tries to add / remove dmraid partitions, does not fare well.

This patch fixes this by installing / removing our dm_log handler around
libdevmapper usage, instead of permanently installing it once.
---
 dm.c |   61 +++++++++++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 49 insertions(+), 12 deletions(-)

diff --git a/dm.c b/dm.c
index 42f70a8..d4e3a6a 100644
--- a/dm.c
+++ b/dm.c
@@ -50,6 +50,9 @@
 #include "exc.h"

 #define PYDM_ARGS (METH_VARARGS|METH_KEYWORDS)
+
+void pydm_log_fn(int level, const char *file, int line, const char *f, ...);
+
 /* dev stuff begin */

 static void
@@ -645,6 +648,7 @@ PydmTable_FromInfo(loff_t start, u_int64_t size, char *type, char *params)
 #define python_error_destroy_task(task, err) \
 	if (PyErr_Occurred()) { \
 		dm_task_destroy(task); \
+		dm_log_init(NULL); \
 		return err; \
 	}

@@ -734,12 +738,14 @@ pydm_map_read(PydmMapObject *map, struct pydm_map_key *key)
 		return 0;

 	memset(info, 0, sizeof (struct dm_info));
+	dm_log_init(pydm_log_fn);
 	task = dm_task_create(DM_DEVICE_INFO);
 	if (!task) {
 		if (!PyErr_Occurred()) {
 			printf("%s: %d\n", __FILE__, __LINE__);
 			PyErr_NoMemory();
 		}
+		dm_log_init(NULL);
 		return -1;
 	}

@@ -755,7 +761,6 @@ pydm_map_read(PydmMapObject *map, struct pydm_map_key *key)
 	
 		switch (key->type) {
 			case NONE:
-				python_error_destroy_task(task, -1);
 				break;
 			case UUID:
 				if (!map->uuid)
@@ -776,11 +781,12 @@ pydm_map_read(PydmMapObject *map, struct pydm_map_key *key)
 			pydm_map_clear(map);
 			printf("%s: %d\n", __FILE__, __LINE__);
 			PyErr_NoMemory();
-			dm_task_destroy(task);
-			return -1;
-		}
-		map->initialized = 1;
-		return 0;
+		} else
+			map->initialized = 1;
+
+		dm_task_destroy(task);
+		dm_log_init(NULL);
+		return (map->initialized - 1);
 	}

 	map->uuid = strdup(dm_task_get_uuid(task));
@@ -789,6 +795,7 @@ pydm_map_read(PydmMapObject *map, struct pydm_map_key *key)
 	map->dev = PydmDevice_FromMajorMinor(info->major, info->minor);

 	dm_task_destroy(task);
+	dm_log_init(NULL);

 	if (!map->uuid && !map->name && !map->dev) {
 		pydm_map_clear(map);
@@ -839,12 +846,14 @@ pydm_map_simple(PydmMapObject *map, int taskno)
 	struct dm_task *task;
 	int rc;

+	dm_log_init(pydm_log_fn);
 	task = dm_task_create(taskno);
 	if (!task) {
 		if (!PyErr_Occurred()) {
 			printf("%s: %d\n", __FILE__, __LINE__);
 			PyErr_NoMemory();
 		}
+		dm_log_init(NULL);
 		return NULL;
 	}

@@ -853,17 +862,17 @@ pydm_map_simple(PydmMapObject *map, int taskno)
 		rc = -1;
 	if (rc < 0) {
 		PyErr_SetString(PyExc_AssertionError, "map is not initialized");
-		return NULL;
+		python_error_destroy_task(task, NULL);
 	}

 	pydm_task_set_key(task, &key);
-	rc = dm_task_run(task);
-	if (rc < 0 && PyErr_Occurred())
-		return NULL;
+	dm_task_run(task);
+	python_error_destroy_task(task, NULL);

 	dm_task_update_nodes();

 	dm_task_destroy(task);
+	dm_log_init(NULL);

 	if (PyErr_Occurred())
 		return NULL;
@@ -877,12 +886,14 @@ pydm_map_create(PydmMapObject *map, PyObject *table)
 	struct dm_task *task;
 	int i;

+	dm_log_init(pydm_log_fn);
 	task = dm_task_create(DM_DEVICE_CREATE);
 	if (!task) {
 		if (!PyErr_Occurred()) {
 			printf("%s: %d\n", __FILE__, __LINE__);
 			PyErr_NoMemory();
 		}
+		dm_log_init(NULL);
 		return -1;
 	}

@@ -901,6 +912,7 @@ pydm_map_create(PydmMapObject *map, PyObject *table)
 			PyErr_SetString(PyExc_ValueError,
 				"invalid table type in table list");
 			dm_task_destroy(task);
+			dm_log_init(NULL);
 			return -1;
 		}
 		dm_task_add_target(task, row->start, row->size,
@@ -920,6 +932,7 @@ pydm_map_create(PydmMapObject *map, PyObject *table)

 	dm_task_update_nodes();
 	dm_task_destroy(task);
+	dm_log_init(NULL);
 	if (PyErr_Occurred())
 		return -1;
 	map->initialized = 0;
@@ -1012,18 +1025,21 @@ pydm_map_set_name(PydmMapObject *map, const char *name)
 	if (rc < 0)
 		return rc;

+	dm_log_init(pydm_log_fn);
 	task = dm_task_create(DM_DEVICE_RENAME);
 	if (!task) {
 		if (!PyErr_Occurred()) {
 			printf("%s: %d\n", __FILE__, __LINE__);
 			PyErr_NoMemory();
 		}
+		dm_log_init(NULL);
 		return -1;
 	}

 	newname = strdup(name);
 	if (!newname) {
 		dm_task_destroy(task);
+		dm_log_init(NULL);
 		printf("%s: %d\n", __FILE__, __LINE__);
 		PyErr_NoMemory();
 		return -1;
@@ -1042,6 +1058,7 @@ pydm_map_set_name(PydmMapObject *map, const char *name)

 	dm_task_update_nodes();
 	dm_task_destroy(task);
+	dm_log_init(NULL);

 	free(map->name);
 	map->name = newname;
@@ -1062,12 +1079,14 @@ pydm_map_set_suspend(PydmMapObject *map, int suspend)
 		return rc;
 	}

+	dm_log_init(pydm_log_fn);
 	task = dm_task_create(suspend ? DM_DEVICE_SUSPEND : DM_DEVICE_RESUME);
 	if (!task) {
 		if (!PyErr_Occurred()) {
 			printf("%s: %d\n", __FILE__, __LINE__);
 			PyErr_NoMemory();
 		}
+		dm_log_init(NULL);
 		return -1;
 	}
 	pydm_task_set_key(task, &key);
@@ -1077,6 +1096,7 @@ pydm_map_set_suspend(PydmMapObject *map, int suspend)

 	dm_task_update_nodes();
 	dm_task_destroy(task);
+	dm_log_init(NULL);

 	return pydm_map_refresh(map);
 }
@@ -1096,17 +1116,20 @@ pydm_map_get_table(PydmMapObject *map)
 		return NULL;
 	}

+	dm_log_init(pydm_log_fn);
 	task = dm_task_create(DM_DEVICE_TABLE);
 	if (!task) {
 		if (!PyErr_Occurred()) {
 			printf("%s: %d\n", __FILE__, __LINE__);
 			PyErr_NoMemory();
 		}
+		dm_log_init(NULL);
 		return NULL;
 	}

 	pydm_task_set_key(task, &key);
 	dm_task_run(task);
+	python_error_destroy_task(task, NULL);

 	do {
 		u_int64_t start, length;
@@ -1142,6 +1165,8 @@ pydm_map_get_table(PydmMapObject *map)

 	dm_task_update_nodes();
 	dm_task_destroy(task);
+	dm_log_init(NULL);
+
  	return table_list;
 }

@@ -1161,12 +1186,14 @@ pydm_map_get_deps(PydmMapObject *map)
 		return o;
 	}

+	dm_log_init(pydm_log_fn);
 	task = dm_task_create(DM_DEVICE_DEPS);
 	if (!task) {
 		if (!PyErr_Occurred()) {
 			printf("%s: %d\n", __FILE__, __LINE__);
 			PyErr_NoMemory();
 		}
+		dm_log_init(NULL);
 		return o;
 	}

@@ -1184,12 +1211,14 @@ pydm_map_get_deps(PydmMapObject *map)
 	if (!info->exists) {
 		PyErr_SetString(PyExc_AssertionError, "map does not exist");
 		dm_task_destroy(task);
+		dm_log_init(NULL);
 		return o;
 	}

 	o = PyTuple_New(deps->count);
 	if (!o) {
 		dm_task_destroy(task);
+		dm_log_init(NULL);
 		if (!PyErr_Occurred()) {
 			printf("%s: %d\n", __FILE__, __LINE__);
 			PyErr_NoMemory();
@@ -1204,6 +1233,7 @@ pydm_map_get_deps(PydmMapObject *map)

 		if (!dev) {
 			dm_task_destroy(task);
+			dm_log_init(NULL);
 			Py_DECREF(o);
 			if (!PyErr_Occurred()) {
 				printf("%s: %d\n", __FILE__, __LINE__);
@@ -1214,6 +1244,7 @@ pydm_map_get_deps(PydmMapObject *map)
 		rc = PyTuple_SetItem(o, i, dev);
 		if (rc < 0) {
 			dm_task_destroy(task);
+			dm_log_init(NULL);
 			Py_DECREF(o);
 			if (!PyErr_Occurred()) {
 				printf("%s: %d\n", __FILE__, __LINE__);
@@ -1224,6 +1255,7 @@ pydm_map_get_deps(PydmMapObject *map)
 	}
 	dm_task_update_nodes();
 	dm_task_destroy(task);
+	dm_log_init(NULL);

 	if (PyErr_Occurred()) {
 		Py_DECREF(o);
@@ -1494,13 +1526,15 @@ pydm_log_init(PyObject *self, PyObject *args, PyObject *kwds)
 {
 	char *kwlist[] = {"log_function", NULL};

+	Py_CLEAR(pydm_py_log_fn);
+
 	if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:log_init", kwlist,
 			&pydm_py_log_fn))
 		return NULL;

 	if (pydm_py_log_fn == Py_None) {
-		dm_log_init(NULL);
 		pydm_py_log_fn = NULL;
+		Py_INCREF(Py_None);
 		return Py_None;
 	}

@@ -1511,7 +1545,6 @@ pydm_log_init(PyObject *self, PyObject *args, PyObject *kwds)
 	}

 	Py_INCREF(pydm_py_log_fn);
-	dm_log_init(pydm_log_fn);
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -1595,6 +1628,7 @@ pydm_maps(PyObject *self)
 		goto save_list;
         }

+	dm_log_init(pydm_log_fn);
 	task = dm_task_create(DM_DEVICE_LIST);
 	if (!task) {
 		if (!PyErr_Occurred()) {
@@ -1642,6 +1676,7 @@ out:
 	Py_XDECREF(list);
 	if (task)
 		dm_task_destroy(task);
+	dm_log_init(NULL);
 	if (PyErr_Occurred()) {
 		Py_XDECREF(ret);
 		return NULL;
@@ -1663,6 +1698,7 @@ pydm_targets(PyObject *self)
 	if (!list)
 		goto out;

+	dm_log_init(pydm_log_fn);
 	task = dm_task_create(DM_DEVICE_LIST_VERSIONS);
 	if (!task) {
 		if (!PyErr_Occurred())
@@ -1714,6 +1750,7 @@ out:
 	Py_XDECREF(list);
 	if (task)
 		dm_task_destroy(task);
+	dm_log_init(NULL);
 	if (PyErr_Occurred()) {
 		Py_XDECREF(ret);
 		return NULL;
--
1.6.1.3

_______________________________________________
Anaconda-devel-list mailing list
Anaconda-devel-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/anaconda-devel-list

[Index of Archives]     [Kickstart]     [Fedora Users]     [Fedora Legacy List]     [Fedora Maintainers]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [Yosemite Photos]     [KDE Users]     [Fedora Tools]
  Powered by Linux