[dm-devel] device-mapper/dmeventd dmeventd.c libdevmapper ...
agk at sourceware.org
agk at sourceware.org
Tue Jan 16 23:03:14 UTC 2007
CVSROOT: /cvs/dm
Module name: device-mapper
Changes by: agk at 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.
More information about the dm-devel
mailing list