FAQ Search Today's Posts Mark Forums Read
» Video Reviews

» Linux Archive

Linux-archive is a website aiming to archive linux email lists and to make them easily accessible for linux users/developers.


» Sponsor

» Partners

» Sponsor

Go Back   Linux Archive > Ubuntu > Ubuntu User

 
 
LinkBack Thread Tools
 
Old 03-05-2009, 11:32 PM
Hans de Goede
 
Default : Only install our own dm_log handler while doing dm stuff

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
", __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
", __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
", __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
", __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
", __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
", __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
", __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
", __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
", __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
", __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
", __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
", __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@redhat.com
https://www.redhat.com/mailman/listinfo/anaconda-devel-list
 

Thread Tools




All times are GMT. The time now is 10:43 PM.

VBulletin, Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.
Copyright 2007 - 2008, www.linux-archive.org