]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - Manage.c
mdmon: terminate clean
[thirdparty/mdadm.git] / Manage.c
index 76447edacd2be231229cee95ff7d061d1af769dd..a6e1072502c4f7e2c998094605fd1492faecf2e9 100644 (file)
--- a/Manage.c
+++ b/Manage.c
@@ -45,12 +45,15 @@ int Manage_ro(char *devname, int fd, int readonly)
         *
         */
        mdu_array_info_t array;
+#ifndef MDASSEMBLE
        struct mdinfo *mdi;
+#endif
 
        if (md_get_version(fd) < 9000) {
                fprintf(stderr, Name ": need md driver version 0.90.0 or later\n");
                return 1;
        }
+#ifndef MDASSEMBLE
        /* If this is an externally-manage array, we need to modify the
         * metadata_version so that mdmon doesn't undo our change.
         */
@@ -92,7 +95,7 @@ int Manage_ro(char *devname, int fd, int readonly)
                }
                return 0;
        }
-
+#endif
        if (ioctl(fd, GET_ARRAY_INFO, &array)) {
                fprintf(stderr, Name ": %s does not appear to be active.\n",
                        devname);
@@ -712,6 +715,23 @@ int Manage_subdevs(char *devname, int fd,
                                        close(lfd);
                                return 1;
                        }
+                       if (tst->ss->external) {
+                               /*
+                                * Before dropping our exclusive open we make an
+                                * attempt at preventing mdmon from seeing an
+                                * 'add' event before reconciling this 'remove'
+                                * event.
+                                */
+                               char *name = devnum2devname(fd2devnum(fd));
+
+                               if (!name) {
+                                       fprintf(stderr, Name ": unable to get container name\n");
+                                       return 1;
+                               }
+
+                               ping_manager(name);
+                               free(name);
+                       }
                        close(lfd);
                        if (verbose >= 0)
                                fprintf(stderr, Name ": hot removed %s\n",