iscsi_ibft: Add prefix-len attr and display netmask
authorHannes Reinecke <hare@suse.de>
Thu, 25 Feb 2016 17:56:04 +0000 (09:56 -0800)
committerKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Mon, 14 Mar 2016 14:30:57 +0000 (10:30 -0400)
The iBFT table only specifies a prefix length, not a netmask.
And the netmask is pretty much pointless for IPv6.
So introduce a new attribute 'prefix-len'.

Some older user-space code might rely on the netmask attribute
being present, so we should always display it.

Changes from v1:
 - Combined two patches into one

Changes from v2:
 - Cleaned up/corrected wording for patch description

v3: [Put Hannes back as author]

Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Lee Duncan <lduncan@suse.com>
Reviewed-by: Mike Christie <michaelc@cs.wisc.edu>
Signed-off-by: Konrad Rzeszutek Wilk <konrad@kernel.org>
drivers/firmware/iscsi_ibft.c
drivers/scsi/iscsi_boot_sysfs.c
include/linux/iscsi_boot_sysfs.h

index 72791232e46ba44ff474cf7dadff5ccb433d7348..81037e5fe301ffbc48c1e7cd7ecb5c9bf26b59b5 100644 (file)
@@ -319,6 +319,9 @@ static ssize_t ibft_attr_show_nic(void *data, int type, char *buf)
                val = cpu_to_be32(~((1 << (32-nic->subnet_mask_prefix))-1));
                str += sprintf(str, "%pI4", &val);
                break;
+       case ISCSI_BOOT_ETH_PREFIX_LEN:
+               str += sprintf(str, "%d\n", nic->subnet_mask_prefix);
+               break;
        case ISCSI_BOOT_ETH_ORIGIN:
                str += sprintf(str, "%d\n", nic->origin);
                break;
@@ -460,6 +463,7 @@ static umode_t ibft_check_nic_for(void *data, int type)
                if (address_not_null(nic->ip_addr))
                        rc = S_IRUGO;
                break;
+       case ISCSI_BOOT_ETH_PREFIX_LEN:
        case ISCSI_BOOT_ETH_SUBNET_MASK:
                if (nic->subnet_mask_prefix)
                        rc = S_IRUGO;
index 680bf6f0ce767143cdaf40528333f0cf8c4d945c..8f0ea97cf31f688c6548bb627fe5067d48a9e23b 100644 (file)
@@ -166,6 +166,7 @@ static struct attribute_group iscsi_boot_target_attr_group = {
 iscsi_boot_rd_attr(eth_index, index, ISCSI_BOOT_ETH_INDEX);
 iscsi_boot_rd_attr(eth_flags, flags, ISCSI_BOOT_ETH_FLAGS);
 iscsi_boot_rd_attr(eth_ip, ip-addr, ISCSI_BOOT_ETH_IP_ADDR);
+iscsi_boot_rd_attr(eth_prefix, prefix-len, ISCSI_BOOT_ETH_PREFIX_LEN);
 iscsi_boot_rd_attr(eth_subnet, subnet-mask, ISCSI_BOOT_ETH_SUBNET_MASK);
 iscsi_boot_rd_attr(eth_origin, origin, ISCSI_BOOT_ETH_ORIGIN);
 iscsi_boot_rd_attr(eth_gateway, gateway, ISCSI_BOOT_ETH_GATEWAY);
@@ -181,6 +182,7 @@ static struct attribute *ethernet_attrs[] = {
        &iscsi_boot_attr_eth_index.attr,
        &iscsi_boot_attr_eth_flags.attr,
        &iscsi_boot_attr_eth_ip.attr,
+       &iscsi_boot_attr_eth_prefix.attr,
        &iscsi_boot_attr_eth_subnet.attr,
        &iscsi_boot_attr_eth_origin.attr,
        &iscsi_boot_attr_eth_gateway.attr,
@@ -208,6 +210,9 @@ static umode_t iscsi_boot_eth_attr_is_visible(struct kobject *kobj,
        else if (attr ==  &iscsi_boot_attr_eth_ip.attr)
                return boot_kobj->is_visible(boot_kobj->data,
                                             ISCSI_BOOT_ETH_IP_ADDR);
+       else if (attr ==  &iscsi_boot_attr_eth_prefix.attr)
+               return boot_kobj->is_visible(boot_kobj->data,
+                                            ISCSI_BOOT_ETH_PREFIX_LEN);
        else if (attr ==  &iscsi_boot_attr_eth_subnet.attr)
                return boot_kobj->is_visible(boot_kobj->data,
                                             ISCSI_BOOT_ETH_SUBNET_MASK);
index 2a8b1659bf3579aa41a36483fd1b8350eb7ca545..548d5539548886994f38ac77e427f5623794dd08 100644 (file)
@@ -23,6 +23,7 @@ enum iscsi_boot_eth_properties_enum {
        ISCSI_BOOT_ETH_INDEX,
        ISCSI_BOOT_ETH_FLAGS,
        ISCSI_BOOT_ETH_IP_ADDR,
+       ISCSI_BOOT_ETH_PREFIX_LEN,
        ISCSI_BOOT_ETH_SUBNET_MASK,
        ISCSI_BOOT_ETH_ORIGIN,
        ISCSI_BOOT_ETH_GATEWAY,