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>
370 lines
13 KiB
Diff
370 lines
13 KiB
Diff
From b301516615c441bd3cc4b512fae73fc066d227f1 Mon Sep 17 00:00:00 2001
|
|
From: Mateusz Grzonka <mateusz.grzonka@intel.com>
|
|
Date: Thu, 2 Feb 2023 12:26:59 +0100
|
|
Subject: [PATCH 087/125] Mdmonitor: Make alert_info global
|
|
|
|
Move information about --test flag and hostname into alert_info.
|
|
|
|
Signed-off-by: Mateusz Grzonka <mateusz.grzonka@intel.com>
|
|
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
|
|
---
|
|
Monitor.c | 124 +++++++++++++++++++++++++++---------------------------
|
|
1 file changed, 61 insertions(+), 63 deletions(-)
|
|
|
|
diff --git a/Monitor.c b/Monitor.c
|
|
index 188cb8be..9ef4dab8 100644
|
|
--- a/Monitor.c
|
|
+++ b/Monitor.c
|
|
@@ -58,21 +58,20 @@ struct state {
|
|
};
|
|
|
|
struct alert_info {
|
|
+ char hostname[HOST_NAME_MAX];
|
|
char *mailaddr;
|
|
char *mailfrom;
|
|
char *alert_cmd;
|
|
int dosyslog;
|
|
-};
|
|
+ int test;
|
|
+} info;
|
|
static int make_daemon(char *pidfile);
|
|
static int check_one_sharer(int scan);
|
|
static void write_autorebuild_pid(void);
|
|
-static void alert(const char *event, const char *dev, const char *disc, struct alert_info *info);
|
|
-static int check_array(struct state *st, struct mdstat_ent *mdstat,
|
|
- int test, struct alert_info *info,
|
|
- int increments, char *prefer);
|
|
-static int add_new_arrays(struct mdstat_ent *mdstat, struct state **statelist,
|
|
- int test, struct alert_info *info);
|
|
-static void try_spare_migration(struct state *statelist, struct alert_info *info);
|
|
+static void alert(const char *event, const char *dev, const char *disc);
|
|
+static int check_array(struct state *st, struct mdstat_ent *mdstat, int increments, char *prefer);
|
|
+static int add_new_arrays(struct mdstat_ent *mdstat, struct state **statelist);
|
|
+static void try_spare_migration(struct state *statelist);
|
|
static void link_containers_with_subarrays(struct state *list);
|
|
static void free_statelist(struct state *statelist);
|
|
#ifndef NO_LIBUDEV
|
|
@@ -132,7 +131,6 @@ int Monitor(struct mddev_dev *devlist,
|
|
int finished = 0;
|
|
struct mdstat_ent *mdstat = NULL;
|
|
char *mailfrom;
|
|
- struct alert_info info;
|
|
struct mddev_ident *mdlist;
|
|
int delay_for_event = c->delay;
|
|
|
|
@@ -166,6 +164,13 @@ int Monitor(struct mddev_dev *devlist,
|
|
info.mailaddr = mailaddr;
|
|
info.mailfrom = mailfrom;
|
|
info.dosyslog = dosyslog;
|
|
+ info.test = c->test;
|
|
+
|
|
+ if (gethostname(info.hostname, sizeof(info.hostname)) != 0) {
|
|
+ pr_err("Cannot get hostname.\n");
|
|
+ return 1;
|
|
+ }
|
|
+ info.hostname[sizeof(info.hostname) - 1] = '\0';
|
|
|
|
if (share){
|
|
if (check_one_sharer(c->scan))
|
|
@@ -241,8 +246,7 @@ int Monitor(struct mddev_dev *devlist,
|
|
mdstat = mdstat_read(oneshot ? 0 : 1, 0);
|
|
|
|
for (st = statelist; st; st = st->next) {
|
|
- if (check_array(st, mdstat, c->test, &info,
|
|
- increments, c->prefer))
|
|
+ if (check_array(st, mdstat, increments, c->prefer))
|
|
anydegraded = 1;
|
|
/* for external arrays, metadata is filled for
|
|
* containers only
|
|
@@ -255,15 +259,14 @@ int Monitor(struct mddev_dev *devlist,
|
|
|
|
/* now check if there are any new devices found in mdstat */
|
|
if (c->scan)
|
|
- new_found = add_new_arrays(mdstat, &statelist, c->test,
|
|
- &info);
|
|
+ new_found = add_new_arrays(mdstat, &statelist);
|
|
|
|
/* If an array has active < raid && spare == 0 && spare_group != NULL
|
|
* Look for another array with spare > 0 and active == raid and same spare_group
|
|
* if found, choose a device and hotremove/hotadd
|
|
*/
|
|
if (share && anydegraded)
|
|
- try_spare_migration(statelist, &info);
|
|
+ try_spare_migration(statelist);
|
|
if (!new_found) {
|
|
if (oneshot)
|
|
break;
|
|
@@ -294,7 +297,7 @@ int Monitor(struct mddev_dev *devlist,
|
|
mdstat_close();
|
|
}
|
|
}
|
|
- c->test = 0;
|
|
+ info.test = 0;
|
|
|
|
for (stp = &statelist; (st = *stp) != NULL; ) {
|
|
if (st->from_auto && st->err > 5) {
|
|
@@ -412,7 +415,7 @@ static void write_autorebuild_pid()
|
|
}
|
|
}
|
|
|
|
-static void execute_alert_cmd(const char *event, const char *dev, const char *disc, struct alert_info *info)
|
|
+static void execute_alert_cmd(const char *event, const char *dev, const char *disc)
|
|
{
|
|
int pid = fork();
|
|
|
|
@@ -424,15 +427,14 @@ static void execute_alert_cmd(const char *event, const char *dev, const char *di
|
|
pr_err("Cannot fork to execute alert command");
|
|
break;
|
|
case 0:
|
|
- execl(info->alert_cmd, info->alert_cmd, event, dev, disc, NULL);
|
|
+ execl(info.alert_cmd, info.alert_cmd, event, dev, disc, NULL);
|
|
exit(2);
|
|
}
|
|
}
|
|
|
|
-static void send_event_email(const char *event, const char *dev, const char *disc, struct alert_info *info)
|
|
+static void send_event_email(const char *event, const char *dev, const char *disc)
|
|
{
|
|
FILE *mp, *mdstat;
|
|
- char hname[256];
|
|
char buf[BUFSIZ];
|
|
int n;
|
|
|
|
@@ -442,14 +444,13 @@ static void send_event_email(const char *event, const char *dev, const char *dis
|
|
return;
|
|
}
|
|
|
|
- gethostname(hname, sizeof(hname));
|
|
signal(SIGPIPE, SIG_IGN);
|
|
- if (info->mailfrom)
|
|
- fprintf(mp, "From: %s\n", info->mailfrom);
|
|
+ if (info.mailfrom)
|
|
+ fprintf(mp, "From: %s\n", info.mailfrom);
|
|
else
|
|
fprintf(mp, "From: %s monitoring <root>\n", Name);
|
|
- fprintf(mp, "To: %s\n", info->mailaddr);
|
|
- fprintf(mp, "Subject: %s event on %s:%s\n\n", event, dev, hname);
|
|
+ fprintf(mp, "To: %s\n", info.mailaddr);
|
|
+ fprintf(mp, "Subject: %s event on %s:%s\n\n", event, dev, info.hostname);
|
|
fprintf(mp, "This is an automatically generated mail message. \n");
|
|
fprintf(mp, "A %s event had been detected on md device %s.\n\n", event, dev);
|
|
|
|
@@ -501,37 +502,36 @@ static void log_event_to_syslog(const char *event, const char *dev, const char *
|
|
syslog(priority, "%s event detected on md device %s", event, dev);
|
|
}
|
|
|
|
-static void alert(const char *event, const char *dev, const char *disc, struct alert_info *info)
|
|
+static void alert(const char *event, const char *dev, const char *disc)
|
|
{
|
|
- if (!info->alert_cmd && !info->mailaddr && !info->dosyslog) {
|
|
+ if (!info.alert_cmd && !info.mailaddr && !info.dosyslog) {
|
|
time_t now = time(0);
|
|
|
|
printf("%1.15s: %s on %s %s\n", ctime(&now) + 4,
|
|
event, dev, disc?disc:"unknown device");
|
|
}
|
|
- if (info->alert_cmd)
|
|
- execute_alert_cmd(event, dev, disc, info);
|
|
+ if (info.alert_cmd)
|
|
+ execute_alert_cmd(event, dev, disc);
|
|
|
|
- if (info->mailaddr && (strncmp(event, "Fail", 4) == 0 ||
|
|
+ if (info.mailaddr && (strncmp(event, "Fail", 4) == 0 ||
|
|
strncmp(event, "Test", 4) == 0 ||
|
|
strncmp(event, "Spares", 6) == 0 ||
|
|
strncmp(event, "Degrade", 7) == 0)) {
|
|
- send_event_email(event, dev, disc, info);
|
|
+ send_event_email(event, dev, disc);
|
|
}
|
|
|
|
- if (info->dosyslog)
|
|
+ if (info.dosyslog)
|
|
log_event_to_syslog(event, dev, disc);
|
|
}
|
|
|
|
static int check_array(struct state *st, struct mdstat_ent *mdstat,
|
|
- int test, struct alert_info *ainfo,
|
|
int increments, char *prefer)
|
|
{
|
|
/* Update the state 'st' to reflect any changes shown in mdstat,
|
|
* or found by directly examining the array, and return
|
|
* '1' if the array is degraded, or '0' if it is optimal (or dead).
|
|
*/
|
|
- struct { int state, major, minor; } info[MAX_DISKS];
|
|
+ struct { int state, major, minor; } disks_info[MAX_DISKS];
|
|
struct mdinfo *sra = NULL;
|
|
mdu_array_info_t array;
|
|
struct mdstat_ent *mse = NULL, *mse2;
|
|
@@ -545,8 +545,8 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
|
|
int is_container = 0;
|
|
unsigned long redundancy_only_flags = 0;
|
|
|
|
- if (test)
|
|
- alert("TestMessage", dev, NULL, ainfo);
|
|
+ if (info.test)
|
|
+ alert("TestMessage", dev, NULL);
|
|
|
|
retval = 0;
|
|
|
|
@@ -595,7 +595,7 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
|
|
*/
|
|
if (sra->array.level == 0 || sra->array.level == -1) {
|
|
if (!st->err && !st->from_config)
|
|
- alert("DeviceDisappeared", dev, " Wrong-Level", ainfo);
|
|
+ alert("DeviceDisappeared", dev, " Wrong-Level");
|
|
st->err++;
|
|
goto out;
|
|
}
|
|
@@ -612,7 +612,7 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
|
|
st->percent = RESYNC_NONE;
|
|
new_array = 1;
|
|
if (!is_container)
|
|
- alert("NewArray", st->devname, NULL, ainfo);
|
|
+ alert("NewArray", st->devname, NULL);
|
|
}
|
|
|
|
if (st->utime == array.utime && st->failed == sra->array.failed_disks &&
|
|
@@ -625,14 +625,14 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
|
|
}
|
|
if (st->utime == 0 && /* new array */
|
|
mse->pattern && strchr(mse->pattern, '_') /* degraded */)
|
|
- alert("DegradedArray", dev, NULL, ainfo);
|
|
+ alert("DegradedArray", dev, NULL);
|
|
|
|
if (st->utime == 0 && /* new array */ st->expected_spares > 0 &&
|
|
sra->array.spare_disks < st->expected_spares)
|
|
- alert("SparesMissing", dev, NULL, ainfo);
|
|
+ alert("SparesMissing", dev, NULL);
|
|
if (st->percent < 0 && st->percent != RESYNC_UNKNOWN &&
|
|
mse->percent >= 0)
|
|
- alert("RebuildStarted", dev, NULL, ainfo);
|
|
+ alert("RebuildStarted", dev, NULL);
|
|
if (st->percent >= 0 && mse->percent >= 0 &&
|
|
(mse->percent / increments) > (st->percent / increments)) {
|
|
char percentalert[18];
|
|
@@ -647,7 +647,7 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
|
|
snprintf(percentalert, sizeof(percentalert),
|
|
"Rebuild%02d", mse->percent);
|
|
|
|
- alert(percentalert, dev, NULL, ainfo);
|
|
+ alert(percentalert, dev, NULL);
|
|
}
|
|
|
|
if (mse->percent == RESYNC_NONE && st->percent >= 0) {
|
|
@@ -660,9 +660,9 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
|
|
snprintf(cnt, sizeof(cnt),
|
|
" mismatches found: %d (on raid level %d)",
|
|
sra->mismatch_cnt, sra->array.level);
|
|
- alert("RebuildFinished", dev, cnt, ainfo);
|
|
+ alert("RebuildFinished", dev, cnt);
|
|
} else
|
|
- alert("RebuildFinished", dev, NULL, ainfo);
|
|
+ alert("RebuildFinished", dev, NULL);
|
|
}
|
|
st->percent = mse->percent;
|
|
|
|
@@ -671,13 +671,13 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
|
|
mdu_disk_info_t disc;
|
|
disc.number = i;
|
|
if (md_get_disk_info(fd, &disc) >= 0) {
|
|
- info[i].state = disc.state;
|
|
- info[i].major = disc.major;
|
|
- info[i].minor = disc.minor;
|
|
+ disks_info[i].state = disc.state;
|
|
+ disks_info[i].major = disc.major;
|
|
+ disks_info[i].minor = disc.minor;
|
|
if (disc.major || disc.minor)
|
|
remaining_disks --;
|
|
} else
|
|
- info[i].major = info[i].minor = 0;
|
|
+ disks_info[i].major = disks_info[i].minor = 0;
|
|
}
|
|
last_disk = i;
|
|
|
|
@@ -700,13 +700,13 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
|
|
int change;
|
|
char *dv = NULL;
|
|
disc.number = i;
|
|
- if (i < last_disk && (info[i].major || info[i].minor)) {
|
|
- newstate = info[i].state;
|
|
- dv = map_dev_preferred(info[i].major, info[i].minor, 1,
|
|
+ if (i < last_disk && (disks_info[i].major || disks_info[i].minor)) {
|
|
+ newstate = disks_info[i].state;
|
|
+ dv = map_dev_preferred(disks_info[i].major, disks_info[i].minor, 1,
|
|
prefer);
|
|
disc.state = newstate;
|
|
- disc.major = info[i].major;
|
|
- disc.minor = info[i].minor;
|
|
+ disc.major = disks_info[i].major;
|
|
+ disc.minor = disks_info[i].minor;
|
|
} else
|
|
newstate = (1 << MD_DISK_REMOVED);
|
|
|
|
@@ -716,14 +716,14 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
|
|
change = newstate ^ st->devstate[i];
|
|
if (st->utime && change && !st->err && !new_array) {
|
|
if ((st->devstate[i]&change) & (1 << MD_DISK_SYNC))
|
|
- alert("Fail", dev, dv, ainfo);
|
|
+ alert("Fail", dev, dv);
|
|
else if ((newstate & (1 << MD_DISK_FAULTY)) &&
|
|
(disc.major || disc.minor) &&
|
|
st->devid[i] == makedev(disc.major,
|
|
disc.minor))
|
|
- alert("FailSpare", dev, dv, ainfo);
|
|
+ alert("FailSpare", dev, dv);
|
|
else if ((newstate&change) & (1 << MD_DISK_SYNC))
|
|
- alert("SpareActive", dev, dv, ainfo);
|
|
+ alert("SpareActive", dev, dv);
|
|
}
|
|
st->devstate[i] = newstate;
|
|
st->devid[i] = makedev(disc.major, disc.minor);
|
|
@@ -747,13 +747,12 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
|
|
|
|
disappeared:
|
|
if (!st->err && !is_container)
|
|
- alert("DeviceDisappeared", dev, NULL, ainfo);
|
|
+ alert("DeviceDisappeared", dev, NULL);
|
|
st->err++;
|
|
goto out;
|
|
}
|
|
|
|
-static int add_new_arrays(struct mdstat_ent *mdstat, struct state **statelist,
|
|
- int test, struct alert_info *info)
|
|
+static int add_new_arrays(struct mdstat_ent *mdstat, struct state **statelist)
|
|
{
|
|
struct mdstat_ent *mse;
|
|
int new_found = 0;
|
|
@@ -806,8 +805,8 @@ static int add_new_arrays(struct mdstat_ent *mdstat, struct state **statelist,
|
|
} else
|
|
st->parent_devnm[0] = 0;
|
|
*statelist = st;
|
|
- if (test)
|
|
- alert("TestMessage", st->devname, NULL, info);
|
|
+ if (info.test)
|
|
+ alert("TestMessage", st->devname, NULL);
|
|
new_found = 1;
|
|
}
|
|
return new_found;
|
|
@@ -971,7 +970,7 @@ static dev_t container_choose_spare(struct state *from, struct state *to,
|
|
return dev;
|
|
}
|
|
|
|
-static void try_spare_migration(struct state *statelist, struct alert_info *info)
|
|
+static void try_spare_migration(struct state *statelist)
|
|
{
|
|
struct state *from;
|
|
struct state *st;
|
|
@@ -1030,8 +1029,7 @@ static void try_spare_migration(struct state *statelist, struct alert_info *info
|
|
if (devid > 0 &&
|
|
move_spare(from->devname, to->devname,
|
|
devid)) {
|
|
- alert("MoveSpare", to->devname,
|
|
- from->devname, info);
|
|
+ alert("MoveSpare", to->devname, from->devname);
|
|
break;
|
|
}
|
|
}
|
|
--
|
|
2.38.1
|
|
|