diff options
-rw-r--r-- | drivers/scsi/qla4xxx/ql4_os.c | 19 | ||||
-rw-r--r-- | drivers/scsi/scsi_transport_iscsi.c | 17 | ||||
-rw-r--r-- | include/scsi/scsi_transport_iscsi.h | 2 |
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 | */ |
57 | static int qla4xxx_tgt_dscvr(enum iscsi_tgt_dscvr type, uint32_t host_no, | 57 | static 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); | ||
59 | static int qla4xxx_conn_get_param(struct iscsi_cls_conn *conn, | 60 | static int qla4xxx_conn_get_param(struct iscsi_cls_conn *conn, |
60 | enum iscsi_param param, char *buf); | 61 | enum iscsi_param param, char *buf); |
61 | static int qla4xxx_sess_get_param(struct iscsi_cls_session *sess, | 62 | static 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 | ||
246 | static int qla4xxx_tgt_dscvr(enum iscsi_tgt_dscvr type, uint32_t host_no, | 247 | static 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 | |||
945 | iscsi_tgt_dscvr(struct iscsi_transport *transport, | 945 | iscsi_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 | ||
959 | static int | 970 | static 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 | ||