• N
    fcoe: close race on link speed detection in fcoe code · f9184df3
    Neil Horman 提交于
    When creating an fcoe interfce, we call fcoe_link_speed_update before we add the
    lports fcoe interface to the fc_hostlist.  Since network device events like
    NETDEV_CHANGE are only processed if an fcoe interface is found with an
    underlying netdev that matches the netdev of the event.  Since this processing
    in fcoe_device_notification is how link_speed changes get communicated to the
    libfc  code (via fcoe_link_speed_update), we have a race condition - if a
    NETDEV_CHANGE event is sent after the call to fcoe_link_speed_update in
    fcoe_netdev_config, but before we add the interface to the fc_hostlist, we will
    loose the event and attributes like /sys/class/fc_host/hostX/speed will not get
    updated properly.
    
    Fix this by moving the add to the fc_hostlist above the serialized call to
    fcoe_netdev_config, ensuring that we catch netdev envents before we make a
    direct call to fcoe_link_speed_update.
    
    Also use this opportunity to clean up access to the fc_hostlist a bit by
    creating a fcoe_hostlist_del accessor and replacing the cleanup in fcoe_exit to
    use it properly.
    
    Tested by myself successfully
    
    [ Comment over 80 chars broken into multi-line by Robert Love to
      satisfy checkpatch.pl ]
    Signed-off-by: NNeil Horman <nhorman@tuxdriver.com>
    Reviewed-by: NYi Zou <yi.zou@intel.com>
    Signed-off-by: NRobert Love <robert.w.love@intel.com>
    f9184df3
fcoe.c 76.1 KB