From 3941cbcb97446a72c096da27171a3144a36fdfb7 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 12 May 2023 14:46:59 +0200 Subject: Adding upstream version 4.2+20230508. Signed-off-by: Daniel Baumann --- util.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 49 insertions(+), 12 deletions(-) (limited to 'util.c') diff --git a/util.c b/util.c index 9f1e1f7..fa378eb 100644 --- a/util.c +++ b/util.c @@ -973,6 +973,50 @@ dev_t devnm2devid(char *devnm) return 0; } +/** + * is_devname_numbered() - helper for numbered devname verification. + * @devname: path or name to check. + * @pref: expected devname prefix. + * @pref_len: prefix len. + */ +static bool is_devname_numbered(const char *devname, const char *pref, const int pref_len) +{ + int val; + + assert(devname && pref); + + if (strncmp(devname, pref, pref_len) != 0) + return false; + + if (parse_num(&val, devname + pref_len) != 0) + return false; + + if (val > 127) + return false; + + return true; +} + +/** + * is_devname_md_numbered() - check if &devname is numbered MD device (md). + * @devname: path or name to check. + */ +bool is_devname_md_numbered(const char *devname) +{ + return is_devname_numbered(devname, DEV_NUM_PREF, DEV_NUM_PREF_LEN); +} + +/** + * is_devname_md_d_numbered() - check if &devname is secondary numbered MD device (md_d). + * @devname: path or name to check. + */ +bool is_devname_md_d_numbered(const char *devname) +{ + static const char d_dev[] = DEV_NUM_PREF "_d"; + + return is_devname_numbered(devname, d_dev, sizeof(d_dev) - 1); +} + /** * get_md_name() - Get main dev node of the md device. * @devnm: Md device name or path. @@ -1916,6 +1960,7 @@ int start_mdmon(char *devnm) int len; pid_t pid; int status; + char *prefix = in_initrd() ? "initrd-" : ""; char pathbuf[1024]; char *paths[4] = { pathbuf, @@ -1926,7 +1971,7 @@ int start_mdmon(char *devnm) if (check_env("MDADM_NO_MDMON")) return 0; - if (continue_via_systemd(devnm, MDMON_SERVICE)) + if (continue_via_systemd(devnm, MDMON_SERVICE, prefix)) return 0; /* That failed, try running mdmon directly */ @@ -2197,7 +2242,7 @@ void manage_fork_fds(int close_all) * 1- if systemd service has been started * 0- otherwise */ -int continue_via_systemd(char *devnm, char *service_name) +int continue_via_systemd(char *devnm, char *service_name, char *prefix) { int pid, status; char pathbuf[1024]; @@ -2209,7 +2254,7 @@ int continue_via_systemd(char *devnm, char *service_name) case 0: manage_fork_fds(1); snprintf(pathbuf, sizeof(pathbuf), - "%s@%s.service", service_name, devnm); + "%s@%s%s.service", service_name, prefix ?: "", devnm); status = execl("/usr/bin/systemctl", "systemctl", "restart", pathbuf, NULL); status = execl("/bin/systemctl", "systemctl", "restart", @@ -2227,15 +2272,7 @@ int continue_via_systemd(char *devnm, char *service_name) int in_initrd(void) { - /* This is based on similar function in systemd. */ - struct statfs s; - /* statfs.f_type is signed long on s390x and MIPS, causing all - sorts of sign extension problems with RAMFS_MAGIC being - defined as 0x858458f6 */ - return statfs("/", &s) >= 0 && - ((unsigned long)s.f_type == TMPFS_MAGIC || - ((unsigned long)s.f_type & 0xFFFFFFFFUL) == - ((unsigned long)RAMFS_MAGIC & 0xFFFFFFFFUL)); + return access("/etc/initrd-release", F_OK) >= 0; } void reopen_mddev(int mdfd) -- cgit v1.2.3