1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-21 13:34:40 +03:00

more fixes

This commit is contained in:
Alasdair Kergon 2007-01-16 23:03:13 +00:00
parent f6af1a67b5
commit 5611829c89
3 changed files with 60 additions and 39 deletions

View File

@ -1005,40 +1005,55 @@ static int _want_registered_device(char *dso_name, char *device_uuid,
/* 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 @@ static int _get_registered_dev(struct message_data *message_data, int next)
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:

View File

@ -556,12 +556,12 @@ static char *_fetch_string(char **src, const int delimiter)
/* 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 @@ static int _parse_message(struct dm_event_daemon_message *msg, char **dso_name,
* @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;
}

View File

@ -60,6 +60,8 @@ void 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
*/
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_major(const struct dm_event_handler *dmevh);
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.