adfbb8ebd5
If mdcheck_start service can finish check action, it doesn't need to start mdcheck_continue service. So in rhel only patch mdcheck.patch, we stop mdcheck_continue timer. 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. Resolves: rhbz#2116418, rhbz#2150862, rhbz#2159584 Signed-off-by: Xiao Ni <xni@redhat.com>
111 lines
2.8 KiB
Diff
111 lines
2.8 KiB
Diff
From b6a84d4e92f876acd120d3062a8302db5dd2498c Mon Sep 17 00:00:00 2001
|
|
From: Mateusz Grzonka <mateusz.grzonka@intel.com>
|
|
Date: Thu, 2 Feb 2023 12:27:03 +0100
|
|
Subject: [PATCH 091/125] Mdmonitor: Refactor write_autorebuild_pid()
|
|
|
|
Add better error handling and check for symlinks when opening MDMON_DIR.
|
|
|
|
Signed-off-by: Mateusz Grzonka <mateusz.grzonka@intel.com>
|
|
Acked-by: Coly Li <colyli@suse.de>
|
|
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
|
|
---
|
|
Monitor.c | 55 ++++++++++++++++++++++++++++++++++++-------------------
|
|
1 file changed, 36 insertions(+), 19 deletions(-)
|
|
|
|
diff --git a/Monitor.c b/Monitor.c
|
|
index 39598ba0..14a2dfe5 100644
|
|
--- a/Monitor.c
|
|
+++ b/Monitor.c
|
|
@@ -33,6 +33,7 @@
|
|
#endif
|
|
|
|
#define EVENT_NAME_MAX 32
|
|
+#define AUTOREBUILD_PID_PATH MDMON_DIR "/autorebuild.pid"
|
|
|
|
struct state {
|
|
char devname[MD_NAME_MAX + sizeof("/dev/md/")]; /* length of "/dev/md/" + device name + terminating byte*/
|
|
@@ -126,7 +127,7 @@ static int check_udev_activity(void);
|
|
static void link_containers_with_subarrays(struct state *list);
|
|
static int make_daemon(char *pidfile);
|
|
static void try_spare_migration(struct state *statelist);
|
|
-static void write_autorebuild_pid(void);
|
|
+static int write_autorebuild_pid(void);
|
|
|
|
int Monitor(struct mddev_dev *devlist,
|
|
char *mailaddr, char *alert_cmd,
|
|
@@ -234,7 +235,8 @@ int Monitor(struct mddev_dev *devlist,
|
|
}
|
|
|
|
if (share)
|
|
- write_autorebuild_pid();
|
|
+ if (write_autorebuild_pid() != 0)
|
|
+ return 1;
|
|
|
|
if (devlist == NULL) {
|
|
mdlist = conf_get_ident(NULL);
|
|
@@ -440,29 +442,44 @@ static int check_one_sharer(int scan)
|
|
return 0;
|
|
}
|
|
|
|
-static void write_autorebuild_pid()
|
|
+/*
|
|
+ * write_autorebuild_pid() - Writes pid to autorebuild.pid file.
|
|
+ *
|
|
+ * Return: 0 on success, 1 on error
|
|
+ */
|
|
+static int write_autorebuild_pid(void)
|
|
{
|
|
- char path[PATH_MAX];
|
|
- int pid;
|
|
- FILE *fp = NULL;
|
|
- sprintf(path, "%s/autorebuild.pid", MDMON_DIR);
|
|
+ FILE *fp;
|
|
+ int fd;
|
|
|
|
if (mkdir(MDMON_DIR, 0700) < 0 && errno != EEXIST) {
|
|
- pr_err("Can't create autorebuild.pid file\n");
|
|
- } else {
|
|
- int fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0700);
|
|
+ pr_err("%s: %s\n", strerror(errno), MDMON_DIR);
|
|
+ return 1;
|
|
+ }
|
|
|
|
- if (fd >= 0)
|
|
- fp = fdopen(fd, "w");
|
|
+ if (!is_directory(MDMON_DIR)) {
|
|
+ pr_err("%s is not a regular directory.\n", MDMON_DIR);
|
|
+ return 1;
|
|
+ }
|
|
|
|
- if (!fp)
|
|
- pr_err("Can't create autorebuild.pid file\n");
|
|
- else {
|
|
- pid = getpid();
|
|
- fprintf(fp, "%d\n", pid);
|
|
- fclose(fp);
|
|
- }
|
|
+ fd = open(AUTOREBUILD_PID_PATH, O_WRONLY | O_CREAT | O_TRUNC, 0700);
|
|
+
|
|
+ if (fd < 0) {
|
|
+ pr_err("Error opening %s file.\n", AUTOREBUILD_PID_PATH);
|
|
+ return 1;
|
|
}
|
|
+
|
|
+ fp = fdopen(fd, "w");
|
|
+
|
|
+ if (!fp) {
|
|
+ pr_err("Error opening fd for %s file.\n", AUTOREBUILD_PID_PATH);
|
|
+ return 1;
|
|
+ }
|
|
+
|
|
+ fprintf(fp, "%d\n", getpid());
|
|
+
|
|
+ fclose(fp);
|
|
+ return 0;
|
|
}
|
|
|
|
#define BASE_MESSAGE "%s event detected on md device %s"
|
|
--
|
|
2.38.1
|
|
|