@@ -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+
6771static unsigned int iscsi_max_lun = 512 ;
6872module_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-
18471830static void
18481831iscsi_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
18711854static 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
19171922static 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
19231934static 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