diff --git a/mdadm.h b/mdadm.h index c5d9c30..43f3a57 100644 --- a/mdadm.h +++ b/mdadm.h @@ -1390,6 +1390,8 @@ extern void fmt_devname(char *name, int num); extern char *stat2devnm(struct stat *st); extern char *fd2devnm(int fd); +extern int in_initrd(void); + #define _ROUND_UP(val, base) (((val) + (base) - 1) & ~(base - 1)) #define ROUND_UP(val, base) _ROUND_UP(val, (typeof(val))(base)) #define ROUND_UP_PTR(ptr, base) ((typeof(ptr)) \ diff --git a/mdmon.c b/mdmon.c index 13f9510..f0b0623 100644 --- a/mdmon.c +++ b/mdmon.c @@ -298,10 +298,14 @@ int main(int argc, char *argv[]) {NULL, 0, NULL, 0} }; - /* - * Always change process name to @dmon to avoid systemd killing it - */ - argv[0][0] = '@'; + if (in_initrd()) { + /* + * set first char of argv[0] to @. This is used by + * systemd to signal that the task was launched from + * initrd/initramfs and should be preserved during shutdown + */ + argv[0][0] = '@'; + } while ((opt = getopt_long(argc, argv, "thaF", options, NULL)) != -1) { switch (opt) { diff --git a/util.c b/util.c index 3965f43..aa2c8be 100644 --- a/util.c +++ b/util.c @@ -29,6 +29,8 @@ #include #include #include +#include +#include #include #include #include @@ -1937,3 +1939,12 @@ void enable_fds(int devices) lim.rlim_cur = fds; setrlimit(RLIMIT_NOFILE, &lim); } + +int in_initrd(void) +{ + /* This is based on similar function in systemd. */ + struct statfs s; + return statfs("/", &s) >= 0 && + (s.f_type == TMPFS_MAGIC || + s.f_type == RAMFS_MAGIC); +}