aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/scsi_transport_srp.c22
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
54static 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
65static 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
63static inline struct srp_rport *shost_to_rport(struct Scsi_Host *shost) 76static 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}