Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[SCSI] iscsi class, iscsi_tcp, iser, qla4xxx: add netdevname sysfs attr

iSCSI must support software iscsi (iscsi_tcp, iser), hardware iscsi (qla4xxx),
and partial offload (broadcom). To be able to allow each stack or driver
or port (virtual or physical) to be able to log into the same target portal
we use the initiator tuple [[HWADDRESS | NETDEVNAME], INITIATOR_NAME] and
the target tuple [TARGETNAME, CONN_ADDRESS, CONN_PORT] to id a session.
This patch adds the netdev name, which is used by software iscsi when
it binds a session to a netdevice using the SO_BINDTODEVICE sock opt.
It cannot use HWADDRESS because if someone did vlans then the same netdevice
will have the same mac and the initiator,target id will not be unique.

Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
Cc: Roland Dreier <rdreier@cisco.com>
Cc: David C Somayajulu <david.somayajulu@qlogic.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>

authored by

Mike Christie and committed by
James Bottomley
d8196ed2 22236961

+25 -5
+1
drivers/infiniband/ulp/iser/iscsi_iser.c
··· 583 583 ISCSI_USERNAME | ISCSI_PASSWORD | 584 584 ISCSI_USERNAME_IN | ISCSI_PASSWORD_IN, 585 585 .host_param_mask = ISCSI_HOST_HWADDRESS | 586 + ISCSI_HOST_NETDEV_NAME | 586 587 ISCSI_HOST_INITIATOR_NAME, 587 588 .host_template = &iscsi_iser_sht, 588 589 .conndata_size = sizeof(struct iscsi_conn),
+2 -1
drivers/scsi/iscsi_tcp.c
··· 2303 2303 ISCSI_USERNAME | ISCSI_PASSWORD | 2304 2304 ISCSI_USERNAME_IN | ISCSI_PASSWORD_IN, 2305 2305 .host_param_mask = ISCSI_HOST_HWADDRESS | ISCSI_HOST_IPADDRESS | 2306 - ISCSI_HOST_INITIATOR_NAME, 2306 + ISCSI_HOST_INITIATOR_NAME | 2307 + ISCSI_HOST_NETDEV_NAME, 2307 2308 .host_template = &iscsi_sht, 2308 2309 .conndata_size = sizeof(struct iscsi_conn), 2309 2310 .max_conn = 1,
+11
drivers/scsi/libiscsi.c
··· 1483 1483 kfree(session->username); 1484 1484 kfree(session->username_in); 1485 1485 kfree(session->targetname); 1486 + kfree(session->netdev); 1486 1487 kfree(session->hwaddress); 1487 1488 kfree(session->initiatorname); 1488 1489 ··· 2041 2040 int len; 2042 2041 2043 2042 switch (param) { 2043 + case ISCSI_HOST_PARAM_NETDEV_NAME: 2044 + if (!session->netdev) 2045 + len = sprintf(buf, "%s\n", "default"); 2046 + else 2047 + len = sprintf(buf, "%s\n", session->netdev); 2048 + break; 2044 2049 case ISCSI_HOST_PARAM_HWADDRESS: 2045 2050 if (!session->hwaddress) 2046 2051 len = sprintf(buf, "%s\n", "default"); ··· 2074 2067 struct iscsi_session *session = iscsi_hostdata(shost->hostdata); 2075 2068 2076 2069 switch (param) { 2070 + case ISCSI_HOST_PARAM_NETDEV_NAME: 2071 + if (!session->netdev) 2072 + session->netdev = kstrdup(buf, GFP_KERNEL); 2073 + break; 2077 2074 case ISCSI_HOST_PARAM_HWADDRESS: 2078 2075 if (!session->hwaddress) 2079 2076 session->hwaddress = kstrdup(buf, GFP_KERNEL);
+2 -1
drivers/scsi/qla4xxx/ql4_os.c
··· 102 102 static struct iscsi_transport qla4xxx_iscsi_transport = { 103 103 .owner = THIS_MODULE, 104 104 .name = DRIVER_NAME, 105 - .caps = CAP_FW_DB | CAP_SENDTARGETS_OFFLOAD, 105 + .caps = CAP_FW_DB | CAP_SENDTARGETS_OFFLOAD | 106 + CAP_DATA_PATH_OFFLOAD, 106 107 .param_mask = ISCSI_CONN_PORT | ISCSI_CONN_ADDRESS | 107 108 ISCSI_TARGET_NAME | ISCSI_TPGT, 108 109 .host_param_mask = ISCSI_HOST_HWADDRESS |
+4 -2
drivers/scsi/scsi_transport_iscsi.c
··· 32 32 33 33 #define ISCSI_SESSION_ATTRS 15 34 34 #define ISCSI_CONN_ATTRS 11 35 - #define ISCSI_HOST_ATTRS 3 35 + #define ISCSI_HOST_ATTRS 4 36 36 #define ISCSI_TRANSPORT_VERSION "2.0-724" 37 37 38 38 struct iscsi_internal { ··· 1261 1261 static ISCSI_CLASS_ATTR(host, field, S_IRUGO, show_host_param_##param, \ 1262 1262 NULL); 1263 1263 1264 - iscsi_host_attr(ipaddress, ISCSI_HOST_PARAM_IPADDRESS); 1264 + iscsi_host_attr(netdev, ISCSI_HOST_PARAM_NETDEV_NAME); 1265 1265 iscsi_host_attr(hwaddress, ISCSI_HOST_PARAM_HWADDRESS); 1266 + iscsi_host_attr(ipaddress, ISCSI_HOST_PARAM_IPADDRESS); 1266 1267 iscsi_host_attr(initiatorname, ISCSI_HOST_PARAM_INITIATOR_NAME); 1267 1268 1268 1269 #define SETUP_PRIV_SESSION_RD_ATTR(field) \ ··· 1400 1399 priv->t.host_size = sizeof(struct iscsi_host); 1401 1400 transport_container_register(&priv->t.host_attrs); 1402 1401 1402 + SETUP_HOST_RD_ATTR(netdev, ISCSI_HOST_NETDEV_NAME); 1403 1403 SETUP_HOST_RD_ATTR(ipaddress, ISCSI_HOST_IPADDRESS); 1404 1404 SETUP_HOST_RD_ATTR(hwaddress, ISCSI_HOST_HWADDRESS); 1405 1405 SETUP_HOST_RD_ATTR(initiatorname, ISCSI_HOST_INITIATOR_NAME);
+3
include/scsi/iscsi_if.h
··· 271 271 enum iscsi_host_param { 272 272 ISCSI_HOST_PARAM_HWADDRESS, 273 273 ISCSI_HOST_PARAM_INITIATOR_NAME, 274 + ISCSI_HOST_PARAM_NETDEV_NAME, 274 275 ISCSI_HOST_PARAM_IPADDRESS, 275 276 ISCSI_HOST_PARAM_MAX, 276 277 }; 277 278 278 279 #define ISCSI_HOST_HWADDRESS (1 << ISCSI_HOST_PARAM_HWADDRESS) 279 280 #define ISCSI_HOST_INITIATOR_NAME (1 << ISCSI_HOST_PARAM_INITIATOR_NAME) 281 + #define ISCSI_HOST_NETDEV_NAME (1 << ISCSI_HOST_PARAM_NETDEV_NAME) 280 282 #define ISCSI_HOST_IPADDRESS (1 << ISCSI_HOST_PARAM_IPADDRESS) 281 283 282 284 #define iscsi_ptr(_handle) ((void*)(unsigned long)_handle) ··· 305 303 #define CAP_MARKERS 0x100 306 304 #define CAP_FW_DB 0x200 307 305 #define CAP_SENDTARGETS_OFFLOAD 0x400 306 + #define CAP_DATA_PATH_OFFLOAD 0x800 308 307 309 308 /* 310 309 * These flags describes reason of stop_conn() call
+2 -1
include/scsi/libiscsi.h
··· 228 228 char *password_in; 229 229 char *targetname; 230 230 char *initiatorname; 231 - /* hw address being used for iscsi connection */ 231 + /* hw address or netdev iscsi connection is bound to */ 232 232 char *hwaddress; 233 + char *netdev; 233 234 /* control data */ 234 235 struct iscsi_transport *tt; 235 236 struct Scsi_Host *host;