diff options
Diffstat (limited to 'drivers/md/dm-init.c')
| -rw-r--r-- | drivers/md/dm-init.c | 25 | 
1 files changed, 22 insertions, 3 deletions
diff --git a/drivers/md/dm-init.c b/drivers/md/dm-init.c index b0c45c6ebe0b..d369457dbed0 100644 --- a/drivers/md/dm-init.c +++ b/drivers/md/dm-init.c @@ -1,13 +1,13 @@ -// SPDX-License-Identifier: GPL-2.0 +// SPDX-License-Identifier: GPL-2.0-only  /* - * dm-init.c   * Copyright (C) 2017 The Chromium OS Authors <[email protected]>   *   * This file is released under the GPLv2.   */  #include <linux/ctype.h> +#include <linux/delay.h>  #include <linux/device.h>  #include <linux/device-mapper.h>  #include <linux/init.h> @@ -18,12 +18,17 @@  #define DM_MAX_DEVICES 256  #define DM_MAX_TARGETS 256  #define DM_MAX_STR_SIZE 4096 +#define DM_MAX_WAITFOR 256  static char *create; +static char *waitfor[DM_MAX_WAITFOR]; +  /*   * Format: dm-mod.create=<name>,<uuid>,<minor>,<flags>,<table>[,<table>+][;<name>,<uuid>,<minor>,<flags>,<table>[,<table>+]+]   * Table format: <start_sector> <num_sectors> <target_type> <target_args> + * Block devices to wait for to become available before setting up tables: + * dm-mod.waitfor=<device1>[,..,<deviceN>]   *   * See Documentation/admin-guide/device-mapper/dm-init.rst for dm-mod.create="..." format   * details. @@ -266,7 +271,7 @@ static int __init dm_init_init(void)  	struct dm_device *dev;  	LIST_HEAD(devices);  	char *str; -	int r; +	int i, r;  	if (!create)  		return 0; @@ -286,6 +291,17 @@ static int __init dm_init_init(void)  	DMINFO("waiting for all devices to be available before creating mapped devices");  	wait_for_device_probe(); +	for (i = 0; i < ARRAY_SIZE(waitfor); i++) { +		if (waitfor[i]) { +			DMINFO("waiting for device %s ...", waitfor[i]); +			while (!dm_get_dev_t(waitfor[i])) +				fsleep(5000); +		} +	} + +	if (waitfor[0]) +		DMINFO("all devices available"); +  	list_for_each_entry(dev, &devices, list) {  		if (dm_early_create(&dev->dmi, dev->table,  				    dev->target_args_array)) @@ -301,3 +317,6 @@ late_initcall(dm_init_init);  module_param(create, charp, 0);  MODULE_PARM_DESC(create, "Create a mapped device in early boot"); + +module_param_array(waitfor, charp, NULL, 0); +MODULE_PARM_DESC(waitfor, "Devices to wait for before setting up tables");  |