aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/dm-mpath.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md/dm-mpath.c')
-rw-r--r--drivers/md/dm-mpath.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c
index fea966d66f98..71dd65aa31b6 100644
--- a/drivers/md/dm-mpath.c
+++ b/drivers/md/dm-mpath.c
@@ -147,9 +147,12 @@ static struct priority_group *alloc_priority_group(void)
147static void free_pgpaths(struct list_head *pgpaths, struct dm_target *ti) 147static void free_pgpaths(struct list_head *pgpaths, struct dm_target *ti)
148{ 148{
149 struct pgpath *pgpath, *tmp; 149 struct pgpath *pgpath, *tmp;
150 struct multipath *m = ti->private;
150 151
151 list_for_each_entry_safe(pgpath, tmp, pgpaths, list) { 152 list_for_each_entry_safe(pgpath, tmp, pgpaths, list) {
152 list_del(&pgpath->list); 153 list_del(&pgpath->list);
154 if (m->hw_handler_name)
155 scsi_dh_detach(bdev_get_queue(pgpath->path.dev->bdev));
153 dm_put_device(ti, pgpath->path.dev); 156 dm_put_device(ti, pgpath->path.dev);
154 free_pgpath(pgpath); 157 free_pgpath(pgpath);
155 } 158 }
@@ -548,6 +551,7 @@ static struct pgpath *parse_path(struct arg_set *as, struct path_selector *ps,
548{ 551{
549 int r; 552 int r;
550 struct pgpath *p; 553 struct pgpath *p;
554 struct multipath *m = ti->private;
551 555
552 /* we need at least a path arg */ 556 /* we need at least a path arg */
553 if (as->argc < 1) { 557 if (as->argc < 1) {
@@ -566,6 +570,15 @@ static struct pgpath *parse_path(struct arg_set *as, struct path_selector *ps,
566 goto bad; 570 goto bad;
567 } 571 }
568 572
573 if (m->hw_handler_name) {
574 r = scsi_dh_attach(bdev_get_queue(p->path.dev->bdev),
575 m->hw_handler_name);
576 if (r < 0) {
577 dm_put_device(ti, p->path.dev);
578 goto bad;
579 }
580 }
581
569 r = ps->type->add_path(ps, &p->path, as->argc, as->argv, &ti->error); 582 r = ps->type->add_path(ps, &p->path, as->argc, as->argv, &ti->error);
570 if (r) { 583 if (r) {
571 dm_put_device(ti, p->path.dev); 584 dm_put_device(ti, p->path.dev);