1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-02-09 13:57:55 +03:00

stat oom_adj and stay silent if it doesn't exist

dm_event_handler now keeps private copies of strings
This commit is contained in:
Alasdair Kergon 2007-01-17 14:45:10 +00:00
parent a81926503d
commit 44c6c36c43
3 changed files with 109 additions and 37 deletions

View File

@ -1469,15 +1469,20 @@ static int _set_oom_adj(int val)
{ {
FILE *fp; FILE *fp;
struct stat st;
if (stat("/proc/self/oom_adj", &st) == -1)
return -errno;
fp = fopen("/proc/self/oom_adj", "w"); fp = fopen("/proc/self/oom_adj", "w");
if (!fp) if (!fp)
return 0; return -1;
fprintf(fp, "%i", val); fprintf(fp, "%i", val);
fclose(fp); fclose(fp);
return 1; return 0;
} }
static void _daemonize(void) static void _daemonize(void)
@ -1568,7 +1573,10 @@ int main(int argc, char *argv[])
_daemonize(); _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"); syslog(LOG_ERR, "Failed to set oom_adj to protect against OOM killer");
_init_thread_signals(); _init_thread_signals();

View File

@ -31,19 +31,23 @@
#include <arpa/inet.h> /* for htonl, ntohl */ #include <arpa/inet.h> /* for htonl, ntohl */
struct dm_event_handler { struct dm_event_handler {
const char *dso; char *dso;
const char *dev_name; char *dev_name;
const char *uuid; char *uuid;
int major; int major;
int minor; int minor;
enum dm_event_mask mask; 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->dev_name = dmevh->uuid = NULL;
dmevh->major = dmevh->minor = 0; dmevh->major = dmevh->minor = 0;
} }
@ -64,33 +68,57 @@ struct dm_event_handler *dm_event_handler_create(void)
void dm_event_handler_destroy(struct dm_event_handler *dmevh) 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); 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;
dmevh->uuid = uuid; _dm_event_handler_clear_dev_info(dmevh);
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) void dm_event_handler_set_major(struct dm_event_handler *dmevh, int major)
{ {
int minor = dmevh->minor; int minor = dmevh->minor;
dm_event_handler_clear_dev_name(dmevh); _dm_event_handler_clear_dev_info(dmevh);
dmevh->major = major; dmevh->major = major;
dmevh->minor = minor; dmevh->minor = minor;
@ -100,7 +128,7 @@ void dm_event_handler_set_minor(struct dm_event_handler *dmevh, int minor)
{ {
int major = dmevh->major; int major = dmevh->major;
dm_event_handler_clear_dev_name(dmevh); _dm_event_handler_clear_dev_info(dmevh);
dmevh->major = major; dmevh->major = major;
dmevh->minor = minor; dmevh->minor = minor;
@ -582,7 +610,7 @@ static int _parse_message(struct dm_event_daemon_message *msg, char **dso_name,
int dm_event_get_registered_device(struct dm_event_handler *dmevh, int next) int dm_event_get_registered_device(struct dm_event_handler *dmevh, int next)
{ {
int ret; int ret;
char *uuid = NULL; const char *uuid = NULL;
char *reply_dso = NULL, *reply_uuid = NULL; char *reply_dso = NULL, *reply_uuid = NULL;
enum dm_event_mask reply_mask; enum dm_event_mask reply_mask;
struct dm_task *dmt; struct dm_task *dmt;
@ -601,22 +629,56 @@ int dm_event_get_registered_device(struct dm_event_handler *dmevh, int next)
/* FIXME this will probably horribly break if we get /* FIXME this will probably horribly break if we get
ill-formatted reply */ ill-formatted reply */
ret = _parse_message(&msg, &reply_dso, &reply_uuid, &reply_mask); ret = _parse_message(&msg, &reply_dso, &reply_uuid, &reply_mask);
} else } else {
ret = -ENOENT; ret = -ENOENT;
goto fail;
if (msg.data) }
dm_free(msg.data);
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); 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_dso(dmevh, reply_dso);
dm_event_handler_set_event_mask(dmevh, reply_mask);
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; return ret;
} }

View File

@ -54,18 +54,20 @@ void dm_event_handler_destroy(struct dm_event_handler *dmevh);
/* /*
* Path of shared library to handle events. * 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 * Identify the device to monitor by exactly one of dev_name, uuid or
* dev_name, uuid or device number. * device number. String arguments are duplicated, see above.
* 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); 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_major(struct dm_event_handler *dmevh, int major);
void dm_event_handler_set_minor(struct dm_event_handler *dmevh, int minor); void dm_event_handler_set_minor(struct dm_event_handler *dmevh, int minor);