summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.com>2017-04-12 16:26:13 +1000
committerShaohua Li <shli@fb.com>2017-04-12 12:30:17 -0700
commit78b6350dcaadb03b4a2970b16387227ba6744876 (patch)
tree4ba6e29179eea197a0d19a3a2eb746fa3fff9654
parent039b7225e6e98783a7a7e79c52b29c437f29967d (diff)
downloadlinux-78b6350dcaadb03b4a2970b16387227ba6744876.tar.gz
linux-78b6350dcaadb03b4a2970b16387227ba6744876.tar.bz2
linux-78b6350dcaadb03b4a2970b16387227ba6744876.zip
md: support disabling of create-on-open semantics.
md allows a new array device to be created by simply opening a device file. This make it difficult to remove the device and udev is likely to open the device file as part of processing the REMOVE event. There is an alternate mechanism for creating arrays by writing to the new_array module parameter. When using tools that work with this parameter, it is best to disable the old semantics. This new module parameter allows that. Signed-off-by: NeilBrown <neilb@suse.com> Acted-by: Coly Li <colyli@suse.de> Signed-off-by: Shaohua Li <shli@fb.com>
-rw-r--r--drivers/md/md.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 554bf213c043..6cc6dd74c153 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -174,6 +174,16 @@ static const struct block_device_operations md_fops;
static int start_readonly;
+/*
+ * The original mechanism for creating an md device is to create
+ * a device node in /dev and to open it. This causes races with device-close.
+ * The preferred method is to write to the "new_array" module parameter.
+ * This can avoid races.
+ * Setting create_on_open to false disables the original mechanism
+ * so all the races disappear.
+ */
+static bool create_on_open = true;
+
/* bio_clone_mddev
* like bio_clone, but with a local bio set
*/
@@ -5285,7 +5295,8 @@ static int md_alloc(dev_t dev, char *name)
static struct kobject *md_probe(dev_t dev, int *part, void *data)
{
- md_alloc(dev, NULL);
+ if (create_on_open)
+ md_alloc(dev, NULL);
return NULL;
}
@@ -9200,6 +9211,7 @@ static int set_ro(const char *val, struct kernel_param *kp)
module_param_call(start_ro, set_ro, get_ro, NULL, S_IRUSR|S_IWUSR);
module_param(start_dirty_degraded, int, S_IRUGO|S_IWUSR);
module_param_call(new_array, add_named_array, NULL, NULL, S_IWUSR);
+module_param(create_on_open, bool, S_IRUSR|S_IWUSR);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("MD RAID framework");