lkml.org 
[lkml]   [2021]   [Jul]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 39/60] scsi: iscsi: Fix iface sysfs attr detection
    Date
    From: Mike Christie <michael.christie@oracle.com>

    [ Upstream commit e746f3451ec7f91dcc9fd67a631239c715850a34 ]

    A ISCSI_IFACE_PARAM can have the same value as a ISCSI_NET_PARAM so when
    iscsi_iface_attr_is_visible tries to figure out the type by just checking
    the value, we can collide and return the wrong type. When we call into the
    driver we might not match and return that we don't want attr visible in
    sysfs. The patch fixes this by setting the type when we figure out what the
    param is.

    Link: https://lore.kernel.org/r/20210701002559.89533-1-michael.christie@oracle.com
    Fixes: 3e0f65b34cc9 ("[SCSI] iscsi_transport: Additional parameters for network settings")
    Signed-off-by: Mike Christie <michael.christie@oracle.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/scsi/scsi_transport_iscsi.c | 90 +++++++++++------------------
    1 file changed, 34 insertions(+), 56 deletions(-)

    diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c
    index 337aad0660fa..8d10b35caed5 100644
    --- a/drivers/scsi/scsi_transport_iscsi.c
    +++ b/drivers/scsi/scsi_transport_iscsi.c
    @@ -427,39 +427,10 @@ static umode_t iscsi_iface_attr_is_visible(struct kobject *kobj,
    struct device *dev = container_of(kobj, struct device, kobj);
    struct iscsi_iface *iface = iscsi_dev_to_iface(dev);
    struct iscsi_transport *t = iface->transport;
    - int param;
    - int param_type;
    + int param = -1;

    if (attr == &dev_attr_iface_enabled.attr)
    param = ISCSI_NET_PARAM_IFACE_ENABLE;
    - else if (attr == &dev_attr_iface_vlan_id.attr)
    - param = ISCSI_NET_PARAM_VLAN_ID;
    - else if (attr == &dev_attr_iface_vlan_priority.attr)
    - param = ISCSI_NET_PARAM_VLAN_PRIORITY;
    - else if (attr == &dev_attr_iface_vlan_enabled.attr)
    - param = ISCSI_NET_PARAM_VLAN_ENABLED;
    - else if (attr == &dev_attr_iface_mtu.attr)
    - param = ISCSI_NET_PARAM_MTU;
    - else if (attr == &dev_attr_iface_port.attr)
    - param = ISCSI_NET_PARAM_PORT;
    - else if (attr == &dev_attr_iface_ipaddress_state.attr)
    - param = ISCSI_NET_PARAM_IPADDR_STATE;
    - else if (attr == &dev_attr_iface_delayed_ack_en.attr)
    - param = ISCSI_NET_PARAM_DELAYED_ACK_EN;
    - else if (attr == &dev_attr_iface_tcp_nagle_disable.attr)
    - param = ISCSI_NET_PARAM_TCP_NAGLE_DISABLE;
    - else if (attr == &dev_attr_iface_tcp_wsf_disable.attr)
    - param = ISCSI_NET_PARAM_TCP_WSF_DISABLE;
    - else if (attr == &dev_attr_iface_tcp_wsf.attr)
    - param = ISCSI_NET_PARAM_TCP_WSF;
    - else if (attr == &dev_attr_iface_tcp_timer_scale.attr)
    - param = ISCSI_NET_PARAM_TCP_TIMER_SCALE;
    - else if (attr == &dev_attr_iface_tcp_timestamp_en.attr)
    - param = ISCSI_NET_PARAM_TCP_TIMESTAMP_EN;
    - else if (attr == &dev_attr_iface_cache_id.attr)
    - param = ISCSI_NET_PARAM_CACHE_ID;
    - else if (attr == &dev_attr_iface_redirect_en.attr)
    - param = ISCSI_NET_PARAM_REDIRECT_EN;
    else if (attr == &dev_attr_iface_def_taskmgmt_tmo.attr)
    param = ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO;
    else if (attr == &dev_attr_iface_header_digest.attr)
    @@ -496,6 +467,38 @@ static umode_t iscsi_iface_attr_is_visible(struct kobject *kobj,
    param = ISCSI_IFACE_PARAM_STRICT_LOGIN_COMP_EN;
    else if (attr == &dev_attr_iface_initiator_name.attr)
    param = ISCSI_IFACE_PARAM_INITIATOR_NAME;
    +
    + if (param != -1)
    + return t->attr_is_visible(ISCSI_IFACE_PARAM, param);
    +
    + if (attr == &dev_attr_iface_vlan_id.attr)
    + param = ISCSI_NET_PARAM_VLAN_ID;
    + else if (attr == &dev_attr_iface_vlan_priority.attr)
    + param = ISCSI_NET_PARAM_VLAN_PRIORITY;
    + else if (attr == &dev_attr_iface_vlan_enabled.attr)
    + param = ISCSI_NET_PARAM_VLAN_ENABLED;
    + else if (attr == &dev_attr_iface_mtu.attr)
    + param = ISCSI_NET_PARAM_MTU;
    + else if (attr == &dev_attr_iface_port.attr)
    + param = ISCSI_NET_PARAM_PORT;
    + else if (attr == &dev_attr_iface_ipaddress_state.attr)
    + param = ISCSI_NET_PARAM_IPADDR_STATE;
    + else if (attr == &dev_attr_iface_delayed_ack_en.attr)
    + param = ISCSI_NET_PARAM_DELAYED_ACK_EN;
    + else if (attr == &dev_attr_iface_tcp_nagle_disable.attr)
    + param = ISCSI_NET_PARAM_TCP_NAGLE_DISABLE;
    + else if (attr == &dev_attr_iface_tcp_wsf_disable.attr)
    + param = ISCSI_NET_PARAM_TCP_WSF_DISABLE;
    + else if (attr == &dev_attr_iface_tcp_wsf.attr)
    + param = ISCSI_NET_PARAM_TCP_WSF;
    + else if (attr == &dev_attr_iface_tcp_timer_scale.attr)
    + param = ISCSI_NET_PARAM_TCP_TIMER_SCALE;
    + else if (attr == &dev_attr_iface_tcp_timestamp_en.attr)
    + param = ISCSI_NET_PARAM_TCP_TIMESTAMP_EN;
    + else if (attr == &dev_attr_iface_cache_id.attr)
    + param = ISCSI_NET_PARAM_CACHE_ID;
    + else if (attr == &dev_attr_iface_redirect_en.attr)
    + param = ISCSI_NET_PARAM_REDIRECT_EN;
    else if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4) {
    if (attr == &dev_attr_ipv4_iface_ipaddress.attr)
    param = ISCSI_NET_PARAM_IPV4_ADDR;
    @@ -586,32 +589,7 @@ static umode_t iscsi_iface_attr_is_visible(struct kobject *kobj,
    return 0;
    }

    - switch (param) {
    - case ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO:
    - case ISCSI_IFACE_PARAM_HDRDGST_EN:
    - case ISCSI_IFACE_PARAM_DATADGST_EN:
    - case ISCSI_IFACE_PARAM_IMM_DATA_EN:
    - case ISCSI_IFACE_PARAM_INITIAL_R2T_EN:
    - case ISCSI_IFACE_PARAM_DATASEQ_INORDER_EN:
    - case ISCSI_IFACE_PARAM_PDU_INORDER_EN:
    - case ISCSI_IFACE_PARAM_ERL:
    - case ISCSI_IFACE_PARAM_MAX_RECV_DLENGTH:
    - case ISCSI_IFACE_PARAM_FIRST_BURST:
    - case ISCSI_IFACE_PARAM_MAX_R2T:
    - case ISCSI_IFACE_PARAM_MAX_BURST:
    - case ISCSI_IFACE_PARAM_CHAP_AUTH_EN:
    - case ISCSI_IFACE_PARAM_BIDI_CHAP_EN:
    - case ISCSI_IFACE_PARAM_DISCOVERY_AUTH_OPTIONAL:
    - case ISCSI_IFACE_PARAM_DISCOVERY_LOGOUT_EN:
    - case ISCSI_IFACE_PARAM_STRICT_LOGIN_COMP_EN:
    - case ISCSI_IFACE_PARAM_INITIATOR_NAME:
    - param_type = ISCSI_IFACE_PARAM;
    - break;
    - default:
    - param_type = ISCSI_NET_PARAM;
    - }
    -
    - return t->attr_is_visible(param_type, param);
    + return t->attr_is_visible(ISCSI_NET_PARAM, param);
    }

    static struct attribute *iscsi_iface_attrs[] = {
    --
    2.30.2


    \
     
     \ /
      Last update: 2021-07-26 17:45    [W:4.045 / U:0.272 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site