diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/target/iscsi/iscsi_target.c | 65 | ||||
| -rw-r--r-- | drivers/target/iscsi/iscsi_target.h | 2 | ||||
| -rw-r--r-- | drivers/target/iscsi/iscsi_target_parameters.c | 8 | ||||
| -rw-r--r-- | drivers/target/iscsi/iscsi_target_stat.c | 25 | ||||
| -rw-r--r-- | drivers/target/iscsi/iscsi_target_tpg.c | 39 | ||||
| -rw-r--r-- | drivers/target/target_core_configfs.c | 4 | ||||
| -rw-r--r-- | drivers/target/target_core_device.c | 58 | ||||
| -rw-r--r-- | drivers/target/target_core_fabric_configfs.c | 12 | ||||
| -rw-r--r-- | drivers/target/target_core_file.c | 114 | ||||
| -rw-r--r-- | drivers/target/target_core_iblock.c | 46 | ||||
| -rw-r--r-- | drivers/target/target_core_internal.h | 3 | ||||
| -rw-r--r-- | drivers/target/target_core_rd.c | 18 | ||||
| -rw-r--r-- | drivers/target/target_core_sbc.c | 8 | ||||
| -rw-r--r-- | drivers/target/target_core_spc.c | 42 | ||||
| -rw-r--r-- | drivers/target/target_core_tmr.c | 12 | ||||
| -rw-r--r-- | drivers/target/target_core_tpg.c | 10 | ||||
| -rw-r--r-- | drivers/target/target_core_transport.c | 19 | ||||
| -rw-r--r-- | drivers/vhost/tcm_vhost.c | 287 | ||||
| -rw-r--r-- | drivers/vhost/tcm_vhost.h | 8 |
19 files changed, 554 insertions, 226 deletions
diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c index 339f97f7085b..23a98e658306 100644 --- a/drivers/target/iscsi/iscsi_target.c +++ b/drivers/target/iscsi/iscsi_target.c | |||
| @@ -264,16 +264,50 @@ int iscsit_deaccess_np(struct iscsi_np *np, struct iscsi_portal_group *tpg) | |||
| 264 | return 0; | 264 | return 0; |
| 265 | } | 265 | } |
| 266 | 266 | ||
| 267 | static struct iscsi_np *iscsit_get_np( | 267 | bool iscsit_check_np_match( |
| 268 | struct __kernel_sockaddr_storage *sockaddr, | 268 | struct __kernel_sockaddr_storage *sockaddr, |
| 269 | struct iscsi_np *np, | ||
| 269 | int network_transport) | 270 | int network_transport) |
| 270 | { | 271 | { |
| 271 | struct sockaddr_in *sock_in, *sock_in_e; | 272 | struct sockaddr_in *sock_in, *sock_in_e; |
| 272 | struct sockaddr_in6 *sock_in6, *sock_in6_e; | 273 | struct sockaddr_in6 *sock_in6, *sock_in6_e; |
| 273 | struct iscsi_np *np; | 274 | bool ip_match = false; |
| 274 | int ip_match = 0; | ||
| 275 | u16 port; | 275 | u16 port; |
| 276 | 276 | ||
| 277 | if (sockaddr->ss_family == AF_INET6) { | ||
| 278 | sock_in6 = (struct sockaddr_in6 *)sockaddr; | ||
| 279 | sock_in6_e = (struct sockaddr_in6 *)&np->np_sockaddr; | ||
| 280 | |||
| 281 | if (!memcmp(&sock_in6->sin6_addr.in6_u, | ||
| 282 | &sock_in6_e->sin6_addr.in6_u, | ||
| 283 | sizeof(struct in6_addr))) | ||
| 284 | ip_match = true; | ||
| 285 | |||
| 286 | port = ntohs(sock_in6->sin6_port); | ||
| 287 | } else { | ||
| 288 | sock_in = (struct sockaddr_in *)sockaddr; | ||
| 289 | sock_in_e = (struct sockaddr_in *)&np->np_sockaddr; | ||
| 290 | |||
| 291 | if (sock_in->sin_addr.s_addr == sock_in_e->sin_addr.s_addr) | ||
| 292 | ip_match = true; | ||
| 293 | |||
| 294 | port = ntohs(sock_in->sin_port); | ||
| 295 | } | ||
| 296 | |||
| 297 | if ((ip_match == true) && (np->np_port == port) && | ||
| 298 | (np->np_network_transport == network_transport)) | ||
| 299 | return true; | ||
| 300 | |||
| 301 | return false; | ||
| 302 | } | ||
| 303 | |||
| 304 | static struct iscsi_np *iscsit_get_np( | ||
| 305 | struct __kernel_sockaddr_storage *sockaddr, | ||
| 306 | int network_transport) | ||
| 307 | { | ||
| 308 | struct iscsi_np *np; | ||
| 309 | bool match; | ||
| 310 | |||
| 277 | spin_lock_bh(&np_lock); | 311 | spin_lock_bh(&np_lock); |
| 278 | list_for_each_entry(np, &g_np_list, np_list) { | 312 | list_for_each_entry(np, &g_np_list, np_list) { |
| 279 | spin_lock(&np->np_thread_lock); | 313 | spin_lock(&np->np_thread_lock); |
| @@ -282,29 +316,8 @@ static struct iscsi_np *iscsit_get_np( | |||
| 282 | continue; | 316 | continue; |
| 283 | } | 317 | } |
| 284 | 318 | ||
| 285 | if (sockaddr->ss_family == AF_INET6) { | 319 | match = iscsit_check_np_match(sockaddr, np, network_transport); |
| 286 | sock_in6 = (struct sockaddr_in6 *)sockaddr; | 320 | if (match == true) { |
| 287 | sock_in6_e = (struct sockaddr_in6 *)&np->np_sockaddr; | ||
| 288 | |||
| 289 | if (!memcmp(&sock_in6->sin6_addr.in6_u, | ||
| 290 | &sock_in6_e->sin6_addr.in6_u, | ||
| 291 | sizeof(struct in6_addr))) | ||
| 292 | ip_match = 1; | ||
| 293 | |||
| 294 | port = ntohs(sock_in6->sin6_port); | ||
| 295 | } else { | ||
| 296 | sock_in = (struct sockaddr_in *)sockaddr; | ||
| 297 | sock_in_e = (struct sockaddr_in *)&np->np_sockaddr; | ||
| 298 | |||
| 299 | if (sock_in->sin_addr.s_addr == | ||
| 300 | sock_in_e->sin_addr.s_addr) | ||
| 301 | ip_match = 1; | ||
| 302 | |||
| 303 | port = ntohs(sock_in->sin_port); | ||
| 304 | } | ||
| 305 | |||
| 306 | if ((ip_match == 1) && (np->np_port == port) && | ||
| 307 | (np->np_network_transport == network_transport)) { | ||
| 308 | /* | 321 | /* |
| 309 | * Increment the np_exports reference count now to | 322 | * Increment the np_exports reference count now to |
| 310 | * prevent iscsit_del_np() below from being called | 323 | * prevent iscsit_del_np() below from being called |
diff --git a/drivers/target/iscsi/iscsi_target.h b/drivers/target/iscsi/iscsi_target.h index f1e4f3155bac..b1a1e6350707 100644 --- a/drivers/target/iscsi/iscsi_target.h +++ b/drivers/target/iscsi/iscsi_target.h | |||
| @@ -8,6 +8,8 @@ extern struct iscsi_tiqn *iscsit_add_tiqn(unsigned char *); | |||
| 8 | extern void iscsit_del_tiqn(struct iscsi_tiqn *); | 8 | extern void iscsit_del_tiqn(struct iscsi_tiqn *); |
| 9 | extern int iscsit_access_np(struct iscsi_np *, struct iscsi_portal_group *); | 9 | extern int iscsit_access_np(struct iscsi_np *, struct iscsi_portal_group *); |
| 10 | extern int iscsit_deaccess_np(struct iscsi_np *, struct iscsi_portal_group *); | 10 | extern int iscsit_deaccess_np(struct iscsi_np *, struct iscsi_portal_group *); |
| 11 | extern bool iscsit_check_np_match(struct __kernel_sockaddr_storage *, | ||
| 12 | struct iscsi_np *, int); | ||
| 11 | extern struct iscsi_np *iscsit_add_np(struct __kernel_sockaddr_storage *, | 13 | extern struct iscsi_np *iscsit_add_np(struct __kernel_sockaddr_storage *, |
| 12 | char *, int); | 14 | char *, int); |
| 13 | extern int iscsit_reset_np_thread(struct iscsi_np *, struct iscsi_tpg_np *, | 15 | extern int iscsit_reset_np_thread(struct iscsi_np *, struct iscsi_tpg_np *, |
diff --git a/drivers/target/iscsi/iscsi_target_parameters.c b/drivers/target/iscsi/iscsi_target_parameters.c index d89164287d00..ca2be406f141 100644 --- a/drivers/target/iscsi/iscsi_target_parameters.c +++ b/drivers/target/iscsi/iscsi_target_parameters.c | |||
| @@ -1095,11 +1095,11 @@ static int iscsi_check_acceptor_state(struct iscsi_param *param, char *value, | |||
| 1095 | SET_PSTATE_REPLY_OPTIONAL(param); | 1095 | SET_PSTATE_REPLY_OPTIONAL(param); |
| 1096 | } | 1096 | } |
| 1097 | } else if (IS_TYPE_NUMBER(param)) { | 1097 | } else if (IS_TYPE_NUMBER(param)) { |
| 1098 | char *tmpptr, buf[10]; | 1098 | char *tmpptr, buf[11]; |
| 1099 | u32 acceptor_value = simple_strtoul(param->value, &tmpptr, 0); | 1099 | u32 acceptor_value = simple_strtoul(param->value, &tmpptr, 0); |
| 1100 | u32 proposer_value = simple_strtoul(value, &tmpptr, 0); | 1100 | u32 proposer_value = simple_strtoul(value, &tmpptr, 0); |
| 1101 | 1101 | ||
| 1102 | memset(buf, 0, 10); | 1102 | memset(buf, 0, sizeof(buf)); |
| 1103 | 1103 | ||
| 1104 | if (!strcmp(param->name, MAXCONNECTIONS) || | 1104 | if (!strcmp(param->name, MAXCONNECTIONS) || |
| 1105 | !strcmp(param->name, MAXBURSTLENGTH) || | 1105 | !strcmp(param->name, MAXBURSTLENGTH) || |
| @@ -1503,8 +1503,8 @@ static int iscsi_enforce_integrity_rules( | |||
| 1503 | FirstBurstLength = simple_strtoul(param->value, | 1503 | FirstBurstLength = simple_strtoul(param->value, |
| 1504 | &tmpptr, 0); | 1504 | &tmpptr, 0); |
| 1505 | if (FirstBurstLength > MaxBurstLength) { | 1505 | if (FirstBurstLength > MaxBurstLength) { |
| 1506 | char tmpbuf[10]; | 1506 | char tmpbuf[11]; |
| 1507 | memset(tmpbuf, 0, 10); | 1507 | memset(tmpbuf, 0, sizeof(tmpbuf)); |
| 1508 | sprintf(tmpbuf, "%u", MaxBurstLength); | 1508 | sprintf(tmpbuf, "%u", MaxBurstLength); |
| 1509 | if (iscsi_update_param_value(param, tmpbuf)) | 1509 | if (iscsi_update_param_value(param, tmpbuf)) |
| 1510 | return -1; | 1510 | return -1; |
diff --git a/drivers/target/iscsi/iscsi_target_stat.c b/drivers/target/iscsi/iscsi_target_stat.c index 421d6947dc64..464b4206a51e 100644 --- a/drivers/target/iscsi/iscsi_target_stat.c +++ b/drivers/target/iscsi/iscsi_target_stat.c | |||
| @@ -410,14 +410,16 @@ static ssize_t iscsi_stat_tgt_attr_show_attr_fail_intr_addr_type( | |||
| 410 | struct iscsi_tiqn *tiqn = container_of(igrps, | 410 | struct iscsi_tiqn *tiqn = container_of(igrps, |
| 411 | struct iscsi_tiqn, tiqn_stat_grps); | 411 | struct iscsi_tiqn, tiqn_stat_grps); |
| 412 | struct iscsi_login_stats *lstat = &tiqn->login_stats; | 412 | struct iscsi_login_stats *lstat = &tiqn->login_stats; |
| 413 | unsigned char buf[8]; | 413 | int ret; |
| 414 | 414 | ||
| 415 | spin_lock(&lstat->lock); | ||
