aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/qla4xxx/ql4_os.c19
-rw-r--r--drivers/scsi/scsi_transport_iscsi.c17
-rw-r--r--include/scsi/scsi_transport_iscsi.h2
3 files changed, 21 insertions, 17 deletions
diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c
index 01308e7ef2ae..29cd4b90ebed 100644
--- a/drivers/scsi/qla4xxx/ql4_os.c
+++ b/drivers/scsi/qla4xxx/ql4_os.c
@@ -54,8 +54,9 @@ static void qla4xxx_config_dma_addressing(struct scsi_qla_host *ha);
54/* 54/*
55 * iSCSI template entry points 55 * iSCSI template entry points
56 */ 56 */
57static int qla4xxx_tgt_dscvr(enum iscsi_tgt_dscvr type, uint32_t host_no, 57static int qla4xxx_tgt_dscvr(struct Scsi_Host *shost,
58 uint32_t enable, struct sockaddr *dst_addr); 58 enum iscsi_tgt_dscvr type, uint32_t enable,
59 struct sockaddr *dst_addr);
59static int qla4xxx_conn_get_param(struct iscsi_cls_conn *conn, 60static int qla4xxx_conn_get_param(struct iscsi_cls_conn *conn,
60 enum iscsi_param param, char *buf); 61 enum iscsi_param param, char *buf);
61static int qla4xxx_sess_get_param(struct iscsi_cls_session *sess, 62static int qla4xxx_sess_get_param(struct iscsi_cls_session *sess,
@@ -243,21 +244,15 @@ static int qla4xxx_conn_get_param(struct iscsi_cls_conn *conn,
243 return len; 244 return len;
244} 245}
245 246
246static int qla4xxx_tgt_dscvr(enum iscsi_tgt_dscvr type, uint32_t host_no, 247static int qla4xxx_tgt_dscvr(struct Scsi_Host *shost,
247 uint32_t enable, struct sockaddr *dst_addr) 248 enum iscsi_tgt_dscvr type, uint32_t enable,
249 struct sockaddr *dst_addr)
248{ 250{
249 struct scsi_qla_host *ha; 251 struct scsi_qla_host *ha;
250 struct Scsi_Host *shost;
251 struct sockaddr_in *addr; 252 struct sockaddr_in *addr;
252 struct sockaddr_in6 *addr6; 253 struct sockaddr_in6 *addr6;
253 int ret = 0; 254 int ret = 0;
254 255
255 shost = scsi_host_lookup(host_no);
256 if (IS_ERR(shost)) {
257 printk(KERN_ERR "Could not find host no %u\n", host_no);
258 return -ENODEV;
259 }
260
261 ha = (struct scsi_qla_host *) shost->hostdata; 256 ha = (struct scsi_qla_host *) shost->hostdata;
262 257
263 switch (type) { 258 switch (type) {
@@ -281,8 +276,6 @@ static int qla4xxx_tgt_dscvr(enum iscsi_tgt_dscvr type, uint32_t host_no,
281 default: 276 default:
282 ret = -ENOSYS; 277 ret = -ENOSYS;
283 } 278 }
284
285 scsi_host_put(shost);
286 return ret; 279 return ret;
287} 280}
288 281
diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c
index 1ba98d255fac..59287601bd41 100644
--- a/drivers/scsi/scsi_transport_iscsi.c
+++ b/drivers/scsi/scsi_transport_iscsi.c
@@ -945,15 +945,26 @@ static int
945iscsi_tgt_dscvr(struct iscsi_transport *transport, 945iscsi_tgt_dscvr(struct iscsi_transport *transport,
946 struct iscsi_uevent *ev) 946 struct iscsi_uevent *ev)
947{ 947{
948 struct Scsi_Host *shost;
948 struct sockaddr *dst_addr; 949 struct sockaddr *dst_addr;
950 int err;
949 951
950 if (!transport->tgt_dscvr) 952 if (!transport->tgt_dscvr)
951 return -EINVAL; 953 return -EINVAL;
952 954
955 shost = scsi_host_lookup(ev->u.tgt_dscvr.host_no);
956 if (IS_ERR(shost)) {
957 printk(KERN_ERR "target discovery could not find host no %u\n",
958 ev->u.tgt_dscvr.host_no);
959 return -ENODEV;
960 }
961
962
953 dst_addr = (struct sockaddr *)((char*)ev + sizeof(*ev)); 963 dst_addr = (struct sockaddr *)((char*)ev + sizeof(*ev));
954 return transport->tgt_dscvr(ev->u.tgt_dscvr.type, 964 err = transport->tgt_dscvr(shost, ev->u.tgt_dscvr.type,
955 ev->u.tgt_dscvr.host_no, 965 ev->u.tgt_dscvr.enable, dst_addr);
956 ev->u.tgt_dscvr.enable, dst_addr); 966 scsi_host_put(shost);
967 return err;
957} 968}
958 969
959static int 970static int
diff --git a/include/scsi/scsi_transport_iscsi.h b/include/scsi/scsi_transport_iscsi.h
index e962c5357eef..902e69f0272c 100644
--- a/include/scsi/scsi_transport_iscsi.h
+++ b/include/scsi/scsi_transport_iscsi.h
@@ -127,7 +127,7 @@ struct iscsi_transport {
127 uint64_t *ep_handle); 127 uint64_t *ep_handle);
128 int (*ep_poll) (uint64_t ep_handle, int timeout_ms); 128 int (*ep_poll) (uint64_t ep_handle, int timeout_ms);
129 void (*ep_disconnect) (uint64_t ep_handle); 129 void (*ep_disconnect) (uint64_t ep_handle);
130 int (*tgt_dscvr) (enum iscsi_tgt_dscvr type, uint32_t host_no, 130 int (*tgt_dscvr) (struct Scsi_Host *shost, enum iscsi_tgt_dscvr type,
131 uint32_t enable, struct sockaddr *dst_addr); 131 uint32_t enable, struct sockaddr *dst_addr);
132}; 132};
133 133