[dm-devel] [PATCH 5/7] multipath-tools: avoid access to /etc/localtime
Benjamin Marzinski
bmarzins at redhat.com
Fri Dec 18 18:14:08 UTC 2020
On Thu, Dec 17, 2020 at 12:00:16PM +0100, mwilck at suse.com wrote:
> From: Martin Wilck <mwilck at suse.com>
>
> If the root file system is multipathed, and IO is queued because all paths
> are failed, multipathd may block trying to access the root FS, and thus be
> unable to reinstate paths. One file that is frequently accessed is
> /etc/localtime. Avoid that by printing monotonic timestamps instead.
>
Reviewed-by: Benjamin Marzinski <bmarzins at redhat.com>
> Signed-off-by: Martin Wilck <mwilck at suse.com>
> ---
> libmultipath/debug.c | 14 ++++++++------
> libmultipath/devmapper.c | 12 ++++++------
> libmultipath/log.c | 1 -
> multipathd/main.c | 3 ---
> 4 files changed, 14 insertions(+), 16 deletions(-)
>
> diff --git a/libmultipath/debug.c b/libmultipath/debug.c
> index 429f269..510e15e 100644
> --- a/libmultipath/debug.c
> +++ b/libmultipath/debug.c
> @@ -14,6 +14,8 @@
> #include "config.h"
> #include "defaults.h"
> #include "debug.h"
> +#include "time-util.h"
> +#include "util.h"
>
> int logsink;
> int libmp_verbosity = DEFAULT_VERBOSITY;
> @@ -25,13 +27,13 @@ void dlog(int prio, const char * fmt, ...)
> va_start(ap, fmt);
> if (logsink != LOGSINK_SYSLOG) {
> if (logsink == LOGSINK_STDERR_WITH_TIME) {
> - time_t t = time(NULL);
> - struct tm *tb = localtime(&t);
> - char buff[16];
> + struct timespec ts;
> + char buff[32];
>
> - strftime(buff, sizeof(buff),
> - "%b %d %H:%M:%S", tb);
> - buff[sizeof(buff)-1] = '\0';
> + get_monotonic_time(&ts);
> + safe_sprintf(buff, "%ld.%06ld",
> + (long)ts.tv_sec,
> + ts.tv_nsec/1000);
> fprintf(stderr, "%s | ", buff);
> }
> vfprintf(stderr, fmt, ap);
> diff --git a/libmultipath/devmapper.c b/libmultipath/devmapper.c
> index 4977b31..095cbc0 100644
> --- a/libmultipath/devmapper.c
> +++ b/libmultipath/devmapper.c
> @@ -27,6 +27,7 @@
> #include "config.h"
> #include "wwids.h"
> #include "version.h"
> +#include "time-util.h"
>
> #include "log_pthread.h"
> #include <sys/types.h>
> @@ -106,13 +107,12 @@ dm_write_log (int level, const char *file, int line, const char *f, ...)
> va_start(ap, f);
> if (logsink != LOGSINK_SYSLOG) {
> if (logsink == LOGSINK_STDERR_WITH_TIME) {
> - time_t t = time(NULL);
> - struct tm *tb = localtime(&t);
> - char buff[16];
> -
> - strftime(buff, sizeof(buff), "%b %d %H:%M:%S", tb);
> - buff[sizeof(buff)-1] = '\0';
> + struct timespec ts;
> + char buff[32];
>
> + get_monotonic_time(&ts);
> + safe_sprintf(buff, "%ld.%06ld",
> + (long)ts.tv_sec, ts.tv_nsec/1000);
> fprintf(stderr, "%s | ", buff);
> }
> fprintf(stderr, "libdevmapper: %s(%i): ", file, line);
> diff --git a/libmultipath/log.c b/libmultipath/log.c
> index 95c8f01..6498c88 100644
> --- a/libmultipath/log.c
> +++ b/libmultipath/log.c
> @@ -120,7 +120,6 @@ void log_reset (char *program_name)
> pthread_cleanup_push(cleanup_mutex, &logq_lock);
>
> closelog();
> - tzset();
> openlog(program_name, 0, LOG_DAEMON);
>
> pthread_cleanup_pop(1);
> diff --git a/multipathd/main.c b/multipathd/main.c
> index b6a5f5b..28c147b 100644
> --- a/multipathd/main.c
> +++ b/multipathd/main.c
> @@ -2710,9 +2710,6 @@ reconfigure (struct vectors * vecs)
> delete_all_foreign();
>
> reset_checker_classes();
> - /* Re-read any timezone changes */
> - tzset();
> -
> if (bindings_read_only)
> conf->bindings_read_only = bindings_read_only;
> check_alias_settings(conf);
> --
> 2.29.0
More information about the dm-devel
mailing list