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