All of lore.kernel.org
 help / color / mirror / Atom feed
From: NeilBrown <neilb@suse.com>
To: Jes Sorensen <jes.sorensen@gmail.com>
Cc: linux-raid@vger.kernel.org
Subject: [mdadm PATCH 4/4] Create: tell udev device is not ready when first created.
Date: Thu, 20 Apr 2017 12:40:06 +1000	[thread overview]
Message-ID: <149265600601.31004.323865505557190368.stgit@noble> (raw)
In-Reply-To: <149265560315.31004.3851231165281498425.stgit@noble>

When an array is created the content is not initializes,
so it could have remnants of an old filesystem or md array
etc on it.
udev will see this and might try to activate it, which is almost
certainly not what is wanted.

So create a temporary udev rules files to set ENV{SYSTEMD_READY}="0"
while the creation event is processed.  This is fairly uniformly
used to suppress actions based on the contents of the device.

Signed-off-by: NeilBrown <neilb@suse.com>
---
 Create.c |    9 +++++++++
 lib.c    |   22 ++++++++++++++++++++++
 mdadm.h  |    2 ++
 3 files changed, 33 insertions(+)

diff --git a/Create.c b/Create.c
index 6ca092449880..915ba6f49fe8 100644
--- a/Create.c
+++ b/Create.c
@@ -605,9 +605,11 @@ int Create(struct supertype *st, char *mddev,
 
 	/* We need to create the device */
 	map_lock(&map);
+	udev_block();
 	mdfd = create_mddev(mddev, name, c->autof, LOCAL, chosen_name);
 	if (mdfd < 0) {
 		map_unlock(&map);
+		udev_unblock();
 		return 1;
 	}
 	/* verify if chosen_name is not in use,
@@ -620,6 +622,7 @@ int Create(struct supertype *st, char *mddev,
 			chosen_name);
 		close(mdfd);
 		map_unlock(&map);
+		udev_unblock();
 		return 1;
 	}
 	mddev = chosen_name;
@@ -1053,9 +1056,15 @@ int Create(struct supertype *st, char *mddev,
 		pr_err("not starting array - not enough devices.\n");
 	}
 	close(mdfd);
+	/* Give udev a moment to process the Change event caused
+	 * by the close.
+	 */
+	usleep(100*1000);
+	udev_unblock();
 	return 0;
 
  abort:
+	udev_unblock();
 	map_lock(&map);
  abort_locked:
 	map_remove(&map, fd2devnm(mdfd));
diff --git a/lib.c b/lib.c
index b640634ef6f2..c38dd7cf1660 100644
--- a/lib.c
+++ b/lib.c
@@ -163,6 +163,28 @@ char *fd2devnm(int fd)
 	return NULL;
 }
 
+/* When we create a new array, we don't want the content to
+ * be immediately examined by udev - it is probably meaningless.
+ * So create /run/udev/rules.d/01-mdadm-create.rules to tell udev
+ * that the device isn't ready.
+ */
+static char udev_path[] = "/run/udev/rules.d/01-mdadm-create.rules";
+void udev_block(void)
+{
+	FILE *f;
+
+	f = fopen(udev_path, "w");
+	if (f) {
+		fputs("KERNEL==\"md*\", ENV{SYSTEMD_READY}=\"0\"\n", f);
+		fclose(f);
+	}
+}
+
+void udev_unblock(void)
+{
+	unlink(udev_path);
+}
+
 /*
  * convert a major/minor pair for a block device into a name in /dev, if possible.
  * On the first call, walk /dev collecting name.
diff --git a/mdadm.h b/mdadm.h
index f1f643c794d4..fa4d71fc91f0 100644
--- a/mdadm.h
+++ b/mdadm.h
@@ -1556,6 +1556,8 @@ extern char *stat2kname(struct stat *st);
 extern char *fd2kname(int fd);
 extern char *stat2devnm(struct stat *st);
 extern char *fd2devnm(int fd);
+extern void udev_block(void);
+extern void udev_unblock(void);
 
 extern int in_initrd(void);
 



  parent reply	other threads:[~2017-04-20  2:40 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-04-20  2:40 [mdadm PATCH 0/4] Assorted mdadm patches NeilBrown
2017-04-20  2:40 ` [mdadm PATCH 2/4] systemd/mdadm-last-resort: use ConditionPathExists instead of Conflicts NeilBrown
2017-04-20 16:57   ` Jes Sorensen
2017-04-20  2:40 ` [mdadm PATCH 1/4] Grow_continue_command: ensure 'content' is properly initialised NeilBrown
2017-04-20 16:56   ` Jes Sorensen
2017-04-20  2:40 ` [mdadm PATCH 3/4] Detail: ensure --export names are acceptable as shell variables NeilBrown
2017-04-20 16:59   ` Jes Sorensen
2017-04-20  2:40 ` NeilBrown [this message]
2017-04-20 17:29   ` [mdadm PATCH 4/4] Create: tell udev device is not ready when first created Jes Sorensen
2017-04-20 21:35     ` NeilBrown
2017-04-26 10:19       ` Peter Rajnoha
2017-04-28  3:55         ` NeilBrown
2017-04-28  9:08           ` Peter Rajnoha
2017-05-01  4:35             ` [dm-devel] " NeilBrown
2017-05-02 11:40               ` Peter Rajnoha
2017-05-02 13:40                 ` Jes Sorensen
2017-05-03 14:27                   ` Peter Rajnoha
2017-05-03 14:41                     ` Jes Sorensen
2017-05-02 21:42                 ` NeilBrown
2017-04-28  5:05         ` [mdadm PATCH] Create: tell udev md " NeilBrown
2017-04-28  9:28           ` Peter Rajnoha
2017-05-02 13:32             ` Jes Sorensen
2017-05-03 14:13               ` Peter Rajnoha
2017-05-03 14:44                 ` Jes Sorensen
2017-05-06 16:25                 ` Wols Lists
2017-05-06 19:50                   ` Phil Turmel
2017-05-11 13:23                     ` Martin Wilck
2017-05-09 11:57                   ` Peter Rajnoha
2017-05-09 12:14                   ` Peter Rajnoha
2017-05-02 13:42           ` Jes Sorensen
2017-05-03 14:32             ` Peter Rajnoha
2017-05-03 14:45               ` [dm-devel] " Jes Sorensen
2017-05-04 10:58           ` Peter Rajnoha
2017-05-05  5:16             ` [mdadm PATCH] Fix typo in new udev rule NeilBrown
2017-05-05 15:07               ` Jes Sorensen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=149265600601.31004.323865505557190368.stgit@noble \
    --to=neilb@suse.com \
    --cc=jes.sorensen@gmail.com \
    --cc=linux-raid@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.