23 Aug, 2009

40 commits

  • Change DEFINED value of can queue for FC and SAS devices.

    Signed-off-by: James Bottomley

    Kashyap, Desai
     
  • Reported-by: Rice Brown
    Signed-Off-by: Chandra Seetharaman
    Signed-off-by: James Bottomley

    Chandra Seetharaman
     
  • Universally, SCSI functions assume the lengths fed in are those of the buffer
    to DMA data to, not the lengths of the data minus the header.
    scsi_vpd_inquiry() assumed the latter and got it wrong, so fix up all the
    functions to use the correct assumption (and fix a bug where INQUIRY in SCSI-2
    dcannot go over 255).

    [jejb: Matthew posted an identical version of this at the same time I did]
    Signed-off-by: Matthew Wilcox
    Signed-off-by: James Bottomley

    James Bottomley
     
  • An IBM tape drive failed to complete a PERSISTENT RESERVE IN within the scsi
    cmd timeout. Error recovery was initiated and it sequenced from abort through
    taking the tape drive offline.

    The device was taken offline because it repeatedly responded to the TUR command
    issued by error recovery with a RESERVATION CONFLICT status. The tape drive
    was reserved to another system. This is perfectly legitimate response to TUR,
    and is one that an escalation of recovery is unlikely to clear. Further,
    escalation of recovery can have undesirable side effects on the operation of
    tape drives shared with other initiators.

    Instead of escalating recovery, error recovery should treat the RESERVATION
    CONFLICT response to the TUR as a good status, giving the issuer of the
    command the opportunity to handle the timeout and reservation conflict.

    Signed-off-by: Michael reed
    Signed-off-by: James Bottomley

    Michael Reed
     
  • In nsp_cs_config there is a wrong struct nsp_cs_configdata allocation.
    It allocates only sizeof(pointer to nsp_cs_configdata) for a whole
    structure. Add a dereference to the sizeof to allocate
    sizeof(nsp_cs_configdata).

    Signed-off-by: Jiri Slaby
    Signed-off-by: James Bottomley

    Jiri Slaby
     
  • Verify that ch->dt is not NULL before using it.

    Signed-off-by: Davidlohr Bueso
    Signed-off-by: James Bottomley

    Davidlohr Bueso A
     
  • The allocated struct is manually zeroed after allocation, so avoid using
    the (broken) kzalloc mempool (which does not re-zero previously used items
    when they are returned to the pool).

    Acked-by: Brian King
    Signed-off-by: Sage Weil
    Signed-off-by: James Bottomley

    Sage Weil
     
  • Signed-off-by: Giridhar Malavali
    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    Giridhar Malavali
     
  • When the multiqueue mode fails to work, the driver falls back on single
    queue mode. This ensures that the firmware is reinitialized with single
    queue options and all the resources are readjusted accordingly.

    Signed-off-by: Anirban Chakraborty
    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    Anirban Chakraborty
     
  • Signed-off-by: Andrew Vasquez
    Signed-off-by: Giridhar Malavali
    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    Andrew Vasquez
     
  • The interrupt handler clears the interrupt status register for response
    updates in the base queue while working in the multique mode. This could lead
    to missing interrupt for async events, mail box completions etc. as these are
    also handled in the base queue. The fix ensures that the interrupt bit is not
    cleared for response updates in the ISR when the driver is working in
    multiqueue mode.

    Signed-off-by: Anirban Chakraborty
    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    Anirban Chakraborty
     
  • Signed-off-by: Andrew Vasquez
    Signed-off-by: Giridhar Malavali
    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    Andrew Vasquez
     
  • One byte added to make the IOCB structure satisfy
    size requirements.

    Signed-off-by: Shyam Sundar
    Signed-off-by: Giridhar Malavali
    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    Shyam Sundar
     
  • Signed-off-by: Santosh Vernekar
    Signed-off-by: Giridhar Malavali
    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    Santosh Vernekar
     
  • If vports are created and topology is changed to Loop only, the
    driver continuously gets a LIP reset occurred and keeps trying to
    enable the vport. Only manage requests during F_Port.

    Signed-off-by: Lalit Chandivade
    Signed-off-by: Giridhar Malavali
    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    Lalit Chandivade
     
  • Signed-off-by: Santosh Vernekar
    Signed-off-by: Giridhar Malavali
    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    Santosh Vernekar
     
  • The RSCN processing is skipped if the event received is global and vha is not recipient.

    Signed-off-by: Santosh Vernekar
    Signed-off-by: Giridhar Malavali
    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    Santosh Vernekar
     
  • Treat a global port-unavailable PORT_UPDATE (8014h) AEN as a
    loop-down event. For this case, within the FCoE domain, the
    'logical' interface has been terminated, but the driver will
    not receive the classic LOOP_DOWN AEN.

    Signed-off-by: Andrew Vasquez
    Signed-off-by: Giridhar Malavali
    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    Andrew Vasquez
     
  • Signed-off-by: Ravi Anand
    Signed-off-by: Giridhar Malavali
    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    Ravi Anand
     
  • Use scsi_dh_set_params() set parameters provided. Save the parameters in
    parse_hw_handler() and use it in parse_path().

    Reported-by: Eddie Williams
    Signed-off-by: Chandra Seetharaman
    Tested-by: Eddie Williams
    Cc: Alasdair G Kergon
    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    Chandra Seetharaman
     
  • Handle the parameters provided by user thru multipath.

    This handler expects only 2 parameters and their value can either be 0 or 1.

    This code originates from the old dm-emc.c file. Appropriate changes have
    been made to make it work in the new design.

    Reported-by: Eddie Williams
    Signed-off-by: Chandra Seetharaman
    Tested-by: Eddie Williams
    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    Chandra Seetharaman
     
  • When we moved the device handler functionality from dm layer to SCSI layer
    we dropped the parameter functionality.

    This path adds an interface to scsi dh layer to set device handler
    parameters.

    Basically, multipath layer need to create a string with all the parameters
    and call scsi_dh_set_params() after it called scsi_dh_attach() on a
    device.

    If a device handler provides such an interface it will handle the parameters
    as it expects them.

    Reported-by: Eddie Williams
    Signed-off-by: Chandra Seetharaman
    Tested-by: Eddie Williams
    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    Chandra Seetharaman
     
  • Now that hot add works correctly, if a new device is added, we're still
    operating on stale enclosure data, so fix that by updating the enclosure
    diagnostic pages when we get notified of a device hot add

    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    James Bottomley
     
  • Right at the moment, hot removal of a device within an enclosure does
    nothing (because the intf_remove only copes with enclosure removal not
    with component removal). Fix this by adding a function to remove the
    component. Also needed to fix the prototype of
    enclosure_remove_device, since we know the device we've removed but
    not the internal component number

    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    James Bottomley
     
  • In a situation either with expanders or with multiple enclosure
    devices, hot add doesn't always work. This is because we try to find
    a single enclosure device attached to the host. Fix this by looping
    over all enclosure devices attached to the host and also by making the
    find loop recognise that the enclosure devices may be expander remote
    (i.e. not parented by the host).

    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    James Bottomley
     
  • ipr_cmd_label[] isn't big enough for an eight byte string plus terminator.
    Fix by shortening the string to seven bytes.

    Signed-off-by: Brian King
    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    Brian King
     
  • When bnx2i_adapter_ready() fails, connection handle(cid) = 0 is wrongly freed
    because 'cid' is not yet allocated for the endpoint. Fix is to initialize
    bnx2i_ep->ep_iscsi_cid to '-1' in bnx2i_alloc_ep() and not in
    bnx2i_ep_connect() to avoid releasing invalid 'cid'. There is already a check
    in bnx2i_free_iscsi_cid() not to free invalid iscsi connection handle (-1)

    Signed-off-by: Anil Veerabhadrappa
    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    Anil Veerabhadrappa
     
  • Without the fix bnx2i would fail tt->xmit_task() when link is down and
    libiscsi would have already incremented session->cmdsn before calling bnx2i's
    xmit_task() entry point and will just return the command to SCSI-ML when
    xmit_task() fails. libiscsi does not retract the session->cmdsn as the command
    was never sent on wire. It is generally good idea for LLD, bnx2i to accept
    the scsi cmnd/nopout and let upper layer timeout and go though normal session
    recovery process. When link is down, unsolicited nopout will not be accepted
    by bnx2i and connection will never enter recovery state. This fix is required
    for MPIO to work corectly

    Signed-off-by: Anil Veerabhadrappa
    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    Anil Veerabhadrappa
     
  • The phys_dev was used only to locate common offload EM instance for all
    FCoE instances on a eth devices in function fcoe_em_config, so just updated
    fcoe_em_config to look for actual real eth device in locating common offload
    EM instance and then no need to store phys_dev in fcoe_softc, so removes
    phys_dev from fcoe_softc also.

    Renames fcoe_softc real_dev to netdev and updates all its uses to use netdev.

    So effectively no functional change, use of single netdev instead phys_dev
    and real_dev saves one pointer memory in fcoe_softc, also real_dev used here
    was confusing with vlan driver terminology since real_dev in vlan driver is
    referred to physical eth device.

    Signed-off-by: Vasu Dev
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    Vasu Dev
     
  • I don't believe this check is needed any more in the current kernel, which,
    if I understand correctly, is for compound page where only the first page
    is supposed to get ref-counted.

    Signed-off-by: Yi Zou
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    Yi Zou
     
  • FC_FRAME_SG_LEN is 4 which is too small when offload is enabled. Actually, the
    WARN_ON() in fc_fcp_send_data() should be:

    WARN_ON(skb_shinfo(fp_skb(fp))->nr_frags > MAX_SKB_FRAGS);

    But since we will not get anything more than 64K anyway, so there is no need
    to do this anyway here. Therefore, I am getting rid of FC_FRAME_SG_LEN here
    and the WARN_ON here.

    Signed-off-by: Yi Zou
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    Yi Zou
     
  • Remove the extra ifdef for NETIF_F_FSO and NETIF_F_FCOE_CRC since they are
    already defined in the current kernel as in include/linux/netdevice.h.

    Signed-off-by: Yi Zou
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    Yi Zou
     
  • Updates fcoe_em_config to allocate a single instance of sharable offload
    EM for supported lp->lro_xid per eth device, and then share this EM
    for subsequently more lports creation on same eth device (e.g when using
    VLAN).

    Adds tiny fcoe_oem_match function for offload EM to return true for read
    types IO to have read IO exchanges allocated from offload shared EM.

    Removes fc_em_alloc_xid function completely which was needed to manage
    two xid ranges within a EM, this is not needed any more with allocation
    of separate sharable offload EM per eth device. Instead this patch adds
    simple xid allocation logic to manage single xid range.

    Adds fc_exch_em_alloc with mp->next_xid as cursor to allocate new xid
    from single xid range of EM, uses mp->next_xid instead removed mp->last_xid
    which slightly increase probability of finding empty xid on exch allocation.

    Removes restriction of not allowing use of xid zero along with changing
    two xid range change to single xid range.

    Makes fc_fcp_ddp_setup calling conditional to only xid allocated from
    shared offload EM.

    Signed-off-by: Vasu Dev
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    Vasu Dev
     
  • Modifies fcoe_hostlist_lock uses such that a new EM allocation in
    fcoe_em_config and adding new fcoe_softc using fcoe_hostlist_add
    are atomic, this is to ensure that a shared offload EM gets allocated
    only once per eth device for its all lports.

    Signed-off-by: Vasu Dev
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    Vasu Dev
     
  • Modifies current code to use EM anchor list in EM allocation, EM free,
    EM reset, exch allocation and exch lookup code paths.

    1. Modifies fc_exch_mgr_alloc to accept EM match function and then
    have allocated EM added to the lport using fc_exch_mgr_add API
    while also updating EM kref for newly added EM.

    2. Updates fc_exch_mgr_free API to accept only lport pointer instead
    EM and then have this API free all EMs of the lport from EM anchor
    list.

    3. Removes single lport pointer link from the EM, which was used in
    associating lport pointer in newly allocated exchange. Instead have
    lport pointer passed along new exchange allocation call path and
    then store passed lport pointer in newly allocated exchange, this
    will allow a single EM instance to be used across more than one
    lport and used in EM reset to reset only lport specific exchanges.

    4. Modifies fc_exch_mgr_reset to reset all EMs from the EM anchor list
    of the lport, adds additional exch lport pointer (ep->lp) check for
    shared EM case to reset exchange specific to a lport requested reset.

    5. Updates exch allocation API fc_exch_alloc to use EM anchor list and
    its anchor match func pointer. The fc_exch_alloc will walk the list
    of EMs until it finds a match, a match will be either null match
    func pointer or call to match function returning true value.

    6. Updates fc_exch_recv to accept incoming frame on local port using
    only lport pointer and frame pointer without specifying EM instance
    of incoming frame. Instead modified fc_exch_recv to locate EM for the
    incoming frame by matching xid of incoming frame against a EM xid range.
    This change was required to use EM list in libfc Rx path and after this
    change the lport fc_exch_mgr pointer emp is not needed anymore, so
    removed emp pointer.

    7. Updates fnic for removed lport emp pointer and above modified libfc APIs
    fc_exch_recv, fc_exch_mgr_alloc and fc_exch_mgr_free.

    8. Removes exch_get and exch_put from libfc_function_template as these
    are no longer needed with EM anchor list and its match function use.
    Also removes its default function fc_exch_get.

    A defect this patch introduced regarding the libfc initialization order in
    the fnic driver was fixed by Joe Eykholt .

    Signed-off-by: Vasu Dev
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    Vasu Dev
     
  • Currently there is a 1:1 relationship between the lport
    and exchange manager. This macro takes an EM as an argument
    and determines the lport from it. However, later patches
    will use an EM list per lport, so we will no longer have
    this 1:1 relationship- this macro must change.

    The FC_EM_DBG macro is rarely used. There are four callers,
    two can use FC_LPORT_DBG instead and two can be removed
    since they're not necessary. This patch makes those changes
    and removes the macro.

    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    Robert Love
     
  • Adds EM list using a anchor struct fc_exch_mgr_anchor, anchor is used
    to allow same EM instance sharing across more than one lport on a eth
    device, this implementation is per discussed design posted at
    http://www.open-fcoe.org/pipermail/devel/2009-June/002566.html.

    The shared EM is required for multiple lports on eth device when
    using multiple VLANs or NPIV.

    Adds fc_exch_mgr_add API to add a EM to the lport and fc_exch_mgr_del
    API to delete previously added EM.

    Also adds function fc_exch_mgr_destroy() to destroy allocated EM.
    The kref is added to the EM to keep track of EM usage count, the EM is
    destroyed when no longer in use upon kref reaching to zero.

    The caller can specify match function to fc_exch_mgr_add, this
    will be used in determining exchange allocation from its EM or not.

    Moved calling of fcoe_em_config below fcoe_libfc_config calling,
    so that list head lp->ema_list is initialized before configuring
    EM.

    Signed-off-by: Vasu Dev
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    Vasu Dev
     
  • The timer for rport retries wasn't getting canceled, and
    would occasionally go off after the module was unloaded.

    Add logic to cancel the timer in fc_rport_work().

    Since we cancel the timer before deleting the rdata,
    it is no longer necessary to do a get_device() for the pending timer.

    Signed-off-by: Joe Eykholt
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    Joe Eykholt
     
  • fc_rport_logoff drops the rport lock in order to cancel work
    that may be pending. This is undesirable as the state can
    completely change, and the caller may not expect that the
    lock could've been dropped.

    If there is work pending, it will acquire the rdata mutex and
    so we're protected and can change the event from READY to DELETE.
    Queue the work only if there is no event already pending.

    There were a couple other cases where the state was set to
    DELETE and work queued, even though the state may have already
    been DELETE. Fix these using a common function fc_rport_enter_delete().

    Signed-off-by: Joe Eykholt
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    Joe Eykholt
     
  • State RPORT_ST_NONE was intented to be an invalid state (0), never used.
    This was a misguided attempt to be sure it was always initialized.
    Having an extra state meaning nothing requires switch statements to
    have a case covering that state.

    State NONE has been used instead to mean the remote port is being deleted.
    Changing the name to RPORT_ST_DELETE.

    Signed-off-by: Joe Eykholt
    Signed-off-by: Robert Love
    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    Joe Eykholt