* device-mapper/dmeventd dmeventd.c libdevmapper ...
@ 2007-01-15 19:47 agk
0 siblings, 0 replies; 3+ messages in thread
From: agk @ 2007-01-15 19:47 UTC (permalink / raw)
To: dm-cvs, dm-devel
CVSROOT: /cvs/dm
Module name: device-mapper
Changes by: agk@sourceware.org 2007-01-15 19:47:49
Modified files:
dmeventd : dmeventd.c libdevmapper-event.c
Log message:
fix recent checkins
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/dmeventd.c.diff?cvsroot=dm&r1=1.31&r2=1.32
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/libdevmapper-event.c.diff?cvsroot=dm&r1=1.14&r2=1.15
--- device-mapper/dmeventd/dmeventd.c 2007/01/15 19:19:31 1.31
+++ device-mapper/dmeventd/dmeventd.c 2007/01/15 19:47:48 1.32
@@ -855,7 +855,7 @@
events. However, if timeout thread cannot be started, it
usually means we are so starved on resources that we are
almost as good as dead already... */
- if (thread->events & DM_EVENT_TIMEOUT) {
+ if (thread_new->events & DM_EVENT_TIMEOUT) {
ret = -_register_for_timeout(thread);
if (ret) {
_unlock_mutex();
--- device-mapper/dmeventd/libdevmapper-event.c 2007/01/15 19:11:58 1.14
+++ device-mapper/dmeventd/libdevmapper-event.c 2007/01/15 19:47:49 1.15
@@ -426,6 +426,7 @@
else if (dmevh->major && dmevh->minor) {
dm_task_set_major(dmt, dmevh->major);
dm_task_set_minor(dmt, dmevh->minor);
+ }
/* FIXME Add name or uuid or devno to messages */
if (!dm_task_run(dmt)) {
@@ -433,7 +434,7 @@
goto failed;
}
- if (!dm_task_get_info(dmt, &info))
+ if (!dm_task_get_info(dmt, &info)) {
log_error("_get_device_info: failed to get info for device");
goto failed;
}
^ permalink raw reply [flat|nested] 3+ messages in thread
* device-mapper/dmeventd dmeventd.c libdevmapper ...
@ 2007-01-16 23:03 agk
0 siblings, 0 replies; 3+ messages in thread
From: agk @ 2007-01-16 23:03 UTC (permalink / raw)
To: dm-cvs, dm-devel
CVSROOT: /cvs/dm
Module name: device-mapper
Changes by: agk@sourceware.org 2007-01-16 23:03:13
Modified files:
dmeventd : dmeventd.c libdevmapper-event.c
libdevmapper-event.h
Log message:
more fixes
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/dmeventd.c.diff?cvsroot=dm&r1=1.38&r2=1.39
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/libdevmapper-event.c.diff?cvsroot=dm&r1=1.17&r2=1.18
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/libdevmapper-event.h.diff?cvsroot=dm&r1=1.8&r2=1.9
--- device-mapper/dmeventd/dmeventd.c 2007/01/16 21:13:07 1.38
+++ device-mapper/dmeventd/dmeventd.c 2007/01/16 23:03:13 1.39
@@ -1005,40 +1005,55 @@
/* If DSO names and device paths are equal. */
if (dso_name && device_uuid)
return !strcmp(dso_name, thread->dso_data->dso_name) &&
- !strcmp(device_uuid, thread->device.uuid);
+ !strcmp(device_uuid, thread->device.uuid) &&
+ (thread->status == DM_THREAD_RUNNING ||
+ (thread->events & DM_EVENT_REGISTRATION_PENDING));
/* If DSO names are equal. */
if (dso_name)
- return !strcmp(dso_name, thread->dso_data->dso_name);
+ return !strcmp(dso_name, thread->dso_data->dso_name) &&
+ (thread->status == DM_THREAD_RUNNING ||
+ (thread->events & DM_EVENT_REGISTRATION_PENDING));
/* If device paths are equal. */
if (device_uuid)
- return !strcmp(device_uuid, thread->device.uuid);
+ return !strcmp(device_uuid, thread->device.uuid) &&
+ (thread->status == DM_THREAD_RUNNING ||
+ (thread->events & DM_EVENT_REGISTRATION_PENDING));
return 1;
}
static int _get_registered_dev(struct message_data *message_data, int next)
{
- int hit = 0;
- struct thread_status *thread;
+ struct thread_status *thread, *hit = NULL;
_lock_mutex();
/* Iterate list of threads checking if we want a particular one. */
list_iterate_items(thread, &_thread_registry)
- if ((hit = _want_registered_device(message_data->dso_name,
- message_data->device_uuid,
- thread)))
- break;
+ if (_want_registered_device(message_data->dso_name,
+ message_data->device_uuid,
+ thread)) {
+ hit = thread;
+ break;
+ }
/*
* If we got a registered device and want the next one ->
* fetch next conforming element off the list.
*/
- if (!hit || !next)
+ if (hit && !next) {
+ _unlock_mutex();
+ return _registered_device(message_data, hit);
+ }
+
+ if (!hit)
goto out;
+ goto out; /* FIXME the next == 1 thing is currently horridly
+ broken, do something about it... */
+
do {
if (list_end(&_thread_registry, &thread->list))
goto out;
@@ -1046,6 +1061,7 @@
thread = list_item(thread->list.n, struct thread_status);
} while (!_want_registered_device(message_data->dso_name, NULL, thread));
+ _unlock_mutex();
return _registered_device(message_data, thread);
out:
--- device-mapper/dmeventd/libdevmapper-event.c 2007/01/16 21:13:07 1.17
+++ device-mapper/dmeventd/libdevmapper-event.c 2007/01/16 23:03:13 1.18
@@ -556,12 +556,12 @@
/* Parse a device message from the daemon. */
static int _parse_message(struct dm_event_daemon_message *msg, char **dso_name,
- char **dev_name, enum dm_event_mask *evmask)
+ char **uuid, enum dm_event_mask *evmask)
{
char *p = msg->data;
if ((*dso_name = _fetch_string(&p, ' ')) &&
- (*dev_name = _fetch_string(&p, ' '))) {
+ (*uuid = _fetch_string(&p, ' '))) {
*evmask = atoi(p);
return 0;
@@ -577,41 +577,45 @@
* @mask
* @next
*
- * FIXME: This function sucks.
- *
- * Returns: 1 if device found, 0 otherwise (even on error)
+ * Returns: 0 if handler found, error (-ENOMEM, -ENOENT) otherwise
*/
-int dm_event_get_registered_device(char **dso_name, char **device_path,
- enum dm_event_mask *mask, int next)
+int dm_event_get_registered_device(struct dm_event_handler *dmevh, int next)
{
int ret;
- char *dso_name_arg = NULL, *device_path_arg = NULL;
+ char *uuid = NULL;
+ char *reply_dso = NULL, *reply_uuid = NULL;
+ enum dm_event_mask reply_mask;
+ struct dm_task *dmt;
struct dm_event_daemon_message msg;
+ if (!(dmt = _get_device_info(dmevh))) {
+ stack;
+ return 0;
+ }
+
+ uuid = dm_task_get_uuid(dmt);
+
if (!(ret = _do_event(next ? DM_EVENT_CMD_GET_NEXT_REGISTERED_DEVICE :
DM_EVENT_CMD_GET_REGISTERED_DEVICE,
- &msg, *dso_name, *device_path, *mask, 0))) {
- ret = !_parse_message(&msg, &dso_name_arg, &device_path_arg,
- mask);
- } else /* FIXME: Make sure this is ENOENT */
- ret = 0;
+ &msg, dmevh->dso, uuid, dmevh->mask, 0))) {
+ /* FIXME this will probably horribly break if we get
+ ill-formatted reply */
+ ret = _parse_message(&msg, &reply_dso, &reply_uuid, &reply_mask);
+ } else
+ ret = -ENOENT;
if (msg.data)
dm_free(msg.data);
- if (next) {
- if (*dso_name)
- dm_free(*dso_name);
- if (*device_path)
- dm_free(*device_path);
- *dso_name = dso_name_arg;
- *device_path = device_path_arg;
- } else {
- if (!(*dso_name))
- *dso_name = dso_name_arg;
- if (!(*device_path))
- *device_path = device_path_arg;
- }
+ dm_event_handler_set_uuid(dmevh, reply_uuid);
+ dm_event_handler_set_dso(dmevh, reply_dso);
+ dm_event_handler_set_event_mask(dmevh, reply_mask);
+ /* FIXME also fill in name and device number */
+ /* FIXME this probably leaks memory, since noone is going to
+ dm_free the bits in dmevh -- needs changes to
+ dm_event_handle_set behaviour */
+
+ dm_task_destroy(dmt);
return ret;
}
--- device-mapper/dmeventd/libdevmapper-event.h 2007/01/16 18:03:40 1.8
+++ device-mapper/dmeventd/libdevmapper-event.h 2007/01/16 23:03:13 1.9
@@ -60,6 +60,8 @@
/*
* Identify the device to monitor by exactly one of
* dev_name, uuid or device number.
+ * FIXME we should give guarantees about how dev_name and uuid
+ * pontiers are handled, eg dm_strdup them
*/
void dm_event_handler_set_dev_name(struct dm_event_handler *dmevh, const char *dev_name);
@@ -81,9 +83,8 @@
int dm_event_handler_get_minor(const struct dm_event_handler *dmevh);
enum dm_event_mask dm_event_handler_get_event_mask(const struct dm_event_handler *dmevh);
-/* FIXME Review interface */
-int dm_event_get_registered_device(char **dso_name, char **device_path,
- enum dm_event_mask *evmask, int next);
+/* FIXME Review interface (what about this next thing?) */
+int dm_event_get_registered_device(struct dm_event_handler *dmevh, int next);
/*
* Initiate monitoring using dmeventd.
^ permalink raw reply [flat|nested] 3+ messages in thread
* device-mapper/dmeventd dmeventd.c libdevmapper ...
@ 2007-01-17 14:45 agk
0 siblings, 0 replies; 3+ messages in thread
From: agk @ 2007-01-17 14:45 UTC (permalink / raw)
To: dm-cvs, dm-devel
CVSROOT: /cvs/dm
Module name: device-mapper
Changes by: agk@sourceware.org 2007-01-17 14:45:11
Modified files:
dmeventd : dmeventd.c libdevmapper-event.c
libdevmapper-event.h
Log message:
stat oom_adj and stay silent if it doesn't exist
dm_event_handler now keeps private copies of strings
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/dmeventd.c.diff?cvsroot=dm&r1=1.39&r2=1.40
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/libdevmapper-event.c.diff?cvsroot=dm&r1=1.18&r2=1.19
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/libdevmapper-event.h.diff?cvsroot=dm&r1=1.9&r2=1.10
--- device-mapper/dmeventd/dmeventd.c 2007/01/16 23:03:13 1.39
+++ device-mapper/dmeventd/dmeventd.c 2007/01/17 14:45:10 1.40
@@ -1469,15 +1469,20 @@
{
FILE *fp;
+ struct stat st;
+
+ if (stat("/proc/self/oom_adj", &st) == -1)
+ return -errno;
+
fp = fopen("/proc/self/oom_adj", "w");
if (!fp)
- return 0;
+ return -1;
fprintf(fp, "%i", val);
fclose(fp);
- return 1;
+ return 0;
}
static void _daemonize(void)
@@ -1568,7 +1573,10 @@
_daemonize();
- if (!_set_oom_adj(-16))
+ /*
+ * ENOENT means the kernel does not support oom_adj
+ */
+ if (_set_oom_adj(-16) != -ENOENT)
syslog(LOG_ERR, "Failed to set oom_adj to protect against OOM killer");
_init_thread_signals();
--- device-mapper/dmeventd/libdevmapper-event.c 2007/01/16 23:03:13 1.18
+++ device-mapper/dmeventd/libdevmapper-event.c 2007/01/17 14:45:10 1.19
@@ -31,19 +31,23 @@
#include <arpa/inet.h> /* for htonl, ntohl */
struct dm_event_handler {
- const char *dso;
+ char *dso;
- const char *dev_name;
+ char *dev_name;
- const char *uuid;
+ char *uuid;
int major;
int minor;
enum dm_event_mask mask;
};
-static void dm_event_handler_clear_dev_name(struct dm_event_handler *dmevh)
+static void _dm_event_handler_clear_dev_info(struct dm_event_handler *dmevh)
{
+ if (dmevh->dev_name)
+ dm_free(dmevh->dev_name);
+ if (dmevh->uuid)
+ dm_free(dmevh->uuid);
dmevh->dev_name = dmevh->uuid = NULL;
dmevh->major = dmevh->minor = 0;
}
@@ -64,33 +68,57 @@
void dm_event_handler_destroy(struct dm_event_handler *dmevh)
{
+ _dm_event_handler_clear_dev_info(dmevh);
+ if (dmevh->dso)
+ dm_free(dmevh->dso);
dm_free(dmevh);
}
-void dm_event_handler_set_dso(struct dm_event_handler *dmevh, const char *path)
+int dm_event_handler_set_dso(struct dm_event_handler *dmevh, const char *path)
{
- dmevh->dso = path;
+ if (!path) /* noop */
+ return 0;
+ if (dmevh->dso)
+ dm_free(dmevh->dso);
+
+ dmevh->dso = dm_strdup(path);
+ if (!dmevh->dso)
+ return -ENOMEM;
+
+ return 0;
}
-void dm_event_handler_set_dev_name(struct dm_event_handler *dmevh, const char *dev_name)
+int dm_event_handler_set_dev_name(struct dm_event_handler *dmevh, const char *dev_name)
{
- dm_event_handler_clear_dev_name(dmevh);
+ if (!dev_name)
+ return 0;
- dmevh->dev_name = dev_name;
+ _dm_event_handler_clear_dev_info(dmevh);
+
+ dmevh->dev_name = dm_strdup(dev_name);
+ if (!dmevh->dev_name)
+ return -ENOMEM;
+ return 0;
}
-void dm_event_handler_set_uuid(struct dm_event_handler *dmevh, const char *uuid)
+int dm_event_handler_set_uuid(struct dm_event_handler *dmevh, const char *uuid)
{
- dm_event_handler_clear_dev_name(dmevh);
+ if (!uuid)
+ return 0;
+
+ _dm_event_handler_clear_dev_info(dmevh);
- dmevh->uuid = uuid;
+ dmevh->uuid = dm_strdup(uuid);
+ if (!dmevh->dev_name)
+ return -ENOMEM;
+ return 0;
}
void dm_event_handler_set_major(struct dm_event_handler *dmevh, int major)
{
int minor = dmevh->minor;
- dm_event_handler_clear_dev_name(dmevh);
+ _dm_event_handler_clear_dev_info(dmevh);
dmevh->major = major;
dmevh->minor = minor;
@@ -100,7 +128,7 @@
{
int major = dmevh->major;
- dm_event_handler_clear_dev_name(dmevh);
+ _dm_event_handler_clear_dev_info(dmevh);
dmevh->major = major;
dmevh->minor = minor;
@@ -582,7 +610,7 @@
int dm_event_get_registered_device(struct dm_event_handler *dmevh, int next)
{
int ret;
- char *uuid = NULL;
+ const char *uuid = NULL;
char *reply_dso = NULL, *reply_uuid = NULL;
enum dm_event_mask reply_mask;
struct dm_task *dmt;
@@ -601,23 +629,57 @@
/* FIXME this will probably horribly break if we get
ill-formatted reply */
ret = _parse_message(&msg, &reply_dso, &reply_uuid, &reply_mask);
- } else
+ } else {
ret = -ENOENT;
+ goto fail;
+ }
- if (msg.data)
+ dm_task_destroy(dmt);
+
+ if (msg.data) {
dm_free(msg.data);
+ msg.data = NULL;
+ }
+
+ _dm_event_handler_clear_dev_info(dmevh);
+ dmevh->uuid = dm_strdup(reply_uuid);
+ if (!dmevh->uuid) {
+ ret = -ENOMEM;
+ goto fail;
+ }
+
+ if (!(dmt = _get_device_info(dmevh))) {
+ ret = -ENXIO; /* dmeventd probably gave us bogus uuid back */
+ goto fail;
+ }
- dm_event_handler_set_uuid(dmevh, reply_uuid);
dm_event_handler_set_dso(dmevh, reply_dso);
dm_event_handler_set_event_mask(dmevh, reply_mask);
- /* FIXME also fill in name and device number */
- /* FIXME this probably leaks memory, since noone is going to
- dm_free the bits in dmevh -- needs changes to
- dm_event_handle_set behaviour */
+ dmevh->dev_name = dm_strdup(dm_task_get_name(dmt));
+ if (!dmevh->dev_name) {
+ ret = -ENOMEM;
+ goto fail;
+ }
+
+ struct dm_info info;
+ if (!dm_task_get_info(dmt, &info)) {
+ ret = -1;
+ goto fail;
+ }
+
+ dmevh->major = info.major;
+ dmevh->minor = info.minor;
dm_task_destroy(dmt);
return ret;
+
+ fail:
+ if (msg.data)
+ dm_free(msg.data);
+ _dm_event_handler_clear_dev_info(dmevh);
+ dm_task_destroy(dmt);
+ return ret;
}
#if 0 /* left out for now */
--- device-mapper/dmeventd/libdevmapper-event.h 2007/01/16 23:03:13 1.9
+++ device-mapper/dmeventd/libdevmapper-event.h 2007/01/17 14:45:10 1.10
@@ -54,18 +54,20 @@
/*
* Path of shared library to handle events.
+ *
+ * All of dso, dev_name and uuid strings are duplicated, you do not
+ * need to keep the pointers valid after the call succeeds. Thes may
+ * return -ENOMEM though.
*/
-void dm_event_handler_set_dso(struct dm_event_handler *dmevh, const char *path);
+int dm_event_handler_set_dso(struct dm_event_handler *dmevh, const char *path);
/*
- * Identify the device to monitor by exactly one of
- * dev_name, uuid or device number.
- * FIXME we should give guarantees about how dev_name and uuid
- * pontiers are handled, eg dm_strdup them
+ * Identify the device to monitor by exactly one of dev_name, uuid or
+ * device number. String arguments are duplicated, see above.
*/
-void dm_event_handler_set_dev_name(struct dm_event_handler *dmevh, const char *dev_name);
+int dm_event_handler_set_dev_name(struct dm_event_handler *dmevh, const char *dev_name);
-void dm_event_handler_set_uuid(struct dm_event_handler *dmevh, const char *uuid);
+int dm_event_handler_set_uuid(struct dm_event_handler *dmevh, const char *uuid);
void dm_event_handler_set_major(struct dm_event_handler *dmevh, int major);
void dm_event_handler_set_minor(struct dm_event_handler *dmevh, int minor);
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2007-01-17 14:45 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-01-17 14:45 device-mapper/dmeventd dmeventd.c libdevmapper agk
-- strict thread matches above, loose matches on Subject: below --
2007-01-16 23:03 agk
2007-01-15 19:47 agk
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.