Skip to content

Commit 7561352

Browse files
Mike ChristieJames Bottomley
Mike Christie
authored and
James Bottomley
committed
[SCSI] iscsi: remove session and host binding in libiscsi
bnx2i allocates a host per netdevice but will use libiscsi, so this unbinds the session from the host in that code. This will also be useful for the iser parent device dma settings fixes. Signed-off-by: Mike Christie <[email protected]> Signed-off-by: James Bottomley <[email protected]>
1 parent 32c6e1b commit 7561352

File tree

8 files changed

+225
-216
lines changed

8 files changed

+225
-216
lines changed

drivers/infiniband/ulp/iser/iscsi_iser.c

+54-20
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,10 @@
7474

7575
#include "iscsi_iser.h"
7676

77+
static struct scsi_host_template iscsi_iser_sht;
78+
static struct iscsi_transport iscsi_iser_transport;
79+
static struct scsi_transport_template *iscsi_iser_scsi_transport;
80+
7781
static unsigned int iscsi_max_lun = 512;
7882
module_param_named(max_lun, iscsi_max_lun, uint, S_IRUGO);
7983

@@ -363,40 +367,64 @@ iscsi_iser_conn_start(struct iscsi_cls_conn *cls_conn)
363367
return iscsi_conn_start(cls_conn);
364368
}
365369

366-
static struct iscsi_transport iscsi_iser_transport;
370+
static void iscsi_iser_session_destroy(struct iscsi_cls_session *cls_session)
371+
{
372+
struct Scsi_Host *shost = iscsi_session_to_shost(cls_session);
373+
374+
iscsi_session_teardown(cls_session);
375+
scsi_remove_host(shost);
376+
iscsi_host_teardown(shost);
377+
scsi_host_put(shost);
378+
}
367379

368380
static struct iscsi_cls_session *
369-
iscsi_iser_session_create(struct iscsi_transport *iscsit,
370-
struct scsi_transport_template *scsit,
371-
struct Scsi_Host *shost,
372-
uint16_t cmds_max, uint16_t qdepth,
373-
uint32_t initial_cmdsn, uint32_t *hostno)
381+
iscsi_iser_session_create(struct Scsi_Host *shost,
382+
uint16_t cmds_max, uint16_t qdepth,
383+
uint32_t initial_cmdsn, uint32_t *hostno)
374384
{
375385
struct iscsi_cls_session *cls_session;
376386
struct iscsi_session *session;
377387
int i;
378-
uint32_t hn;
379388
struct iscsi_cmd_task *ctask;
380389
struct iscsi_mgmt_task *mtask;
381390
struct iscsi_iser_cmd_task *iser_ctask;
382391
struct iser_desc *desc;
383392

393+
if (shost) {
394+
printk(KERN_ERR "iscsi_tcp: invalid shost %d.\n",
395+
shost->host_no);
396+
return NULL;
397+
}
398+
399+
shost = scsi_host_alloc(&iscsi_iser_sht, 0);
400+
if (!shost)
401+
return NULL;
402+
shost->transportt = iscsi_iser_scsi_transport;
403+
shost->max_lun = iscsi_max_lun;
404+
shost->max_id = 0;
405+
shost->max_channel = 0;
406+
shost->max_cmd_len = 16;
407+
408+
iscsi_host_setup(shost, qdepth);
409+
410+
if (scsi_add_host(shost, NULL))
411+
goto free_host;
412+
*hostno = shost->host_no;
413+
384414
/*
385415
* we do not support setting can_queue cmd_per_lun from userspace yet
386416
* because we preallocate so many resources
387417
*/
388-
cls_session = iscsi_session_setup(iscsit, scsit,
418+
cls_session = iscsi_session_setup(&iscsi_iser_transport, shost,
389419
ISCSI_DEF_XMIT_CMDS_MAX,
390-
ISCSI_MAX_CMD_PER_LUN,
391420
sizeof(struct iscsi_iser_cmd_task),
392421
sizeof(struct iser_desc),
393-
initial_cmdsn, &hn);
422+
initial_cmdsn);
394423
if (!cls_session)
395-
return NULL;
396-
397-
*hostno = hn;
398-
session = class_to_transport_session(cls_session);
424+
goto remove_host;
425+
session = cls_session->dd_data;
399426

427+
shost->can_queue = session->cmds_max;
400428
/* libiscsi setup itts, data and pool so just set desc fields */
401429
for (i = 0; i < session->cmds_max; i++) {
402430
ctask = session->cmds[i];
@@ -413,6 +441,13 @@ iscsi_iser_session_create(struct iscsi_transport *iscsit,
413441
}
414442

415443
return cls_session;
444+
445+
remove_host:
446+
scsi_remove_host(shost);
447+
free_host:
448+
iscsi_host_teardown(shost);
449+
scsi_host_put(shost);
450+
return NULL;
416451
}
417452

418453
static int
@@ -589,12 +624,11 @@ static struct iscsi_transport iscsi_iser_transport = {
589624
.host_param_mask = ISCSI_HOST_HWADDRESS |
590625
ISCSI_HOST_NETDEV_NAME |
591626
ISCSI_HOST_INITIATOR_NAME,
592-
.host_template = &iscsi_iser_sht,
593627
.conndata_size = sizeof(struct iscsi_conn),
594-
.max_lun = ISCSI_ISER_MAX_LUN,
628+
.sessiondata_size = sizeof(struct iscsi_session),
595629
/* session management */
596630
.create_session = iscsi_iser_session_create,
597-
.destroy_session = iscsi_session_teardown,
631+
.destroy_session = iscsi_iser_session_destroy,
598632
/* connection management */
599633
.create_conn = iscsi_iser_conn_create,
600634
.bind_conn = iscsi_iser_conn_bind,
@@ -633,8 +667,6 @@ static int __init iser_init(void)
633667
return -EINVAL;
634668
}
635669

636-
iscsi_iser_transport.max_lun = iscsi_max_lun;
637-
638670
memset(&ig, 0, sizeof(struct iser_global));
639671

640672
ig.desc_cache = kmem_cache_create("iser_descriptors",
@@ -650,7 +682,9 @@ static int __init iser_init(void)
650682
mutex_init(&ig.connlist_mutex);
651683
INIT_LIST_HEAD(&ig.connlist);
652684

653-
if (!iscsi_register_transport(&iscsi_iser_transport)) {
685+
iscsi_iser_scsi_transport = iscsi_register_transport(
686+
&iscsi_iser_transport);
687+
if (!iscsi_iser_scsi_transport) {
654688
iser_err("iscsi_register_transport failed\n");
655689
err = -EINVAL;
656690
goto register_transport_failure;

drivers/scsi/iscsi_tcp.c

+57-45
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ MODULE_LICENSE("GPL");
6464
#define BUG_ON(expr)
6565
#endif
6666

67+
static struct scsi_transport_template *iscsi_tcp_scsi_transport;
68+
static struct scsi_host_template iscsi_sht;
69+
static struct iscsi_transport iscsi_tcp_transport;
70+
6771
static unsigned int iscsi_max_lun = 512;
6872
module_param_named(max_lun, iscsi_max_lun, uint, S_IRUGO);
6973

@@ -1623,6 +1627,8 @@ iscsi_tcp_conn_bind(struct iscsi_cls_session *cls_session,
16231627
struct iscsi_cls_conn *cls_conn, uint64_t transport_eph,
16241628
int is_leading)
16251629
{
1630+
struct Scsi_Host *shost = iscsi_session_to_shost(cls_session);
1631+
struct iscsi_host *ihost = shost_priv(shost);
16261632
struct iscsi_conn *conn = cls_conn->dd_data;
16271633
struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
16281634
struct sock *sk;
@@ -1646,8 +1652,8 @@ iscsi_tcp_conn_bind(struct iscsi_cls_session *cls_session,
16461652
if (err)
16471653
goto free_socket;
16481654

1649-
err = iscsi_tcp_get_addr(conn, sock, conn->local_address,
1650-
&conn->local_port, kernel_getsockname);
1655+
err = iscsi_tcp_get_addr(conn, sock, ihost->local_address,
1656+
&ihost->local_port, kernel_getsockname);
16511657
if (err)
16521658
goto free_socket;
16531659

@@ -1821,29 +1827,6 @@ iscsi_tcp_conn_get_param(struct iscsi_cls_conn *cls_conn,
18211827
return len;
18221828
}
18231829

1824-
static int
1825-
iscsi_tcp_host_get_param(struct Scsi_Host *shost, enum iscsi_host_param param,
1826-
char *buf)
1827-
{
1828-
struct iscsi_session *session = iscsi_hostdata(shost->hostdata);
1829-
int len;
1830-
1831-
switch (param) {
1832-
case ISCSI_HOST_PARAM_IPADDRESS:
1833-
spin_lock_bh(&session->lock);
1834-
if (!session->leadconn)
1835-
len = -ENODEV;
1836-
else
1837-
len = sprintf(buf, "%s\n",
1838-
session->leadconn->local_address);
1839-
spin_unlock_bh(&session->lock);
1840-
break;
1841-
default:
1842-
return iscsi_host_get_param(shost, param, buf);
1843-
}
1844-
return len;
1845-
}
1846-
18471830
static void
18481831
iscsi_conn_get_stats(struct iscsi_cls_conn *cls_conn, struct iscsi_stats *stats)
18491832
{
@@ -1869,26 +1852,44 @@ iscsi_conn_get_stats(struct iscsi_cls_conn *cls_conn, struct iscsi_stats *stats)
18691852
}
18701853

18711854
static struct iscsi_cls_session *
1872-
iscsi_tcp_session_create(struct iscsi_transport *iscsit,
1873-
struct scsi_transport_template *scsit,
1874-
struct Scsi_Host *shost, uint16_t cmds_max,
1855+
iscsi_tcp_session_create(struct Scsi_Host *shost, uint16_t cmds_max,
18751856
uint16_t qdepth, uint32_t initial_cmdsn,
18761857
uint32_t *hostno)
18771858
{
18781859
struct iscsi_cls_session *cls_session;
18791860
struct iscsi_session *session;
1880-
uint32_t hn;
18811861
int cmd_i;
18821862

1883-
cls_session = iscsi_session_setup(iscsit, scsit, cmds_max, qdepth,
1884-
sizeof(struct iscsi_tcp_cmd_task),
1885-
sizeof(struct iscsi_tcp_mgmt_task),
1886-
initial_cmdsn, &hn);
1887-
if (!cls_session)
1863+
if (shost) {
1864+
printk(KERN_ERR "iscsi_tcp: invalid shost %d.\n",
1865+
shost->host_no);
1866+
return NULL;
1867+
}
1868+
1869+
shost = scsi_host_alloc(&iscsi_sht, sizeof(struct iscsi_host));
1870+
if (!shost)
18881871
return NULL;
1889-
*hostno = hn;
1872+
shost->transportt = iscsi_tcp_scsi_transport;
1873+
shost->max_lun = iscsi_max_lun;
1874+
shost->max_id = 0;
1875+
shost->max_channel = 0;
1876+
shost->max_cmd_len = 16;
1877+
1878+
iscsi_host_setup(shost, qdepth);
1879+
1880+
if (scsi_add_host(shost, NULL))
1881+
goto free_host;
1882+
*hostno = shost->host_no;
1883+
1884+
cls_session = iscsi_session_setup(&iscsi_tcp_transport, shost, cmds_max,
1885+
sizeof(struct iscsi_tcp_cmd_task),
1886+
sizeof(struct iscsi_tcp_mgmt_task),
1887+
initial_cmdsn);
1888+
if (!cls_session)
1889+
goto remove_host;
1890+
session = cls_session->dd_data;
18901891

1891-
session = class_to_transport_session(cls_session);
1892+
shost->can_queue = session->cmds_max;
18921893
for (cmd_i = 0; cmd_i < session->cmds_max; cmd_i++) {
18931894
struct iscsi_cmd_task *ctask = session->cmds[cmd_i];
18941895
struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data;
@@ -1904,20 +1905,30 @@ iscsi_tcp_session_create(struct iscsi_transport *iscsit,
19041905
mtask->hdr = (struct iscsi_hdr *) &tcp_mtask->hdr;
19051906
}
19061907

1907-
if (iscsi_r2tpool_alloc(class_to_transport_session(cls_session)))
1908-
goto r2tpool_alloc_fail;
1909-
1908+
if (iscsi_r2tpool_alloc(session))
1909+
goto remove_session;
19101910
return cls_session;
19111911

1912-
r2tpool_alloc_fail:
1912+
remove_session:
19131913
iscsi_session_teardown(cls_session);
1914+
remove_host:
1915+
scsi_remove_host(shost);
1916+
free_host:
1917+
iscsi_host_teardown(shost);
1918+
scsi_host_put(shost);
19141919
return NULL;
19151920
}
19161921

19171922
static void iscsi_tcp_session_destroy(struct iscsi_cls_session *cls_session)
19181923
{
1919-
iscsi_r2tpool_free(class_to_transport_session(cls_session));
1924+
struct Scsi_Host *shost = iscsi_session_to_shost(cls_session);
1925+
1926+
iscsi_r2tpool_free(cls_session->dd_data);
19201927
iscsi_session_teardown(cls_session);
1928+
1929+
scsi_remove_host(shost);
1930+
iscsi_host_teardown(shost);
1931+
scsi_host_put(shost);
19211932
}
19221933

19231934
static int iscsi_tcp_slave_configure(struct scsi_device *sdev)
@@ -1976,8 +1987,8 @@ static struct iscsi_transport iscsi_tcp_transport = {
19761987
.host_param_mask = ISCSI_HOST_HWADDRESS | ISCSI_HOST_IPADDRESS |
19771988
ISCSI_HOST_INITIATOR_NAME |
19781989
ISCSI_HOST_NETDEV_NAME,
1979-
.host_template = &iscsi_sht,
19801990
.conndata_size = sizeof(struct iscsi_conn),
1991+
.sessiondata_size = sizeof(struct iscsi_session),
19811992
/* session management */
19821993
.create_session = iscsi_tcp_session_create,
19831994
.destroy_session = iscsi_tcp_session_destroy,
@@ -1991,7 +2002,7 @@ static struct iscsi_transport iscsi_tcp_transport = {
19912002
.start_conn = iscsi_conn_start,
19922003
.stop_conn = iscsi_tcp_conn_stop,
19932004
/* iscsi host params */
1994-
.get_host_param = iscsi_tcp_host_get_param,
2005+
.get_host_param = iscsi_host_get_param,
19952006
.set_host_param = iscsi_host_set_param,
19962007
/* IO */
19972008
.send_pdu = iscsi_conn_send_pdu,
@@ -2013,9 +2024,10 @@ iscsi_tcp_init(void)
20132024
iscsi_max_lun);
20142025
return -EINVAL;
20152026
}
2016-
iscsi_tcp_transport.max_lun = iscsi_max_lun;
20172027

2018-
if (!iscsi_register_transport(&iscsi_tcp_transport))
2028+
iscsi_tcp_scsi_transport = iscsi_register_transport(
2029+
&iscsi_tcp_transport);
2030+
if (!iscsi_tcp_scsi_transport)
20192031
return -ENODEV;
20202032

20212033
return 0;

0 commit comments

Comments
 (0)