[Devel] [PATCH rh7] ms/md: allow creation of mdNNN arrays via md_mod/parameters/new_array
Kirill Tkhai
ktkhai at virtuozzo.com
Wed Sep 19 12:13:01 MSK 2018
On 17.09.2018 14:45, Andrey Ryabinin wrote:
> From: NeilBrown <neilb at suse.com>
>
> The intention when creating the "new_array" parameter and the
> possibility of having array names line "md_HOME" was to transition
> away from the old way of creating arrays and to eventually only use
> this new way.
>
> The "old" way of creating array is to create a device node in /dev
> and then open it. The act of opening creates the array.
> This is problematic because sometimes the device node can be opened
> when we don't want to create an array. This can easily happen
> when some rule triggered by udev looks at a device as it is being
> destroyed. The node in /dev continues to exist for a short period
> after an array is stopped, and opening it during this time recreates
> the array (as an inactive array).
>
> Unfortunately no clear plan for the transition was created. It is now
> time to fix that.
>
> This patch allows devices with numeric names, like "md999" to be
> created by writing to "new_array". This will only work if the minor
> number given is not already in use. This will allow mdadm to
> support the creation of arrays with numbers > 511 (currently not
> possible) by writing to new_array.
> mdadm can, at some point, use this approach to create *all* arrays,
> which will allow the transition to only using the new-way.
>
> Signed-off-by: NeilBrown <neilb at suse.com>
> Acted-by: Coly Li <colyli at suse.de>
> Signed-off-by: Shaohua Li <shli at fb.com>
>
> https://pmc.acronis.com/browse/VSTOR-14964
> (cherry picked from commit 039b7225e6e98783a7a7e79c52b29c437f29967d)
> Signed-off-by: Andrey Ryabinin <aryabinin at virtuozzo.com>
> ---
> drivers/md/md.c | 36 ++++++++++++++++++++++++++++++------
> 1 file changed, 30 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/md/md.c b/drivers/md/md.c
> index 16fb8d41e607..64a9c9856b32 100644
> --- a/drivers/md/md.c
> +++ b/drivers/md/md.c
> @@ -5171,6 +5171,15 @@ EXPORT_SYMBOL_GPL(mddev_init_writes_pending);
>
> static int md_alloc(dev_t dev, char *name)
> {
> + /*
> + * If dev is zero, name is the name of a device to allocate with
> + * an arbitrary minor number. It will be "md_???"
> + * If dev is non-zero it must be a device number with a MAJOR of
> + * MD_MAJOR or mdp_major. In this case, if "name" is NULL, then
> + * the device is being created by opening a node in /dev.
> + * If "name" is not NULL, the device is being created by
> + * writing to /sys/module/md_mod/parameters/new_array.
> + */
> static DEFINE_MUTEX(disks_mutex);
> struct mddev *mddev = mddev_find(dev);
> struct gendisk *disk;
> @@ -5196,7 +5205,7 @@ static int md_alloc(dev_t dev, char *name)
> if (mddev->gendisk)
> goto abort;
>
> - if (name) {
> + if (name && !dev) {
> /* Need to ensure that 'name' is not a duplicate.
> */
> struct mddev *mddev2;
> @@ -5210,6 +5219,11 @@ static int md_alloc(dev_t dev, char *name)
> }
> spin_unlock(&all_mddevs_lock);
> }
> + if (name && dev)
> + /*
> + * Creating /dev/mdNNN via "newarray", so adjust hold_active.
> + */
> + mddev->hold_active = UNTIL_STOP;
This is dead code in both mainstream and our kernel. Very strange. Function md_alloc()
is never called with both name and dev arguments are set.
What is this needed for? Shouldn't there be (!name && dev) since this is the "newarray"?
Kirill
More information about the Devel
mailing list