You need to sign in or sign up before continuing.
  1. 12 11月, 2014 2 次提交
  2. 25 7月, 2014 1 次提交
  3. 18 7月, 2014 1 次提交
  4. 16 3月, 2014 1 次提交
  5. 05 6月, 2013 1 次提交
    • J
      [SCSI] libsas: implement > 16 byte CDB support · e73823f7
      James Bottomley 提交于
      Remove the arbitrary expectation in libsas that all SCSI commands are 16 bytes
      or less.  Instead do all copies via cmd->cmd_len (and use a pointer to this in
      the libsas task instead of a copy).  Note that this still doesn't enable > 16
      byte CDB support in the underlying drivers because their internal format has
      to be fixed and the wire format of > 16 byte CDBs according to the SAS spec is
      different.  the libsas drivers (isci, aic94xx, mvsas and pm8xxx are all
      updated for this change.
      
      Cc: Lukasz Dorau <lukasz.dorau@intel.com>
      Cc: Maciej Patelczyk <maciej.patelczyk@intel.com>
      Cc: Dave Jiang <dave.jiang@intel.com>
      Cc: Jack Wang <xjtuwjp@gmail.com>
      Cc: Lindar Liu <lindar_liu@usish.com>
      Cc: Xiangliang Yu <yuxiangl@marvell.com>
      Signed-off-by: NJames Bottomley <JBottomley@Parallels.com>
      e73823f7
  6. 20 7月, 2012 6 次提交
  7. 01 3月, 2012 7 次提交
    • D
      [SCSI] libsas: don't recover end devices attached to disabled phys · 26a2e68f
      Dan Williams 提交于
      If userspace has decided to disable a phy the kernel should honor that
      and not inadvertantly re-enable the phy via error recovery.  This is
      more straightforward in the sata case where link recovery (via
      libata-eh) is separate from sas_task cancelling in libsas-eh.  Teach
      libsas to accept -ENODEV as a successful response from I_T_nexus_reset
      ('successful' in terms of not escalating further).
      
      This is a more comprehensive fix then "libsas: don't recover 'gone'
      devices in sas_ata_hard_reset()", as it is no longer sata-specific.
      
      aic94xx does check the return value from sas_phy_reset() so if the phy
      is disabled we proceed with clearing the I_T_nexus.
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      Signed-off-by: NJames Bottomley <JBottomley@Parallels.com>
      26a2e68f
    • D
      [SCSI] libsas: fix lifetime of SAS_HA_FROZEN · 84023474
      Dan Williams 提交于
      Until all sas_tasks are known to no longer be in-flight this flag gates late
      completions from colliding with error handling.  However, it must be cleared
      prior to the submission of scsi_send_eh_cmnd() requests, otherwise those
      commands will never be completed correctly.
      
      This was spotted by slub debug:
       =============================================================================
       BUG sas_task: Objects remaining on kmem_cache_close()
       -----------------------------------------------------------------------------
      
       INFO: Slab 0xffffea001f0eba00 objects=34 used=1 fp=0xffff8807c3aecb00 flags=0x8000000000004080
       Pid: 22919, comm: modprobe Not tainted 3.2.0-isci+ #2
       Call Trace:
        [<ffffffff810fcdcd>] slab_err+0xb0/0xd2
        [<ffffffff810e1c50>] ? free_percpu+0x31/0x117
        [<ffffffff81100122>] ? kzalloc+0x14/0x16
        [<ffffffff81100122>] ? kzalloc+0x14/0x16
        [<ffffffff81100486>] kmem_cache_destroy+0x11d/0x270
        [<ffffffffa0112bdc>] sas_class_exit+0x10/0x12 [libsas]
        [<ffffffff81078fba>] sys_delete_module+0x1c4/0x23c
        [<ffffffff814797ba>] ? sysret_check+0x2e/0x69
        [<ffffffff8126479e>] ? trace_hardirqs_on_thunk+0x3a/0x3f
        [<ffffffff81479782>] system_call_fastpath+0x16/0x1b
       INFO: Object 0xffff8807c3aed280 @offset=21120
       INFO: Allocated in sas_alloc_task+0x22/0x90 [libsas] age=4615311 cpu=2 pid=12966
        __slab_alloc.clone.3+0x1d1/0x234
        kmem_cache_alloc+0x52/0x10d
        sas_alloc_task+0x22/0x90 [libsas]
        sas_queuecommand+0x20e/0x230 [libsas]
        scsi_send_eh_cmnd+0xd1/0x30c
        scsi_eh_try_stu+0x4f/0x6b
        scsi_eh_ready_devs+0xba/0x6ef
        sas_scsi_recover_host+0xa35/0xab1 [libsas]
        scsi_error_handler+0x14b/0x5fa
        kthread+0x9d/0xa5
        kernel_thread_helper+0x4/0x10
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      Signed-off-by: NJames Bottomley <JBottomley@Parallels.com>
      84023474
    • D
      [SCSI] libsas: async ata scanning · 9508a66f
      Dan Williams 提交于
      libsas ata error handling is already async but this does not help the
      scan case.  Move initial link recovery out from under host->scan_mutex,
      and delay synchronization with eh until after all port probe/recovery
      work has been queued.
      
      Device ordering is maintained with scan order by still calling
      sas_rphy_add() in order of domain discovery.
      
      Since we now scan the domain list when invoking libata-eh we need to be
      careful to check for fully initialized ata ports.
      Acked-by: NJack Wang <jack_wang@usish.com>
      Acked-by: NJeff Garzik <jgarzik@redhat.com>
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      Signed-off-by: NJames Bottomley <JBottomley@Parallels.com>
      9508a66f
    • D
      [SCSI] libsas: fix mixed topology recovery · d230ce69
      Dan Williams 提交于
      If we have a domain with sas and sata devices there may still be sas
      recovery actions to take after peeling off the commands to send to
      libata.
      Reported-by: NAndrzej Jakowski <andrzej.jakowski@intel.com>
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      Signed-off-by: NJames Bottomley <JBottomley@Parallels.com>
      d230ce69
    • D
      [SCSI] libsas: close scsi_remove_target() vs libata-eh race · 8abda4d2
      Dan Williams 提交于
      ata_port lifetime in libata follows the host.  In libsas it follows the
      scsi_target.  Once scsi_remove_device() has caused all commands to be
      completed it allows scsi_remove_target() to immediately proceed to
      freeing the ata_port causing bug reports like:
      
      [  848.393333] BUG: spinlock bad magic on CPU#4, kworker/u:2/5107
      [  848.400262] general protection fault: 0000 [#1] SMP
      [  848.406244] CPU 4
      [  848.408310] Modules linked in: nls_utf8 ipv6 uinput i2c_i801 i2c_core iTCO_wdt iTCO_vendor_support ioatdma dca sg sd_mod sr_mod cdrom ahci libahci isci libsas libata scsi_transport_sas [last unloaded: scsi_wait_scan]
      [  848.432060]
      [  848.434137] Pid: 5107, comm: kworker/u:2 Not tainted 3.2.0-isci+ #8 Intel Corporation S2600CP/S2600CP
      [  848.445310] RIP: 0010:[<ffffffff8126a68c>]  [<ffffffff8126a68c>] spin_dump+0x5e/0x8c
      [  848.454787] RSP: 0018:ffff8807f868dca0  EFLAGS: 00010002
      [  848.461137] RAX: 0000000000000048 RBX: ffff8807fe86a630 RCX: ffffffff817d0be0
      [  848.469520] RDX: 0000000000000000 RSI: ffffffff814af1cf RDI: 0000000000000002
      [  848.477959] RBP: ffff8807f868dcb0 R08: 00000000ffffffff R09: 000000006b6b6b6b
      [  848.486327] R10: 000000000003fb8c R11: ffffffff81a19448 R12: 6b6b6b6b6b6b6b6b
      [  848.494699] R13: ffff8808027dc520 R14: 0000000000000000 R15: 000000000000001e
      [  848.503067] FS:  0000000000000000(0000) GS:ffff88083fd00000(0000) knlGS:0000000000000000
      [  848.512899] CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
      [  848.519710] CR2: 00007ff77d001000 CR3: 00000007f7a5d000 CR4: 00000000000406e0
      [  848.528072] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
      [  848.536446] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
      [  848.544831] Process kworker/u:2 (pid: 5107, threadinfo ffff8807f868c000, task ffff8807ff348000)
      [  848.555327] Stack:
      [  848.557959]  ffff8807fe86a630 ffff8807fe86a630 ffff8807f868dcd0 ffffffff8126a6e0
      [  848.567072]  ffffffff817c142f ffff8807fe86a630 ffff8807f868dcf0 ffffffff8126a703
      [  848.576190]  ffff8808027dc520 0000000000000286 ffff8807f868dd10 ffffffff814af1bb
      [  848.585281] Call Trace:
      [  848.588409]  [<ffffffff8126a6e0>] spin_bug+0x26/0x28
      [  848.594357]  [<ffffffff8126a703>] do_raw_spin_unlock+0x21/0x88
      [  848.601283]  [<ffffffff814af1bb>] _raw_spin_unlock_irqrestore+0x2c/0x65
      [  848.609089]  [<ffffffffa001c103>] ata_scsi_port_error_handler+0x548/0x557 [libata]
      [  848.618331]  [<ffffffff81061813>] ? async_schedule+0x17/0x17
      [  848.625060]  [<ffffffffa004f30f>] async_sas_ata_eh+0x45/0x69 [libsas]
      [  848.632655]  [<ffffffff810618aa>] async_run_entry_fn+0x97/0x125
      [  848.639670]  [<ffffffff81057439>] process_one_work+0x207/0x38d
      [  848.646577]  [<ffffffff8105738c>] ? process_one_work+0x15a/0x38d
      [  848.653681]  [<ffffffff810576f7>] worker_thread+0x138/0x21c
      [  848.660305]  [<ffffffff810575bf>] ? process_one_work+0x38d/0x38d
      [  848.667493]  [<ffffffff8105b098>] kthread+0x9d/0xa5
      [  848.673382]  [<ffffffff8106e1bd>] ? trace_hardirqs_on_caller+0x12f/0x166
      [  848.681304]  [<ffffffff814b7704>] kernel_thread_helper+0x4/0x10
      [  848.688324]  [<ffffffff814af534>] ? retint_restore_args+0x13/0x13
      [  848.695530]  [<ffffffff8105affb>] ? __init_kthread_worker+0x5b/0x5b
      [  848.702929]  [<ffffffff814b7700>] ? gs_change+0x13/0x13
      [  848.709155] Code: 00 00 48 8d 88 38 04 00 00 44 8b 80 84 02 00 00 31 c0 e8 cf 1b 24 00 41 83 c8 ff 44 8b 4b 08 48 c7 c1 e0 0b 7d 81 4d 85 e4 74 10 <45> 8b 84 24 84 02 00 00 49 8d 8c 24 38 04 00 00 8b 53 04 48 89
      [  848.732467] RIP  [<ffffffff8126a68c>] spin_dump+0x5e/0x8c
      [  848.738905]  RSP <ffff8807f868dca0>
      [  848.743743] ---[ end trace 143161646eee8caa ]---
      
      ...so arrange for the ata_port to have the same end of life as the domain
      device.
      Reported-by: NMarcin Tomczak <marcin.tomczak@intel.com>
      Acked-by: NJeff Garzik <jgarzik@redhat.com>
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      Signed-off-by: NJames Bottomley <JBottomley@Parallels.com>
      8abda4d2
    • D
      [SCSI] libsas: pre-clean commands that won the eh vs completion race · 45c73b65
      Dan Williams 提交于
      When scrolling forward through the eh list (in a clear_q scenario) it is
      possible to encounter commands that won the completion vs eh race.  Rather
      than sprinkle more "if (!task)" throughout the handler just make a pass
      through the list and delete the race winners before handling the rest.
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      Signed-off-by: NJames Bottomley <JBottomley@Parallels.com>
      45c73b65
    • D
      [SCSI] libsas: fix sas_find_local_phy(), take phy references · f41a0c44
      Dan Williams 提交于
      In the direct-attached case this routine returns the phy on which this
      device was first discovered.  Which is broken if we want to support
      wide-targets, as this phy reference can become stale even though the
      port is still active.
      
      In the expander-attached case this routine tries to lookup the phy by
      scanning the attached sas addresses of the parent expander, and BUG_ONs
      if it can't find it.  However since eh and the libsas workqueue run
      independently we can still be attempting device recovery via eh after
      libsas has recorded the device as detached.  This is even easier to hit
      now that eh is blocked while device domain rediscovery takes place, and
      that libata is fed more timed out commands increasing the chances that
      it will try to recover the ata device.
      
      Arrange for dev->phy to always point to a last known good phy, it may be
      stale after the port is torn down, but it will catch up for wide port
      reconfigurations, and never be NULL.
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      Signed-off-by: NJames Bottomley <JBottomley@Parallels.com>
      f41a0c44
  8. 20 2月, 2012 10 次提交
  9. 01 11月, 2011 1 次提交
  10. 03 10月, 2011 3 次提交
    • D
      [SCSI] isci: atapi support · b50102d3
      Dan Williams 提交于
      Based on original implementation from Jiangbi Liu and Maciej Trela.
      
      ATAPI transfers happen in two-to-three stages.  The two stage atapi
      commands are those that include a dma data transfer.  The data transfer
      portion of these operations is handled by the hardware packet-dma
      acceleration.  The three-stage commands do not have a data transfer and
      are handled without hardware assistance in raw frame mode.
      
      stage1: transmit host-to-device fis to notify the device of an incoming
      atapi cdb.  Upon reception of the pio-setup-fis repost the task_context
      to perform the dma transfer of the cdb+data (go to stage3), or repost
      the task_context to transmit the cdb as a raw frame (go to stage 2).
      
      stage2: wait for hardware notification of the cdb transmission and then
      go to stage 3.
      
      stage3: wait for the arrival of the terminating device-to-host fis and
      terminate the command.
      
      To keep the implementation simple we only support ATAPI packet-dma
      protocol (for commands with data) to avoid needing to handle the data
      transfer manually (like we do for SATA-PIO).  This may affect
      compatibility for a small number of devices (see
      ATA_HORKAGE_ATAPI_MOD16_DMA).
      
      If the data-transfer underruns, or encounters an error the
      device-to-host fis is expected to arrive in the unsolicited frame queue
      to pass to libata for disposition.  However, in the DONE_UNEXP_FIS (data
      underrun) case it appears we need to craft a response.  In the
      DONE_REG_ERR case we do receive the UF and propagate it to libsas.
      Signed-off-by: NMaciej Trela <maciej.trela@intel.com>
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      Signed-off-by: NJames Bottomley <JBottomley@Parallels.com>
      b50102d3
    • D
      [SCSI] libsas: dynamic queue depth · 97a1420d
      Dan Williams 提交于
      The queue-depth for libsas-attached devices initializes to 32 and can
      only be increased manually via sysfs to a max of 64, while mpt2sas
      attached devices initialize to 254 and dynamically float via the
      midlayer ->change_queue_depth interface.
      
      No performance regression was observed with this change on the isci
      driver.
      Tested-by: NDave Jiang <dave.jiang@intel.com>
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      Signed-off-by: NJames Bottomley <JBottomley@Parallels.com>
      97a1420d
    • D
      [SCSI] libsas,libata: fix ->change_queue_{depth|type} for sata devices · f6e67035
      Dan Williams 提交于
      Pass queue_depth change requests to libata, and prevent queue_type
      changes for ATA devices.
      
      Otherwise:
      1/ we do not honor the libata specific restrictions on the queue depth
      2/ libsas drivers that do not set sdev->tagged_supported are unable to
         change the queue_depth of ata devices via sysfs
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      Acked-by: NJeff Garzik <jgarzik@redhat.com>
      Signed-off-by: NJames Bottomley <JBottomley@Parallels.com>
      f6e67035
  11. 31 8月, 2011 3 次提交
  12. 27 5月, 2011 1 次提交
    • D
      [SCSI] libsas: check dev->gone before submitting sata i/o · 3673f4bf
      Dan Williams 提交于
      Head off doomed-to-fail i/o in sas_queuecommand before sending it down
      the ata path.
      
      Before:
      sd 7:0:0:0: [sdd] Synchronizing SCSI cache
      ata8: no sense translation for status: 0x00
      ata8: translated ATA stat/err 0x00/00 to SCSI SK/ASC/ASCQ 0xb/00/00
      ata8.00: device reported invalid CHS sector 0
      ata8: status=0x00 { }
      ata8: no sense translation for status: 0x00
      ata8: translated ATA stat/err 0x00/00 to SCSI SK/ASC/ASCQ 0xb/00/00
      ata8.00: device reported invalid CHS sector 0
      ata8: status=0x00 { }
      ata8: no sense translation for status: 0x00
      ata8: translated ATA stat/err 0x00/00 to SCSI SK/ASC/ASCQ 0xb/00/00
      ata8.00: device reported invalid CHS sector 0
      ata8: status=0x00 { }
      sd 7:0:0:0: [sdd]  Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
      sd 7:0:0:0: [sdd]  Sense Key : Aborted Command [current] [descriptor]
      sd 7:0:0:0: [sdd]  Add. Sense: No additional sense information
      sd 7:0:0:0: [sdd] Stopping disk
      
      After:
      sd 9:0:0:0: [sdd] Synchronizing SCSI cache
      sd 9:0:0:0: [sdd]  Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
      sd 9:0:0:0: [sdd] Stopping disk
      sd 9:0:0:0: [sdd] START_STOP FAILED
      sd 9:0:0:0: [sdd]  Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
      
      This is a cosmetic change as sata i/o can still leak to a gone device,
      but this addresses the nominal hotplug case when releasing the target.
      Acked-by: NJack Wang <jack_wang@usish.com>
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      Signed-off-by: NJames Bottomley <jbottomley@parallels.com>
      3673f4bf
  13. 02 3月, 2011 1 次提交
    • J
      libsas: convert to libata new error handler · 00dd4998
      James Bottomley 提交于
      The conversion is quite complex given that the libata new error
      handler has to be hooked into the current libsas timeout and error
      handling.  The way this is done is to process all the failed commands
      via libsas first, but if they have no underlying sas task (and they're
      on a sata device) assume they are destined for the libata error
      handler and send them accordingly.
      
      Finally, activate the port recovery of the libata error handler for
      each port known to the host.  This is somewhat suboptimal, since that
      port may not need recovering, but given the current architecture of
      the libata error handler, it's the only way; and the spurious
      activation is harmless.
      Signed-off-by: NJames Bottomley <James.Bottomley@suse.de>
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      00dd4998
  14. 14 2月, 2011 1 次提交
    • J
      [SCSI] libsas: convert to libata new error handler · c299190b
      James Bottomley 提交于
      The conversion is quite complex given that the libata new error
      handler has to be hooked into the current libsas timeout and error
      handling.  The way this is done is to process all the failed commands
      via libsas first, but if they have no underlying sas task (and they're
      on a sata device) assume they are destined for the libata error
      handler and send them accordingly.
      
      Finally, activate the port recovery of the libata error handler for
      each port known to the host.  This is somewhat suboptimal, since that
      port may not need recovering, but given the current architecture of
      the libata error handler, it's the only way; and the spurious
      activation is harmless.
      Signed-off-by: NJames Bottomley <James.Bottomley@suse.de>
      c299190b
  15. 25 1月, 2011 1 次提交
    • J
      [SCSI] libsas: fix runaway error handler problem · 9ee91f7f
      James Bottomley 提交于
      libsas makes use of scsi_schedule_eh() but forgets to clear the
      host_eh_scheduled flag in its error handling routine.  Because of this,
      the error handler thread never gets to sleep; it's constantly awake and
      trying to run the error routine leading to console spew and inability to
      run anything else (at least on a UP system).  The fix is to clear the
      flag as we splice the work queue.
      
      Cc: stable@kernel.org
      Signed-off-by: NJames Bottomley <James.Bottomley@suse.de>
      9ee91f7f