diff options
| -rw-r--r-- | drivers/scsi/scsi_transport_srp.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/drivers/scsi/scsi_transport_srp.c b/drivers/scsi/scsi_transport_srp.c index 36f6190931bc..456ce9f19569 100644 --- a/drivers/scsi/scsi_transport_srp.c +++ b/drivers/scsi/scsi_transport_srp.c | |||
| @@ -51,6 +51,8 @@ struct srp_internal { | |||
| 51 | struct transport_container rport_attr_cont; | 51 | struct transport_container rport_attr_cont; |
| 52 | }; | 52 | }; |
| 53 | 53 | ||
| 54 | static int scsi_is_srp_rport(const struct device *dev); | ||
| 55 | |||
| 54 | #define to_srp_internal(tmpl) container_of(tmpl, struct srp_internal, t) | 56 | #define to_srp_internal(tmpl) container_of(tmpl, struct srp_internal, t) |
| 55 | 57 | ||
| 56 | #define dev_to_rport(d) container_of(d, struct srp_rport, dev) | 58 | #define dev_to_rport(d) container_of(d, struct srp_rport, dev) |
| @@ -60,9 +62,24 @@ static inline struct Scsi_Host *rport_to_shost(struct srp_rport *r) | |||
| 60 | return dev_to_shost(r->dev.parent); | 62 | return dev_to_shost(r->dev.parent); |
| 61 | } | 63 | } |
| 62 | 64 | ||
| 65 | static int find_child_rport(struct device *dev, void *data) | ||
| 66 | { | ||
| 67 | struct device **child = data; | ||
| 68 | |||
| 69 | if (scsi_is_srp_rport(dev)) { | ||
| 70 | WARN_ON_ONCE(*child); | ||
| 71 | *child = dev; | ||
| 72 | } | ||
| 73 | return 0; | ||
| 74 | } | ||
| 75 | |||
| 63 | static inline struct srp_rport *shost_to_rport(struct Scsi_Host *shost) | 76 | static inline struct srp_rport *shost_to_rport(struct Scsi_Host *shost) |
| 64 | { | 77 | { |
| 65 | return transport_class_to_srp_rport(&shost->shost_gendev); | 78 | struct device *child = NULL; |
| 79 | |||
| 80 | WARN_ON_ONCE(device_for_each_child(&shost->shost_gendev, &child, | ||
| 81 | find_child_rport) < 0); | ||
| 82 | return child ? dev_to_rport(child) : NULL; | ||
| 66 | } | 83 | } |
| 67 | 84 | ||
| 68 | /** | 85 | /** |
| @@ -600,7 +617,8 @@ enum blk_eh_timer_return srp_timed_out(struct scsi_cmnd *scmd) | |||
| 600 | struct srp_rport *rport = shost_to_rport(shost); | 617 | struct srp_rport *rport = shost_to_rport(shost); |
| 601 | 618 | ||
| 602 | pr_debug("timeout for sdev %s\n", dev_name(&sdev->sdev_gendev)); | 619 | pr_debug("timeout for sdev %s\n", dev_name(&sdev->sdev_gendev)); |
| 603 | return rport->fast_io_fail_tmo < 0 && rport->dev_loss_tmo < 0 && | 620 | return rport && rport->fast_io_fail_tmo < 0 && |
| 621 | rport->dev_loss_tmo < 0 && | ||
| 604 | i->f->reset_timer_if_blocked && scsi_device_blocked(sdev) ? | 622 | i->f->reset_timer_if_blocked && scsi_device_blocked(sdev) ? |
| 605 | BLK_EH_RESET_TIMER : BLK_EH_NOT_HANDLED; | 623 | BLK_EH_RESET_TIMER : BLK_EH_NOT_HANDLED; |
| 606 | } | 624 | } |
