]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Wait for mdmon when it is stared via systemd
authorKinga Stefaniuk <kinga.stefaniuk@intel.com>
Tue, 7 May 2024 03:38:56 +0000 (05:38 +0200)
committerMariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Tue, 14 May 2024 09:08:06 +0000 (11:08 +0200)
When mdmon is being started it may need few seconds to start.
For now, we didn't wait for it. Introduce wait_for_mdmon()
function, which waits up to 5 seconds for mdmon to start completely.

Signed-off-by: Kinga Stefaniuk <kinga.stefaniuk@intel.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Assemble.c
Grow.c
mdadm.h
util.c

index f5e9ab1f085304608ab852645b4d3327059daa92..83dced19cebadad87610e14ee873aa5439d698e4 100644 (file)
@@ -2173,8 +2173,8 @@ int assemble_container_content(struct supertype *st, int mdfd,
                        if (!mdmon_running(st->container_devnm))
                                start_mdmon(st->container_devnm);
                        ping_monitor(st->container_devnm);
-                       if (mdmon_running(st->container_devnm) &&
-                           st->update_tail == NULL)
+                       if (wait_for_mdmon(st->container_devnm) == MDADM_STATUS_SUCCESS &&
+                           !st->update_tail)
                                st->update_tail = &st->updates;
                }
 
diff --git a/Grow.c b/Grow.c
index 87ed9214ef0249d9dbc851f9afa7cf0183f95dcb..1923c27c4274d3331b3a5c4a1cc3e31beafca62f 100644 (file)
--- a/Grow.c
+++ b/Grow.c
@@ -2134,7 +2134,7 @@ int Grow_reshape(char *devname, int fd,
                        if (!mdmon_running(st->container_devnm))
                                start_mdmon(st->container_devnm);
                        ping_monitor(container);
-                       if (mdmon_running(st->container_devnm) == false) {
+                       if (wait_for_mdmon(st->container_devnm) != MDADM_STATUS_SUCCESS) {
                                pr_err("No mdmon found. Grow cannot continue.\n");
                                goto release;
                        }
@@ -3218,7 +3218,8 @@ static int reshape_array(char *container, int fd, char *devname,
                        if (!mdmon_running(container))
                                start_mdmon(container);
                        ping_monitor(container);
-                       if (mdmon_running(container) && st->update_tail == NULL)
+                       if (wait_for_mdmon(container) == MDADM_STATUS_SUCCESS &&
+                           !st->update_tail)
                                st->update_tail = &st->updates;
                }
        }
@@ -5173,7 +5174,7 @@ int Grow_continue_command(char *devname, int fd, struct context *c)
                        start_mdmon(container);
                ping_monitor(container);
 
-               if (mdmon_running(container) == false) {
+               if (wait_for_mdmon(container) != MDADM_STATUS_SUCCESS) {
                        pr_err("No mdmon found. Grow cannot continue.\n");
                        ret_val = 1;
                        goto Grow_continue_command_exit;
diff --git a/mdadm.h b/mdadm.h
index 1ba541fc2a1f72674c8f29c4b914823aaf54d5c3..b71d7b32ee07fa84feabfeccaa0e4ca20d1cb544 100644 (file)
--- a/mdadm.h
+++ b/mdadm.h
@@ -1770,6 +1770,8 @@ extern struct superswitch *version_to_superswitch(char *vers);
 
 extern int mdmon_running(const char *devnm);
 extern int mdmon_pid(const char *devnm);
+extern mdadm_status_t wait_for_mdmon(const char *devnm);
+
 extern int check_env(char *name);
 extern __u32 random32(void);
 extern void random_uuid(__u8 *buf);
diff --git a/util.c b/util.c
index e2b490e1802960a02a638fac656e370d46b96f57..bf79742fe44e16c7f2a1e4464146fdfc0f0b243d 100644 (file)
--- a/util.c
+++ b/util.c
@@ -1932,6 +1932,35 @@ int mdmon_running(const char *devnm)
        return 0;
 }
 
+/*
+ * wait_for_mdmon() - Waits for mdmon within specified time.
+ * @devnm: Device for which mdmon should start.
+ *
+ * Function waits for mdmon to start. It may need few seconds
+ * to start, we set timeout to 5, it should be sufficient.
+ * Do not wait if mdmon has been started.
+ *
+ * Return: MDADM_STATUS_SUCCESS if mdmon is running, error code otherwise.
+ */
+mdadm_status_t wait_for_mdmon(const char *devnm)
+{
+       const time_t mdmon_timeout = 5;
+       time_t start_time = time(0);
+
+       if (mdmon_running(devnm))
+               return MDADM_STATUS_SUCCESS;
+
+       pr_info("Waiting for mdmon to start\n");
+       while (time(0) - start_time < mdmon_timeout) {
+               sleep_for(0, MSEC_TO_NSEC(200), true);
+               if (mdmon_running(devnm))
+                       return MDADM_STATUS_SUCCESS;
+       };
+
+       pr_err("Timeout waiting for mdmon\n");
+       return MDADM_STATUS_ERROR;
+}
+
 int start_mdmon(char *devnm)
 {
        int i;