[dm-devel] [PATCH v2 4/5] dm mpath: add 'default_hw_handler' feature
Moger, Babu
Babu.Moger at netapp.com
Wed May 9 18:10:59 UTC 2012
Mike,
> -----Original Message-----
> From: Mike Snitzer [mailto:snitzer at redhat.com]
> Sent: Tuesday, May 08, 2012 4:56 PM
> To: dm-devel at redhat.com
> Cc: agk at redhat.com; hare at suse.de; Moger, Babu; sekharan at us.ibm.com;
> Mike Snitzer
> Subject: [PATCH v2 4/5] dm mpath: add 'default_hw_handler' feature
>
> From: Hannes Reinecke <hare at suse.de>
>
> When specifying the feature 'default_hw_handler' multipath will be 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.
I am trying to test these patches right now. What is the expectation from
Multipath tools for this to work correctly. Do I have to pass following
Parameters?
hardware_handler "1 alua"
features "1 default_hw_handler"
It appears to me that the first line will forcibly load the alua handler even if
the default handler is different.
>
> 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: Hannes Reinecke <hare at suse.de>
> Signed-off-by: Mike Snitzer <snitzer at redhat.com>
> ---
> drivers/md/dm-mpath.c | 27 +++++++++++++++++++++++----
> 1 files changed, 23 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c
> index c351607..0fc6849 100644
> --- a/drivers/md/dm-mpath.c
> +++ b/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 dm_arg_set
> *as, struct path_selector *ps
> 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,18 @@ static struct pgpath *parse_path(struct dm_arg_set
> *as, struct path_selector *ps
> 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);
> + if (attached_handler_name) {
> + kfree(m->hw_handler_name);
> + m->hw_handler_name =
> kstrdup(attached_handler_name, GFP_KERNEL);
> + }
> + }
>
> + if (m->hw_handler_name) {
> r = scsi_dh_attach(q, m->hw_handler_name);
> if (r == -EBUSY) {
> /*
> @@ -759,7 +770,7 @@ static int parse_features(struct dm_arg_set *as,
> struct multipath *m)
> 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 +791,11 @@ static int parse_features(struct dm_arg_set *as,
> struct multipath *m)
> 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 +1379,16 @@ static int multipath_status(struct dm_target *ti,
> status_type_t type,
> 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)
> --
> 1.7.4.4
More information about the dm-devel
mailing list