[PATCH rfc 4/4] iscsi-target: use generic inet_pton_with_scope

Nicholas A. Bellinger nab at linux-iscsi.org
Sat Feb 18 21:54:02 PST 2017


On Thu, 2017-02-16 at 19:43 +0200, Sagi Grimberg wrote:
> Signed-off-by: Sagi Grimberg <sagi at grimberg.me>
> ---
>  drivers/target/iscsi/iscsi_target_configfs.c | 46 ++++++++--------------------
>  1 file changed, 12 insertions(+), 34 deletions(-)
> 
> diff --git a/drivers/target/iscsi/iscsi_target_configfs.c b/drivers/target/iscsi/iscsi_target_configfs.c
> index bf40f03755dd..f30c27b83c5e 100644
> --- a/drivers/target/iscsi/iscsi_target_configfs.c
> +++ b/drivers/target/iscsi/iscsi_target_configfs.c
> @@ -167,10 +167,7 @@ static struct se_tpg_np *lio_target_call_addnptotpg(
>  	struct iscsi_portal_group *tpg;
>  	struct iscsi_tpg_np *tpg_np;
>  	char *str, *str2, *ip_str, *port_str;
> -	struct sockaddr_storage sockaddr;
> -	struct sockaddr_in *sock_in;
> -	struct sockaddr_in6 *sock_in6;
> -	unsigned long port;
> +	struct sockaddr_storage sockaddr = { };
>  	int ret;
>  	char buf[MAX_PORTAL_LEN + 1];
>  
> @@ -182,21 +179,19 @@ static struct se_tpg_np *lio_target_call_addnptotpg(
>  	memset(buf, 0, MAX_PORTAL_LEN + 1);
>  	snprintf(buf, MAX_PORTAL_LEN + 1, "%s", name);
>  
> -	memset(&sockaddr, 0, sizeof(struct sockaddr_storage));
> -
>  	str = strstr(buf, "[");
>  	if (str) {
> -		const char *end;
> -
>  		str2 = strstr(str, "]");
>  		if (!str2) {
>  			pr_err("Unable to locate trailing \"]\""
>  				" in IPv6 iSCSI network portal address\n");
>  			return ERR_PTR(-EINVAL);
>  		}
> -		str++; /* Skip over leading "[" */
> +
> +		ip_str = str + 1; /* Skip over leading "[" */
>  		*str2 = '\0'; /* Terminate the unbracketed IPv6 address */
>  		str2++; /* Skip over the \0 */
> +
>  		port_str = strstr(str2, ":");
>  		if (!port_str) {
>  			pr_err("Unable to locate \":port\""
> @@ -205,23 +200,8 @@ static struct se_tpg_np *lio_target_call_addnptotpg(
>  		}
>  		*port_str = '\0'; /* Terminate string for IP */
>  		port_str++; /* Skip over ":" */
> -
> -		ret = kstrtoul(port_str, 0, &port);
> -		if (ret < 0) {
> -			pr_err("kstrtoul() failed for port_str: %d\n", ret);
> -			return ERR_PTR(ret);
> -		}
> -		sock_in6 = (struct sockaddr_in6 *)&sockaddr;
> -		sock_in6->sin6_family = AF_INET6;
> -		sock_in6->sin6_port = htons((unsigned short)port);
> -		ret = in6_pton(str, -1,
> -				(void *)&sock_in6->sin6_addr.in6_u, -1, &end);
> -		if (ret <= 0) {
> -			pr_err("in6_pton returned: %d\n", ret);
> -			return ERR_PTR(-EINVAL);
> -		}
>  	} else {
> -		str = ip_str = &buf[0];
> +		ip_str = &buf[0];
>  		port_str = strstr(ip_str, ":");
>  		if (!port_str) {
>  			pr_err("Unable to locate \":port\""
> @@ -230,17 +210,15 @@ static struct se_tpg_np *lio_target_call_addnptotpg(
>  		}
>  		*port_str = '\0'; /* Terminate string for IP */
>  		port_str++; /* Skip over ":" */
> +	}
>  
> -		ret = kstrtoul(port_str, 0, &port);
> -		if (ret < 0) {
> -			pr_err("kstrtoul() failed for port_str: %d\n", ret);
> -			return ERR_PTR(ret);
> -		}
> -		sock_in = (struct sockaddr_in *)&sockaddr;
> -		sock_in->sin_family = AF_INET;
> -		sock_in->sin_port = htons((unsigned short)port);
> -		sock_in->sin_addr.s_addr = in_aton(ip_str);
> +	ret = inet_pton_with_scope(&init_net, AF_UNSPEC, ip_str,
> +			port_str, &sockaddr);
> +	if (ret) {
> +		pr_err("malformed ip/port passed: %s\n", name);
> +		return ERR_PTR(ret);
>  	}
> +
>  	tpg = container_of(se_tpg, struct iscsi_portal_group, tpg_se_tpg);
>  	ret = iscsit_get_tpg(tpg);
>  	if (ret < 0)

A nice cleanup.

Acked-by: Nicholas Bellinger <nab at linux-iscsi.org>




More information about the Linux-nvme mailing list