CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: zkabelac@sourceware.org 2010-03-30 14:35:41 Modified files: daemons/dmeventd: dmeventd.c Log message: Remove mlockall() form dmeventd As the header file <sys/mman.h> was not included in dmeventd.c thus missed definition of MCL_CURRENT so this patch only makes it obvious we were not locking memory here. This patch has no functional change. Later part of this patch set handles mlockall() via memlock_inc_daemon(). Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/daemons/dmeventd/dmeventd.c.diff?cvsroot=lvm2&r1=1.54&r2=1.55 --- LVM2/daemons/dmeventd/dmeventd.c 2008/11/04 15:07:44 1.54 +++ LVM2/daemons/dmeventd/dmeventd.c 2010/03/30 14:35:40 1.55 @@ -1725,11 +1725,6 @@ pthread_mutex_init(&_global_mutex, NULL); -#ifdef MCL_CURRENT - if (mlockall(MCL_CURRENT | MCL_FUTURE) == -1) - exit(EXIT_FAILURE); -#endif - if ((ret = _open_fifos(&fifos))) exit(EXIT_FIFO_FAILURE); @@ -1749,9 +1744,6 @@ _exit_dm_lib(); -#ifdef MCL_CURRENT - munlockall(); -#endif pthread_mutex_destroy(&_global_mutex); syslog(LOG_NOTICE, "dmeventd shutting down.");
CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: zkabelac@sourceware.org 2010-03-30 14:37:28 Modified files: daemons/dmeventd: dmeventd.c Log message: Fix resouce leak in error path If the error path of _register_for_event() calls _free_thread_status() _lib_put() call is missing. To make thing simpler move this _lib_put() into common error path code. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/daemons/dmeventd/dmeventd.c.diff?cvsroot=lvm2&r1=1.55&r2=1.56 --- LVM2/daemons/dmeventd/dmeventd.c 2010/03/30 14:35:40 1.55 +++ LVM2/daemons/dmeventd/dmeventd.c 2010/03/30 14:37:28 1.56 @@ -243,8 +243,10 @@ return ret; } +static void _lib_put(struct dso_data *data); static void _free_thread_status(struct thread_status *thread) { + _lib_put(thread->dso_data); if (thread->current_task) dm_task_destroy(thread->current_task); dm_free(thread->device.uuid); @@ -1481,7 +1483,6 @@ if (thread->status == DM_THREAD_DONE) { dm_list_del(l); pthread_join(thread->thread, NULL); - _lib_put(thread->dso_data); _free_thread_status(thread); } }
CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: zkabelac@sourceware.org 2010-03-30 14:40:30 Modified files: daemons/dmeventd: dmeventd.c Log message: Force C locale As we need to use mlockall() enforce "C" locales for dmeventd. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/daemons/dmeventd/dmeventd.c.diff?cvsroot=lvm2&r1=1.56&r2=1.57 --- LVM2/daemons/dmeventd/dmeventd.c 2010/03/30 14:37:28 1.56 +++ LVM2/daemons/dmeventd/dmeventd.c 2010/03/30 14:40:30 1.57 @@ -1698,6 +1698,13 @@ } } + /* + * Switch to C locale to avoid reading large locale-archive file + * used by some glibc (on some distributions it takes over 100MB). + * Daemon currently needs to use mlockall(). + */ + setenv("LANG", "C", 1); + if (!_debug) _daemonize();
CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: zkabelac@sourceware.org 2010-10-26 08:54:37 Modified files: daemons/dmeventd: dmeventd.c Log message: Update C declaration () -> (void) Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/daemons/dmeventd/dmeventd.c.diff?cvsroot=lvm2&r1=1.68&r2=1.69 --- LVM2/daemons/dmeventd/dmeventd.c 2010/10/25 11:57:07 1.68 +++ LVM2/daemons/dmeventd/dmeventd.c 2010/10/26 08:54:37 1.69 @@ -1477,7 +1477,7 @@ dm_free(msg.data); } -static void _process_initial_registrations() +static void _process_initial_registrations(void) { int i = 0; char *reg; @@ -1697,7 +1697,7 @@ setsid(); } -static void restart() +static void restart(void) { struct dm_event_fifos fifos; struct dm_event_daemon_message msg = { 0, 0, NULL };
CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: zkabelac@sourceware.org 2010-11-29 11:23:14 Modified files: daemons/dmeventd: dmeventd.c Log message: Remove dead assignment in 'main' 'ret' is never read anywhere - remove it. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/daemons/dmeventd/dmeventd.c.diff?cvsroot=lvm2&r1=1.69&r2=1.70 --- LVM2/daemons/dmeventd/dmeventd.c 2010/10/26 08:54:37 1.69 +++ LVM2/daemons/dmeventd/dmeventd.c 2010/11/29 11:23:14 1.70 @@ -1761,7 +1761,6 @@ int main(int argc, char *argv[]) { - int ret; signed char opt; struct dm_event_fifos fifos; //struct sys_log logdata = {DAEMON_NAME, LOG_DAEMON}; @@ -1835,7 +1834,7 @@ pthread_mutex_init(&_global_mutex, NULL); - if ((ret = _open_fifos(&fifos))) + if (_open_fifos(&fifos)) exit(EXIT_FIFO_FAILURE); /* Signal parent, letting them know we are ready to go. */
CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: zkabelac@sourceware.org 2010-11-29 12:15:42 Modified files: daemons/dmeventd: dmeventd.c Log message: Use one fprintf call for usage print Replace multiple fprintf calls with multiline one. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/daemons/dmeventd/dmeventd.c.diff?cvsroot=lvm2&r1=1.70&r2=1.71 --- LVM2/daemons/dmeventd/dmeventd.c 2010/11/29 11:23:14 1.70 +++ LVM2/daemons/dmeventd/dmeventd.c 2010/11/29 12:15:41 1.71 @@ -1749,14 +1749,12 @@ static void usage(char *prog, FILE *file) { - fprintf(file, "Usage:\n"); - fprintf(file, "%s [-V] [-h] [-d] [-d] [-d] [-f]\n", prog); - fprintf(file, "\n"); - fprintf(file, " -V Show version of dmeventd\n"); - fprintf(file, " -h Show this help information\n"); - fprintf(file, " -d Log debug messages to syslog (-d, -dd, -ddd)\n"); - fprintf(file, " -f Don't fork, run in the foreground\n"); - fprintf(file, "\n"); + fprintf(file, "Usage:\n" + "%s [-V] [-h] [-d] [-d] [-d] [-f]\n\n" + " -V Show version of dmeventd\n" + " -h Show this help information\n" + " -d Log debug messages to syslog (-d, -dd, -ddd)\n" + " -f Don't fork, run in the foreground\n\n", prog); } int main(int argc, char *argv[])
CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: mbroz@sourceware.org 2011-01-17 23:14:05 Modified files: daemons/dmeventd: dmeventd.c Log message: Remove DEBUGLOG from dmeventd. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/daemons/dmeventd/dmeventd.c.diff?cvsroot=lvm2&r1=1.73&r2=1.74 --- LVM2/daemons/dmeventd/dmeventd.c 2010/12/20 14:08:46 1.73 +++ LVM2/daemons/dmeventd/dmeventd.c 2011/01/17 23:14:05 1.74 @@ -95,8 +95,6 @@ #define THREAD_STACK_SIZE (300*1024) -#define DEBUGLOG(fmt, args...) _debuglog(fmt, ## args) - int dmeventd_debug = 0; static int _foreground = 0; static int _restart = 0; @@ -203,24 +201,6 @@ static pthread_mutex_t _timeout_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t _timeout_cond = PTHREAD_COND_INITIALIZER; -static void _debuglog(const char *fmt, ...) -{ - time_t P; - va_list ap; - - if (!_foreground) - return; - - va_start(ap,fmt); - - time(&P); - fprintf(stderr, "dmeventd[%p]: %.15s ", (void *) pthread_self(), ctime(&P)+4 ); - vfprintf(stderr, fmt, ap); - fprintf(stderr, "\n"); - - va_end(ap); -} - /* Allocate/free the status structure for a monitoring thread. */ static struct thread_status *_alloc_thread_status(struct message_data *data, struct dso_data *dso_data) @@ -1621,7 +1601,7 @@ if (stat(OOM_ADJ_FILE, &st) == -1) { if (errno == ENOENT) - DEBUGLOG(OOM_ADJ_FILE " not found"); + perror(OOM_ADJ_FILE " not found"); else perror(OOM_ADJ_FILE ": stat failed"); return 1;
CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: mornfall@sourceware.org 2011-03-02 14:20:48 Modified files: daemons/dmeventd: dmeventd.c Log message: Do not run past the end of an array in dmeventd's _handle_request when faced with an unknown command ID. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/daemons/dmeventd/dmeventd.c.diff?cvsroot=lvm2&r1=1.76&r2=1.77 --- LVM2/daemons/dmeventd/dmeventd.c 2011/03/02 12:49:13 1.76 +++ LVM2/daemons/dmeventd/dmeventd.c 2011/03/02 14:20:48 1.77 @@ -1388,7 +1388,7 @@ static int _handle_request(struct dm_event_daemon_message *msg, struct message_data *message_data) { - static struct { + static struct request { unsigned int cmd; int (*f)(struct message_data *); } requests[] = { @@ -1403,7 +1403,7 @@ { DM_EVENT_CMD_GET_STATUS, _get_status}, }, *req; - for (req = requests; req < requests + sizeof(requests); req++) + for (req = requests; req < requests + sizeof(requests) / sizeof(struct request); req++) if (req->cmd == msg->cmd) return req->f(message_data);
CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: zkabelac@sourceware.org 2011-08-31 08:23:05 Modified files: daemons/dmeventd: dmeventd.c Log message: Fix resource leak when strdup fails Static analyzer noticed, strdup failing path leaks dmt structure. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/daemons/dmeventd/dmeventd.c.diff?cvsroot=lvm2&r1=1.82&r2=1.83 --- LVM2/daemons/dmeventd/dmeventd.c 2011/07/28 13:06:50 1.82 +++ LVM2/daemons/dmeventd/dmeventd.c 2011/08/31 08:23:05 1.83 @@ -751,8 +751,10 @@ if (!dmt) return NULL; - if (!dm_task_set_uuid(dmt, ts->device.uuid)) - return NULL; + if (!dm_task_set_uuid(dmt, ts->device.uuid)) { + dm_task_destroy(dmt); + return NULL; + } if (!dm_task_run(dmt)) { dm_task_destroy(dmt);
CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: zkabelac@sourceware.org 2011-09-14 09:53:32 Modified files: daemons/dmeventd: dmeventd.c Log message: Keep the old-style function definition Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/daemons/dmeventd/dmeventd.c.diff?cvsroot=lvm2&r1=1.83&r2=1.84 --- LVM2/daemons/dmeventd/dmeventd.c 2011/08/31 08:23:05 1.83 +++ LVM2/daemons/dmeventd/dmeventd.c 2011/09/14 09:53:32 1.84 @@ -1632,7 +1632,7 @@ /* * Protection against OOM killer if kernel supports it */ -static int _protect_against_oom_killer() +static int _protect_against_oom_killer(void) { struct stat st;
CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: zkabelac@sourceware.org 2012-02-10 13:46:23 Modified files: daemons/dmeventd: dmeventd.c Log message: Remove unreachable code Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/daemons/dmeventd/dmeventd.c.diff?cvsroot=lvm2&r1=1.87&r2=1.88 --- LVM2/daemons/dmeventd/dmeventd.c 2012/02/08 11:36:18 1.87 +++ LVM2/daemons/dmeventd/dmeventd.c 2012/02/10 13:46:23 1.88 @@ -1907,7 +1907,6 @@ case 'V': printf("dmeventd version: %s\n", DM_LIB_VERSION); exit(1); - break; } }
CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: prajnoha@sourceware.org 2012-02-27 11:13:52 Modified files: daemons/dmeventd: dmeventd.c Log message: Systemd is linux-specific - move the supporting code under the 'ifdef linux'. Some 'defines' used in this specific code were already under an ifdef so this patch just completes it. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/daemons/dmeventd/dmeventd.c.diff?cvsroot=lvm2&r1=1.89&r2=1.90 --- LVM2/daemons/dmeventd/dmeventd.c 2012/02/13 11:18:45 1.89 +++ LVM2/daemons/dmeventd/dmeventd.c 2012/02/27 11:13:51 1.90 @@ -1657,6 +1657,76 @@ return _set_oom_adj(OOM_ADJ_FILE, OOM_SCORE_ADJ_MIN); } + +static int _handle_preloaded_fifo(int fd, const char *path) +{ + struct stat st_fd, st_path; + int flags; + + if ((flags = fcntl(fd, F_GETFD)) < 0) + return 0; + + if (flags & FD_CLOEXEC) + return 0; + + if (fstat(fd, &st_fd) < 0 || !S_ISFIFO(st_fd.st_mode)) + return 0; + + if (stat(path, &st_path) < 0 || + st_path.st_dev != st_fd.st_dev || + st_path.st_ino != st_fd.st_ino) + return 0; + + if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) < 0) + return 0; + + return 1; +} + +static int _systemd_handover(struct dm_event_fifos *fifos) +{ + const char *e; + char *p; + unsigned long env_pid, env_listen_fds; + int r = 0; + + memset(fifos, 0, sizeof(*fifos)); + + /* LISTEN_PID must be equal to our PID! */ + if (!(e = getenv(SD_LISTEN_PID_ENV_VAR_NAME))) + goto out; + + errno = 0; + env_pid = strtoul(e, &p, 10); + if (errno || !p || *p || env_pid <= 0 || + getpid() != (pid_t) env_pid) + goto out; + + /* LISTEN_FDS must be 2 and the fds must be FIFOSs! */ + if (!(e = getenv(SD_LISTEN_FDS_ENV_VAR_NAME))) + goto out; + + errno = 0; + env_listen_fds = strtoul(e, &p, 10); + if (errno || !p || *p || env_listen_fds != 2) + goto out; + + /* Check and handle the FIFOs passed in */ + r = (_handle_preloaded_fifo(SD_FD_FIFO_SERVER, DM_EVENT_FIFO_SERVER) && + _handle_preloaded_fifo(SD_FD_FIFO_CLIENT, DM_EVENT_FIFO_CLIENT)); + + if (r) { + fifos->server = SD_FD_FIFO_SERVER; + fifos->server_path = DM_EVENT_FIFO_SERVER; + fifos->client = SD_FD_FIFO_CLIENT; + fifos->client_path = DM_EVENT_FIFO_CLIENT; + } + +out: + unsetenv(SD_LISTEN_PID_ENV_VAR_NAME); + unsetenv(SD_LISTEN_FDS_ENV_VAR_NAME); + return r; +} #endif static void remove_lockfile(void) @@ -1723,10 +1793,12 @@ fd = rlim.rlim_cur; for (--fd; fd >= 0; fd--) { +#ifdef linux /* Do not close fds preloaded by systemd! */ if (_systemd_activation && (fd == SD_FD_FIFO_SERVER || fd == SD_FD_FIFO_CLIENT)) continue; +#endif close(fd); } @@ -1804,76 +1876,6 @@ fini_fifos(&fifos); } -static int _handle_preloaded_fifo(int fd, const char *path) -{ - struct stat st_fd, st_path; - int flags; - - if ((flags = fcntl(fd, F_GETFD)) < 0) - return 0; - - if (flags & FD_CLOEXEC) - return 0; - - if (fstat(fd, &st_fd) < 0 || !S_ISFIFO(st_fd.st_mode)) - return 0; - - if (stat(path, &st_path) < 0 || - st_path.st_dev != st_fd.st_dev || - st_path.st_ino != st_fd.st_ino) - return 0; - - if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) < 0) - return 0; - - return 1; -} - -static int _systemd_handover(struct dm_event_fifos *fifos) -{ - const char *e; - char *p; - unsigned long env_pid, env_listen_fds; - int r = 0; - - memset(fifos, 0, sizeof(*fifos)); - - /* LISTEN_PID must be equal to our PID! */ - if (!(e = getenv(SD_LISTEN_PID_ENV_VAR_NAME))) - goto out; - - errno = 0; - env_pid = strtoul(e, &p, 10); - if (errno || !p || *p || env_pid <= 0 || - getpid() != (pid_t) env_pid) - goto out; - - /* LISTEN_FDS must be 2 and the fds must be FIFOSs! */ - if (!(e = getenv(SD_LISTEN_FDS_ENV_VAR_NAME))) - goto out; - - errno = 0; - env_listen_fds = strtoul(e, &p, 10); - if (errno || !p || *p || env_listen_fds != 2) - goto out; - - /* Check and handle the FIFOs passed in */ - r = (_handle_preloaded_fifo(SD_FD_FIFO_SERVER, DM_EVENT_FIFO_SERVER) && - _handle_preloaded_fifo(SD_FD_FIFO_CLIENT, DM_EVENT_FIFO_CLIENT)); - - if (r) { - fifos->server = SD_FD_FIFO_SERVER; - fifos->server_path = DM_EVENT_FIFO_SERVER; - fifos->client = SD_FD_FIFO_CLIENT; - fifos->client_path = DM_EVENT_FIFO_CLIENT; - } - -out: - unsetenv(SD_LISTEN_PID_ENV_VAR_NAME); - unsetenv(SD_LISTEN_FDS_ENV_VAR_NAME); - return r; -} - static void usage(char *prog, FILE *file) { fprintf(file, "Usage:\n" @@ -1928,7 +1930,9 @@ if (_restart) restart(); +#ifdef linux _systemd_activation = _systemd_handover(&fifos); +#endif if (!_foreground) _daemonize();
CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: zkabelac@sourceware.org 2012-03-01 22:54:17 Modified files: daemons/dmeventd: dmeventd.c Log message: Skip zero length messages In case of zero length message, there would be a memory leak on return path from _do_process_request. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/daemons/dmeventd/dmeventd.c.diff?cvsroot=lvm2&r1=1.93&r2=1.94 --- LVM2/daemons/dmeventd/dmeventd.c 2012/03/01 22:06:18 1.93 +++ LVM2/daemons/dmeventd/dmeventd.c 2012/03/01 22:54:17 1.94 @@ -1504,9 +1504,10 @@ while ((reg = _initial_registrations[i])) { msg.cmd = DM_EVENT_CMD_REGISTER_FOR_EVENT; - msg.size = strlen(reg); - msg.data = reg; - _do_process_request(&msg); + if ((msg.size = strlen(reg))) { + msg.data = reg; + _do_process_request(&msg); + } ++ i; } }
CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: zkabelac@sourceware.org 2012-03-02 23:01:10 Modified files: daemons/dmeventd: dmeventd.c Log message: Code refactoring Properly test for dm_asprintf result. Keep unlocking of mutex in the same function and do not spread lock and unlock over functions. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/daemons/dmeventd/dmeventd.c.diff?cvsroot=lvm2&r1=1.95&r2=1.96 --- LVM2/daemons/dmeventd/dmeventd.c 2012/03/02 22:57:25 1.95 +++ LVM2/daemons/dmeventd/dmeventd.c 2012/03/02 23:01:10 1.96 @@ -1000,10 +1000,8 @@ almost as good as dead already... */ if (thread_new->events & DM_EVENT_TIMEOUT) { ret = -_register_for_timeout(thread_new); - if (ret) { - _unlock_mutex(); - goto out; - } + if (ret) + goto outth; } if (!(thread = _lookup_thread_status(message_data))) { @@ -1029,6 +1027,7 @@ /* Or event # into events bitfield. */ thread->events |= message_data->events.field; + outth: _unlock_mutex(); out: @@ -1105,15 +1104,19 @@ const char *id = message_data->id; const char *dso = thread->dso_data->dso_name; const char *dev = thread->device.uuid; + int r; unsigned events = ((thread->status == DM_THREAD_RUNNING) && (thread->events)) ? thread->events : thread-> events | DM_EVENT_REGISTRATION_PENDING; dm_free(msg->data); - msg->size = dm_asprintf(&(msg->data), fmt, id, dso, dev, events); + if ((r = dm_asprintf(&(msg->data), fmt, id, dso, dev, events)) < 0) { + msg->size = 0; + return -ENOMEM; + } - _unlock_mutex(); + msg->size = (uint32_t) r; return 0; } @@ -1146,6 +1149,7 @@ static int _get_registered_dev(struct message_data *message_data, int next) { struct thread_status *thread, *hit = NULL; + int ret = -ENOENT; _lock_mutex(); @@ -1162,10 +1166,8 @@ * If we got a registered device and want the next one -> * fetch next conforming element off the list. */ - if (hit && !next) { - _unlock_mutex(); - return _registered_device(message_data, hit); - } + if (hit && !next) + goto reg; if (!hit) goto out; @@ -1181,13 +1183,13 @@ } } - _unlock_mutex(); - return _registered_device(message_data, hit); + reg: + ret = _registered_device(message_data, hit); out: _unlock_mutex(); - - return -ENOENT; + + return ret; } static int _get_registered_device(struct message_data *message_data)