summaryrefslogtreecommitdiffstats
path: root/Manage.c
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2008-09-15 20:58:43 -0700
committerDan Williams <dan.j.williams@intel.com>2008-09-15 20:58:43 -0700
commit313a4a82f130e6668ba0f4550200662e168aa945 (patch)
tree56f6b17ba26b00684153bbbc976dd1c1f825b122 /Manage.c
parent4795982e68f72ef44bd29c9883e5f6291088a3e1 (diff)
downloadmdadm-313a4a82f130e6668ba0f4550200662e168aa945.tar.gz
mdadm-313a4a82f130e6668ba0f4550200662e168aa945.tar.xz
mdadm-313a4a82f130e6668ba0f4550200662e168aa945.zip
ping_manager() to prevent 'add' before 'remove' completes
It is currently possible to remove a device and re-add it without the manager noticing, i.e. without detecting a mdstat->devcnt container->devcnt mismatch. Introduce ping_manager() to arrange for mdmon to run manage_container() prior to mdadm dropping the exclusive open() on the container. Despite these precautions sysfs_read() may still fail. If this happens invalidate container->devcnt to ensure manage_container() runs at the next event. Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'Manage.c')
-rw-r--r--Manage.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/Manage.c b/Manage.c
index 76447ed..5853515 100644
--- a/Manage.c
+++ b/Manage.c
@@ -712,6 +712,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",