72c1204567
Now mdcheck service can't be run successfully. We need to put mdcheck in to the right place (/usr/share/mdadm/mdcheck) and it needs to remove the dependency of mdadm_env.sh which is fixed in patch 76c224c6c. And there is a history problem. It needed KillMode=none before, so it removed the upstream patch 52c67fcdd. Now this problem has been fixed, so we can do the backport more easilly now. We don't need to remove the upstream patch here again. It adds a rhel only feature too for transient failure. Resolves: rhbz#2159923, rhbz#2150865, rhbz#2124071, rhbz#2203859 Signed-off-by: Xiao Ni <xni@redhat.com>
348 lines
11 KiB
Diff
348 lines
11 KiB
Diff
From b9ce7ab0218c550488587fdad5708628d6a5ffc2 Mon Sep 17 00:00:00 2001
|
|
From: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
|
Date: Thu, 23 Mar 2023 17:50:14 +0100
|
|
Subject: [PATCH 121/125] mdadm: define DEV_MD_DIR
|
|
|
|
It is used many times. Additionally define _LEN to avoid repeated
|
|
strlen() calls when length is needed.
|
|
|
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
|
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
|
|
---
|
|
Create.c | 7 +++----
|
|
Detail.c | 9 ++++-----
|
|
Incremental.c | 4 ++--
|
|
Monitor.c | 32 ++++++++++++++++++--------------
|
|
config.c | 10 +++++-----
|
|
lib.c | 2 +-
|
|
mapfile.c | 12 ++++++------
|
|
mdadm.h | 8 ++++++++
|
|
mdopen.c | 6 +++---
|
|
super-ddf.c | 2 +-
|
|
super-intel.c | 2 +-
|
|
super1.c | 3 +--
|
|
sysfs.c | 2 +-
|
|
13 files changed, 54 insertions(+), 45 deletions(-)
|
|
|
|
diff --git a/Create.c b/Create.c
|
|
index aa0472dd..ea6a4745 100644
|
|
--- a/Create.c
|
|
+++ b/Create.c
|
|
@@ -1024,10 +1024,9 @@ int Create(struct supertype *st, char *mddev,
|
|
* it could be in conflict with already existing device
|
|
* e.g. container, array
|
|
*/
|
|
- if (strncmp(chosen_name, "/dev/md/", 8) == 0 &&
|
|
- map_by_name(&map, chosen_name+8) != NULL) {
|
|
- pr_err("Array name %s is in use already.\n",
|
|
- chosen_name);
|
|
+ if (strncmp(chosen_name, DEV_MD_DIR, DEV_MD_DIR_LEN) == 0 &&
|
|
+ map_by_name(&map, chosen_name + DEV_MD_DIR_LEN)) {
|
|
+ pr_err("Array name %s is in use already.\n", chosen_name);
|
|
close(mdfd);
|
|
map_unlock(&map);
|
|
udev_unblock();
|
|
diff --git a/Detail.c b/Detail.c
|
|
index 4ef26460..206d88e3 100644
|
|
--- a/Detail.c
|
|
+++ b/Detail.c
|
|
@@ -254,10 +254,9 @@ int Detail(char *dev, struct context *c)
|
|
fname_from_uuid(st, info, nbuf, ':');
|
|
printf("MD_UUID=%s\n", nbuf + 5);
|
|
mp = map_by_uuid(&map, info->uuid);
|
|
- if (mp && mp->path &&
|
|
- strncmp(mp->path, "/dev/md/", 8) == 0) {
|
|
+ if (mp && mp->path && strncmp(mp->path, DEV_MD_DIR, DEV_MD_DIR_LEN) == 0) {
|
|
printf("MD_DEVNAME=");
|
|
- print_escape(mp->path + 8);
|
|
+ print_escape(mp->path + DEV_MD_DIR_LEN);
|
|
putchar('\n');
|
|
}
|
|
|
|
@@ -273,9 +272,9 @@ int Detail(char *dev, struct context *c)
|
|
printf("MD_UUID=%s\n", nbuf+5);
|
|
}
|
|
if (mp && mp->path &&
|
|
- strncmp(mp->path, "/dev/md/", 8) == 0) {
|
|
+ strncmp(mp->path, DEV_MD_DIR, DEV_MD_DIR_LEN) == 0) {
|
|
printf("MD_DEVNAME=");
|
|
- print_escape(mp->path+8);
|
|
+ print_escape(mp->path + DEV_MD_DIR_LEN);
|
|
putchar('\n');
|
|
}
|
|
map_free(map);
|
|
diff --git a/Incremental.c b/Incremental.c
|
|
index 49a71f72..59b850f1 100644
|
|
--- a/Incremental.c
|
|
+++ b/Incremental.c
|
|
@@ -460,8 +460,8 @@ int Incremental(struct mddev_dev *devlist, struct context *c,
|
|
info.array.working_disks ++;
|
|
|
|
}
|
|
- if (strncmp(chosen_name, "/dev/md/", 8) == 0)
|
|
- md_devname = chosen_name+8;
|
|
+ if (strncmp(chosen_name, DEV_MD_DIR, DEV_MD_DIR_LEN) == 0)
|
|
+ md_devname = chosen_name + DEV_MD_DIR_LEN;
|
|
else
|
|
md_devname = chosen_name;
|
|
if (c->export) {
|
|
diff --git a/Monitor.c b/Monitor.c
|
|
index 44918184..3273f2fb 100644
|
|
--- a/Monitor.c
|
|
+++ b/Monitor.c
|
|
@@ -36,9 +36,18 @@
|
|
#define EVENT_NAME_MAX 32
|
|
#define AUTOREBUILD_PID_PATH MDMON_DIR "/autorebuild.pid"
|
|
|
|
+/**
|
|
+ * struct state - external array or container properties.
|
|
+ * @devname: has length of %DEV_MD_DIR + device name + terminating byte
|
|
+ * @devnm: to sync with mdstat info
|
|
+ * @parent_devnm: or subarray, devnm of parent, for others, ""
|
|
+ * @subarray: for a container it is a link to first subarray, for a subarray it is a link to next
|
|
+ * subarray in the same container
|
|
+ * @parent: for a subarray it is a link to its container
|
|
+ */
|
|
struct state {
|
|
- char devname[MD_NAME_MAX + sizeof("/dev/md/")]; /* length of "/dev/md/" + device name + terminating byte*/
|
|
- char devnm[MD_NAME_MAX]; /* to sync with mdstat info */
|
|
+ char devname[MD_NAME_MAX + sizeof(DEV_MD_DIR)];
|
|
+ char devnm[MD_NAME_MAX];
|
|
unsigned int utime;
|
|
int err;
|
|
char *spare_group;
|
|
@@ -49,15 +58,10 @@ struct state {
|
|
int devstate[MAX_DISKS];
|
|
dev_t devid[MAX_DISKS];
|
|
int percent;
|
|
- char parent_devnm[MD_NAME_MAX]; /* For subarray, devnm of parent.
|
|
- * For others, ""
|
|
- */
|
|
+ char parent_devnm[MD_NAME_MAX];
|
|
struct supertype *metadata;
|
|
- struct state *subarray;/* for a container it is a link to first subarray
|
|
- * for a subarray it is a link to next subarray
|
|
- * in the same container */
|
|
- struct state *parent; /* for a subarray it is a link to its container
|
|
- */
|
|
+ struct state *subarray;
|
|
+ struct state *parent;
|
|
struct state *next;
|
|
};
|
|
|
|
@@ -252,8 +256,8 @@ int Monitor(struct mddev_dev *devlist,
|
|
continue;
|
|
|
|
st = xcalloc(1, sizeof *st);
|
|
- snprintf(st->devname, MD_NAME_MAX + sizeof("/dev/md/"),
|
|
- "/dev/md/%s", basename(mdlist->devname));
|
|
+ snprintf(st->devname, MD_NAME_MAX + sizeof(DEV_MD_DIR), DEV_MD_DIR "%s",
|
|
+ basename(mdlist->devname));
|
|
st->next = statelist;
|
|
st->devnm[0] = 0;
|
|
st->percent = RESYNC_UNKNOWN;
|
|
@@ -274,7 +278,7 @@ int Monitor(struct mddev_dev *devlist,
|
|
|
|
st = xcalloc(1, sizeof *st);
|
|
mdlist = conf_get_ident(dv->devname);
|
|
- snprintf(st->devname, MD_NAME_MAX + sizeof("/dev/md/"), "%s", dv->devname);
|
|
+ snprintf(st->devname, MD_NAME_MAX + sizeof(DEV_MD_DIR), "%s", dv->devname);
|
|
st->next = statelist;
|
|
st->devnm[0] = 0;
|
|
st->percent = RESYNC_UNKNOWN;
|
|
@@ -942,7 +946,7 @@ static int add_new_arrays(struct mdstat_ent *mdstat, struct state **statelist)
|
|
continue;
|
|
}
|
|
|
|
- snprintf(st->devname, MD_NAME_MAX + sizeof("/dev/md/"), "%s", name);
|
|
+ snprintf(st->devname, MD_NAME_MAX + sizeof(DEV_MD_DIR), "%s", name);
|
|
if ((fd = open(st->devname, O_RDONLY)) < 0 ||
|
|
md_get_array_info(fd, &array) < 0) {
|
|
/* no such array */
|
|
diff --git a/config.c b/config.c
|
|
index eeedd0c6..59d5bfb6 100644
|
|
--- a/config.c
|
|
+++ b/config.c
|
|
@@ -405,7 +405,7 @@ void arrayline(char *line)
|
|
* or anything that doesn't start '/' or '<'
|
|
*/
|
|
if (strcasecmp(w, "<ignore>") == 0 ||
|
|
- strncmp(w, "/dev/md/", 8) == 0 ||
|
|
+ strncmp(w, DEV_MD_DIR, DEV_MD_DIR_LEN) == 0 ||
|
|
(w[0] != '/' && w[0] != '<') ||
|
|
(strncmp(w, "/dev/md", 7) == 0 &&
|
|
is_number(w + 7)) ||
|
|
@@ -1102,13 +1102,13 @@ int devname_matches(char *name, char *match)
|
|
* mdNN with NN
|
|
* then just strcmp
|
|
*/
|
|
- if (strncmp(name, "/dev/md/", 8) == 0)
|
|
- name += 8;
|
|
+ if (strncmp(name, DEV_MD_DIR, DEV_MD_DIR_LEN) == 0)
|
|
+ name += DEV_MD_DIR_LEN;
|
|
else if (strncmp(name, "/dev/", 5) == 0)
|
|
name += 5;
|
|
|
|
- if (strncmp(match, "/dev/md/", 8) == 0)
|
|
- match += 8;
|
|
+ if (strncmp(match, DEV_MD_DIR, DEV_MD_DIR_LEN) == 0)
|
|
+ match += DEV_MD_DIR_LEN;
|
|
else if (strncmp(match, "/dev/", 5) == 0)
|
|
match += 5;
|
|
|
|
diff --git a/lib.c b/lib.c
|
|
index e395b28d..65ea51e0 100644
|
|
--- a/lib.c
|
|
+++ b/lib.c
|
|
@@ -313,7 +313,7 @@ char *map_dev_preferred(int major, int minor, int create,
|
|
|
|
for (p = devlist; p; p = p->next)
|
|
if (p->major == major && p->minor == minor) {
|
|
- if (strncmp(p->name, "/dev/md/",8) == 0 ||
|
|
+ if (strncmp(p->name, DEV_MD_DIR, DEV_MD_DIR_LEN) == 0 ||
|
|
(prefer && strstr(p->name, prefer))) {
|
|
if (preferred == NULL ||
|
|
strlen(p->name) < strlen(preferred))
|
|
diff --git a/mapfile.c b/mapfile.c
|
|
index ac351768..34fea179 100644
|
|
--- a/mapfile.c
|
|
+++ b/mapfile.c
|
|
@@ -320,9 +320,9 @@ struct map_ent *map_by_name(struct map_ent **map, char *name)
|
|
for (mp = *map ; mp ; mp = mp->next) {
|
|
if (!mp->path)
|
|
continue;
|
|
- if (strncmp(mp->path, "/dev/md/", 8) != 0)
|
|
+ if (strncmp(mp->path, DEV_MD_DIR, DEV_MD_DIR_LEN) != 0)
|
|
continue;
|
|
- if (strcmp(mp->path+8, name) != 0)
|
|
+ if (strcmp(mp->path + DEV_MD_DIR_LEN, name) != 0)
|
|
continue;
|
|
if (!mddev_busy(mp->devnm)) {
|
|
mp->bad = 1;
|
|
@@ -413,7 +413,7 @@ void RebuildMap(void)
|
|
devid = devnm2devid(md->devnm);
|
|
path = map_dev(major(devid), minor(devid), 0);
|
|
if (path == NULL ||
|
|
- strncmp(path, "/dev/md/", 8) != 0) {
|
|
+ strncmp(path, DEV_MD_DIR, DEV_MD_DIR_LEN) != 0) {
|
|
/* We would really like a name that provides
|
|
* an MD_DEVNAME for udev.
|
|
* The name needs to be unique both in /dev/md/
|
|
@@ -434,7 +434,7 @@ void RebuildMap(void)
|
|
if (match && match->devname && match->devname[0] == '/') {
|
|
path = match->devname;
|
|
if (path[0] != '/') {
|
|
- strcpy(namebuf, "/dev/md/");
|
|
+ strcpy(namebuf, DEV_MD_DIR);
|
|
strcat(namebuf, path);
|
|
path = namebuf;
|
|
}
|
|
@@ -478,10 +478,10 @@ void RebuildMap(void)
|
|
|
|
while (conflict) {
|
|
if (unum >= 0)
|
|
- sprintf(namebuf, "/dev/md/%s%s%d",
|
|
+ sprintf(namebuf, DEV_MD_DIR "%s%s%d",
|
|
name, sep, unum);
|
|
else
|
|
- sprintf(namebuf, "/dev/md/%s",
|
|
+ sprintf(namebuf, DEV_MD_DIR "%s",
|
|
name);
|
|
unum++;
|
|
if (lstat(namebuf, &stb) != 0 &&
|
|
diff --git a/mdadm.h b/mdadm.h
|
|
index 0d995445..67d73f96 100644
|
|
--- a/mdadm.h
|
|
+++ b/mdadm.h
|
|
@@ -100,6 +100,14 @@ struct dlm_lksb {
|
|
#define DEFAULT_BITMAP_DELAY 5
|
|
#define DEFAULT_MAX_WRITE_BEHIND 256
|
|
|
|
+/* DEV_MD_DIR points to named MD devices directory.
|
|
+ * DEV_MD_DIR_LEN is a length with Null byte excluded.
|
|
+ */
|
|
+#ifndef DEV_MD_DIR
|
|
+#define DEV_MD_DIR "/dev/md/"
|
|
+#define DEV_MD_DIR_LEN (sizeof(DEV_MD_DIR) - 1)
|
|
+#endif /* DEV_MD_DIR */
|
|
+
|
|
/* MAP_DIR should be somewhere that persists across the pivotroot
|
|
* from early boot to late boot.
|
|
* /run seems to have emerged as the best standard.
|
|
diff --git a/mdopen.c b/mdopen.c
|
|
index 810f79a3..6c3bdb6a 100644
|
|
--- a/mdopen.c
|
|
+++ b/mdopen.c
|
|
@@ -188,12 +188,12 @@ int create_mddev(char *dev, char *name, int autof, int trustworthy,
|
|
parts = autof >> 3;
|
|
autof &= 7;
|
|
|
|
- strcpy(chosen, "/dev/md/");
|
|
+ strcpy(chosen, DEV_MD_DIR);
|
|
cname = chosen + strlen(chosen);
|
|
|
|
if (dev) {
|
|
- if (strncmp(dev, "/dev/md/", 8) == 0) {
|
|
- strcpy(cname, dev+8);
|
|
+ if (strncmp(dev, DEV_MD_DIR, DEV_MD_DIR_LEN) == 0) {
|
|
+ strcpy(cname, dev + DEV_MD_DIR_LEN);
|
|
} else if (strncmp(dev, "/dev/", 5) == 0) {
|
|
char *e = dev + strlen(dev);
|
|
while (e > dev && isdigit(e[-1]))
|
|
diff --git a/super-ddf.c b/super-ddf.c
|
|
index b86c6acd..7213284e 100644
|
|
--- a/super-ddf.c
|
|
+++ b/super-ddf.c
|
|
@@ -1648,7 +1648,7 @@ static void brief_examine_subarrays_ddf(struct supertype *st, int verbose)
|
|
fname_from_uuid(st, &info, nbuf1, ':');
|
|
_ddf_array_name(namebuf, ddf, i);
|
|
printf("ARRAY%s%s container=%s member=%d UUID=%s\n",
|
|
- namebuf[0] == '\0' ? "" : " /dev/md/", namebuf,
|
|
+ namebuf[0] == '\0' ? "" : " " DEV_MD_DIR, namebuf,
|
|
nbuf+5, i, nbuf1+5);
|
|
}
|
|
}
|
|
diff --git a/super-intel.c b/super-intel.c
|
|
index a5c86cb2..aaf6659e 100644
|
|
--- a/super-intel.c
|
|
+++ b/super-intel.c
|
|
@@ -2309,7 +2309,7 @@ static void brief_examine_subarrays_imsm(struct supertype *st, int verbose)
|
|
super->current_vol = i;
|
|
getinfo_super_imsm(st, &info, NULL);
|
|
fname_from_uuid(st, &info, nbuf1, ':');
|
|
- printf("ARRAY /dev/md/%.16s container=%s member=%d UUID=%s\n",
|
|
+ printf("ARRAY " DEV_MD_DIR "%.16s container=%s member=%d UUID=%s\n",
|
|
dev->volume, nbuf + 5, i, nbuf1 + 5);
|
|
}
|
|
}
|
|
diff --git a/super1.c b/super1.c
|
|
index 938c3a68..856b0208 100644
|
|
--- a/super1.c
|
|
+++ b/super1.c
|
|
@@ -645,8 +645,7 @@ static void brief_examine_super1(struct supertype *st, int verbose)
|
|
|
|
printf("ARRAY ");
|
|
if (nm) {
|
|
- printf("/dev/md/");
|
|
- print_escape(nm);
|
|
+ printf(DEV_MD_DIR "%s", nm);
|
|
putchar(' ');
|
|
}
|
|
if (verbose && c)
|
|
diff --git a/sysfs.c b/sysfs.c
|
|
index ca1d888f..94d02f53 100644
|
|
--- a/sysfs.c
|
|
+++ b/sysfs.c
|
|
@@ -1114,7 +1114,7 @@ void sysfsline(char *line)
|
|
if (strncasecmp(w, "name=", 5) == 0) {
|
|
char *devname = w + 5;
|
|
|
|
- if (strncmp(devname, "/dev/md/", 8) == 0) {
|
|
+ if (strncmp(devname, DEV_MD_DIR, DEV_MD_DIR_LEN) == 0) {
|
|
if (sr->devname)
|
|
pr_err("Only give one device per SYSFS line: %s\n",
|
|
devname);
|
|
--
|
|
2.38.1
|
|
|