diff options
author | Andy Grover <agrover@redhat.com> | 2015-08-24 13:26:03 -0400 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2015-08-27 02:27:09 -0400 |
commit | 76c28f1fcfeb42b47f798fe498351ee1d60086ae (patch) | |
tree | 14e0a895f308f1bbf90075b080948e942320647c /drivers/target/iscsi/iscsi_target.c | |
parent | 109e2381749c1cfd94a0d22b2b54142539024973 (diff) |
target/iscsi: Fix np_ip bracket issue by removing np_ip
Revert commit 1997e6259, which causes double brackets on ipv6
inaddr_any addresses.
Since we have np_sockaddr, if we need a textual representation we can
use "%pISc".
Change iscsit_add_network_portal() and iscsit_add_np() signatures to remove
*ip_str parameter.
Fix and extend some comments earlier in the function.
Tested to work for :: and ::1 via iscsiadm, previously :: failed, see
https://bugzilla.redhat.com/show_bug.cgi?id=1249107 .
CC: stable@vger.kernel.org
Signed-off-by: Andy Grover <agrover@redhat.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target/iscsi/iscsi_target.c')
-rw-r--r-- | drivers/target/iscsi/iscsi_target.c | 33 |
1 files changed, 16 insertions, 17 deletions
diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c index e55f49c7c847..d75eeb5ce13a 100644 --- a/drivers/target/iscsi/iscsi_target.c +++ b/drivers/target/iscsi/iscsi_target.c | |||
@@ -341,7 +341,6 @@ static struct iscsi_np *iscsit_get_np( | |||
341 | 341 | ||
342 | struct iscsi_np *iscsit_add_np( | 342 | struct iscsi_np *iscsit_add_np( |
343 | struct __kernel_sockaddr_storage *sockaddr, | 343 | struct __kernel_sockaddr_storage *sockaddr, |
344 | char *ip_str, | ||
345 | int network_transport) | 344 | int network_transport) |
346 | { | 345 | { |
347 | struct sockaddr_in *sock_in; | 346 | struct sockaddr_in *sock_in; |
@@ -370,11 +369,9 @@ struct iscsi_np *iscsit_add_np( | |||
370 | np->np_flags |= NPF_IP_NETWORK; | 369 | np->np_flags |= NPF_IP_NETWORK; |
371 | if (sockaddr->ss_family == AF_INET6) { | 370 | if (sockaddr->ss_family == AF_INET6) { |
372 | sock_in6 = (struct sockaddr_in6 *)sockaddr; | 371 | sock_in6 = (struct sockaddr_in6 *)sockaddr; |
373 | snprintf(np->np_ip, IPV6_ADDRESS_SPACE, "%s", ip_str); | ||
374 | np->np_port = ntohs(sock_in6->sin6_port); | 372 | np->np_port = ntohs(sock_in6->sin6_port); |
375 | } else { | 373 | } else { |
376 | sock_in = (struct sockaddr_in *)sockaddr; | 374 | sock_in = (struct sockaddr_in *)sockaddr; |
377 | sprintf(np->np_ip, "%s", ip_str); | ||
378 | np->np_port = ntohs(sock_in->sin_port); | 375 | np->np_port = ntohs(sock_in->sin_port); |
379 | } | 376 | } |
380 | 377 | ||
@@ -411,8 +408,8 @@ struct iscsi_np *iscsit_add_np( | |||
411 | list_add_tail(&np->np_list, &g_np_list); | 408 | list_add_tail(&np->np_list, &g_np_list); |
412 | mutex_unlock(&np_lock); | 409 | mutex_unlock(&np_lock); |
413 | 410 | ||
414 | pr_debug("CORE[0] - Added Network Portal: %s:%hu on %s\n", | 411 | pr_debug("CORE[0] - Added Network Portal: %pISc:%hu on %s\n", |
415 | np->np_ip, np->np_port, np->np_transport->name); | 412 | &np->np_sockaddr, np->np_port, np->np_transport->name); |
416 | 413 | ||
417 | return np; | 414 | return np; |
418 | } | 415 | } |
@@ -481,8 +478,8 @@ int iscsit_del_np(struct iscsi_np *np) | |||
481 | list_del(&np->np_list); | 478 | list_del(&np->np_list); |
482 | mutex_unlock(&np_lock); | 479 | mutex_unlock(&np_lock); |
483 | 480 | ||
484 | pr_debug("CORE[0] - Removed Network Portal: %s:%hu on %s\n", | 481 | pr_debug("CORE[0] - Removed Network Portal: %pISc:%hu on %s\n", |
485 | np->np_ip, np->np_port, np->np_transport->name); | 482 | &np->np_sockaddr, np->np_port, np->np_transport->name); |
486 | 483 | ||
487 | iscsit_put_transport(np->np_transport); | 484 | iscsit_put_transport(np->np_transport); |
488 | kfree(np); | 485 | kfree(np); |
@@ -3463,7 +3460,6 @@ iscsit_build_sendtargets_response(struct iscsi_cmd *cmd, | |||
3463 | tpg_np_list) { | 3460 | tpg_np_list) { |
3464 | struct iscsi_np *np = tpg_np->tpg_np; | 3461 | struct iscsi_np *np = tpg_np->tpg_np; |
3465 | bool inaddr_any = iscsit_check_inaddr_any(np); | 3462 | bool inaddr_any = iscsit_check_inaddr_any(np); |
3466 | char *fmt_str; | ||
3467 | 3463 | ||
3468 | if (np->np_network_transport != network_transport) | 3464 | if (np->np_network_transport != network_transport) |
3469 | continue; | 3465 | continue; |
@@ -3491,15 +3487,18 @@ iscsit_build_sendtargets_response(struct iscsi_cmd *cmd, | |||
3491 | } | 3487 | } |
3492 | } | 3488 | } |
3493 | 3489 | ||
3494 | if (np->np_sockaddr.ss_family == AF_INET6) | 3490 | if (inaddr_any) { |
3495 | fmt_str = "TargetAddress=[%s]:%hu,%hu"; | 3491 | len = sprintf(buf, "TargetAddress=" |
3496 | else | 3492 | "%s:%hu,%hu", |
3497 | fmt_str = "TargetAddress=%s:%hu,%hu"; | 3493 | conn->local_ip, |
3498 | 3494 | np->np_port, | |
3499 | len = sprintf(buf, fmt_str, | 3495 | tpg->tpgt); |
3500 | inaddr_any ? conn->local_ip : np->np_ip, | 3496 | } else { |
3501 | np->np_port, | 3497 | len = sprintf(buf, "TargetAddress=" |
3502 | tpg->tpgt); | 3498 | "%pISpc,%hu", |
3499 | &np->np_sockaddr, | ||
3500 | tpg->tpgt); | ||
3501 | } | ||
3503 | len += 1; | 3502 | len += 1; |
3504 | 3503 | ||
3505 | if ((len + payload_len) > buffer_len) { | 3504 | if ((len + payload_len) > buffer_len) { |