• Robert Love's avatar
    [SCSI] fcoe: Do not switch context in vport_delete callback · ccefd23e
    Robert Love authored
    Currently all port deletion is routed though the FCoE
    workqueue (fcoe_wq). When fc_remove_host is called on
    an N_Port (for example, from fcoe_destroy) the vports
    are queued into a FC Transport workqueue. fc_remove_host
    flushes that queue and each vport is passed to fcoe's
    fcoe_vport_destroy, which simply queues the associated
    fcoe_ports for later deletion. This queue cannot be
    flushed within the N_Ports destroy path because of
    circular locking issues. The result is that the NPIV
    ports are destroyed after the N_Port, which is reverse
    of how they are created.
    
    This quirk causes fcoe to keep references on the
    fcoe_interface shared by each of these ports (N_Port
    and NPIV). Changing the ordering such that NPIV ports
    are destroyed before the N_Port will allow us to remove
    reference counting on the fcoe_interface instances.
    
    This patch simply allows fcoe_vport_destory to destroy
    NPIV ports without deferring them to a workqueue context.
    This ensures that when fc_remove_host is called the
    NPIV ports will be destroyed first before the N_Port and
    allows reference counting on the fcoe's fcoe_interface
    to be remove in a later patch.
    Signed-off-by: default avatarRobert Love <robert.w.love@intel.com>
    Tested-by: default avatarRoss Brattain <ross.b.brattain@intel.com>
    Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
    ccefd23e
fcoe.c 72.4 KB