[dm-devel] [PATCH v3 4/5] dm mpath: add 'default_hw_handler' feature

Chandra Seetharaman sekharan at us.ibm.com
Thu May 17 21:15:52 UTC 2012


Reviewed-by: Chandra Seetharaman <sekharan at us.ibm.com>

On Thu, 2012-05-10 at 17:31 -0400, Mike Snitzer wrote:
> When specifying the feature 'default_hw_handler' multipath will use
> the currently attached hardware handler instead of trying to attach the
> one specified during table load.  If no hardware handler is attached the
> specified hardware handler will be used.
> 
> Leverages scsi_dh_attach's ability to increment the scsi_dh's reference
> count if the same scsi_dh name is provided when attaching -- currently
> attached scsi_dh name is determined with scsi_dh_attached_handler_name.
> 
> Signed-off-by: Mike Snitzer <snitzer at redhat.com>
> Tested-by: Babu Moger <babu.moger at netapp.com>
> Cc: Hannes Reinecke <hare at suse.de>
> Cc: Chandra Seetharaman <sekharan at us.ibm.com>
> ---
>  drivers/md/dm-mpath.c |   28 ++++++++++++++++++++++++----
>  1 file changed, 24 insertions(+), 4 deletions(-)
> 
> v3: updated to not kstrdup since scsi_dh_attached_handler_name now does
> 
> Index: linux-2.6/drivers/md/dm-mpath.c
> ===================================================================
> --- linux-2.6.orig/drivers/md/dm-mpath.c
> +++ linux-2.6/drivers/md/dm-mpath.c
> @@ -84,6 +84,7 @@ struct multipath {
>  	unsigned queue_io:1;		/* Must we queue all I/O? */
>  	unsigned queue_if_no_path:1;	/* Queue I/O if last path fails? */
>  	unsigned saved_queue_if_no_path:1; /* Saved state during suspension */
> +	unsigned use_default_hw_handler:1; /* Use attached device handler */
> 
>  	unsigned pg_init_retries;	/* Number of times to retry pg_init */
>  	unsigned pg_init_count;		/* Number of times pg_init called */
> @@ -567,6 +568,7 @@ static struct pgpath *parse_path(struct 
>  	int r;
>  	struct pgpath *p;
>  	struct multipath *m = ti->private;
> +	struct request_queue *q = NULL;
> 
>  	/* we need at least a path arg */
>  	if (as->argc < 1) {
> @@ -585,9 +587,19 @@ static struct pgpath *parse_path(struct 
>  		goto bad;
>  	}
> 
> -	if (m->hw_handler_name) {
> -		struct request_queue *q = bdev_get_queue(p->path.dev->bdev);
> +	if (m->use_default_hw_handler || m->hw_handler_name)
> +		q = bdev_get_queue(p->path.dev->bdev);
> +
> +	if (m->use_default_hw_handler) {
> +		const char *attached_handler_name =
> +			scsi_dh_attached_handler_name(q, GFP_KERNEL);
> +		if (attached_handler_name) {
> +			kfree(m->hw_handler_name);
> +			m->hw_handler_name = attached_handler_name;
> +		}
> +	}
> 
> +	if (m->hw_handler_name) {
>  		r = scsi_dh_attach(q, m->hw_handler_name);
>  		if (r == -EBUSY) {
>  			/*
> @@ -759,7 +771,7 @@ static int parse_features(struct dm_arg_
>  	const char *arg_name;
> 
>  	static struct dm_arg _args[] = {
> -		{0, 5, "invalid number of feature args"},
> +		{0, 6, "invalid number of feature args"},
>  		{1, 50, "pg_init_retries must be between 1 and 50"},
>  		{0, 60000, "pg_init_delay_msecs must be between 0 and 60000"},
>  	};
> @@ -780,6 +792,11 @@ static int parse_features(struct dm_arg_
>  			continue;
>  		}
> 
> +		if (!strcasecmp(arg_name, "default_hw_handler")) {
> +			m->use_default_hw_handler = 1;
> +			continue;
> +		}
> +
>  		if (!strcasecmp(arg_name, "pg_init_retries") &&
>  		    (argc >= 1)) {
>  			r = dm_read_arg(_args + 1, as, &m->pg_init_retries, &ti->error);
> @@ -1363,13 +1380,16 @@ static int multipath_status(struct dm_ta
>  	else {
>  		DMEMIT("%u ", m->queue_if_no_path +
>  			      (m->pg_init_retries > 0) * 2 +
> -			      (m->pg_init_delay_msecs != DM_PG_INIT_DELAY_DEFAULT) * 2);
> +			      (m->pg_init_delay_msecs != DM_PG_INIT_DELAY_DEFAULT) * 2 +
> +			      m->use_default_hw_handler);
>  		if (m->queue_if_no_path)
>  			DMEMIT("queue_if_no_path ");
>  		if (m->pg_init_retries)
>  			DMEMIT("pg_init_retries %u ", m->pg_init_retries);
>  		if (m->pg_init_delay_msecs != DM_PG_INIT_DELAY_DEFAULT)
>  			DMEMIT("pg_init_delay_msecs %u ", m->pg_init_delay_msecs);
> +		if (m->use_default_hw_handler)
> +			DMEMIT("default_hw_handler ");
>  	}
> 
>  	if (!m->hw_handler_name || type == STATUSTYPE_INFO)
> 





More information about the dm-devel mailing list