|
@@ -597,9 +597,20 @@ static struct pgpath *parse_path(struct arg_set *as, struct path_selector *ps,
|
|
}
|
|
}
|
|
|
|
|
|
if (m->hw_handler_name) {
|
|
if (m->hw_handler_name) {
|
|
- r = scsi_dh_attach(bdev_get_queue(p->path.dev->bdev),
|
|
|
|
- m->hw_handler_name);
|
|
|
|
|
|
+ struct request_queue *q = bdev_get_queue(p->path.dev->bdev);
|
|
|
|
+
|
|
|
|
+ r = scsi_dh_attach(q, m->hw_handler_name);
|
|
|
|
+ if (r == -EBUSY) {
|
|
|
|
+ /*
|
|
|
|
+ * Already attached to different hw_handler,
|
|
|
|
+ * try to reattach with correct one.
|
|
|
|
+ */
|
|
|
|
+ scsi_dh_detach(q);
|
|
|
|
+ r = scsi_dh_attach(q, m->hw_handler_name);
|
|
|
|
+ }
|
|
|
|
+
|
|
if (r < 0) {
|
|
if (r < 0) {
|
|
|
|
+ ti->error = "error attaching hardware handler";
|
|
dm_put_device(ti, p->path.dev);
|
|
dm_put_device(ti, p->path.dev);
|
|
goto bad;
|
|
goto bad;
|
|
}
|
|
}
|