[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