Skip to content
GitLab
Projects Groups Topics Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
  • Register
  • Sign in
  • L linux
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributor statistics
    • Graph
    • Compare revisions
  • Issues 0
    • Issues 0
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 0
    • Merge requests 0
  • Deployments
    • Deployments
    • Releases
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Commits
  • Issue Boards
Collapse sidebar
  • Kirill Smelkov
  • linux
  • Repository
You need to sign in or sign up before continuing.
  • linux
  • include
  • linux
  • libata.h
Find file BlameHistoryPermalink
  • Damien Le Moal's avatar
    ata: libata-scsi: Avoid deadlock on rescan after device resume · 6aa0365a
    Damien Le Moal authored Jun 15, 2023
    
    
    When an ATA port is resumed from sleep, the port is reset and a power
    management request issued to libata EH to reset the port and rescanning
    the device(s) attached to the port. Device rescanning is done by
    scheduling an ata_scsi_dev_rescan() work, which will execute
    scsi_rescan_device().
    
    However, scsi_rescan_device() takes the generic device lock, which is
    also taken by dpm_resume() when the SCSI device is resumed as well. If
    a device rescan execution starts before the completion of the SCSI
    device resume, the rcu locking used to refresh the cached VPD pages of
    the device, combined with the generic device locking from
    scsi_rescan_device() and from dpm_resume() can cause a deadlock.
    
    Avoid this situation by changing struct ata_port scsi_rescan_task to be
    a delayed work instead of a simple work_struct. ata_scsi_dev_rescan() is
    modified to check if the SCSI device associated with the ATA device that
    must be rescanned is not suspended. If the SCSI device is still
    suspended, ata_scsi_dev_rescan() returns early and reschedule itself for
    execution after an arbitrary delay of 5ms.
    
    Reported-by: default avatarKai-Heng Feng <kai.heng.feng@canonical.com>
    Reported-by: default avatarJoe Breuer <linux-kernel@jmbreuer.net>
    Closes: https://bugzilla.kernel.org/show_bug.cgi?id=217530
    Fixes: a19a93e4
    
     ("scsi: core: pm: Rely on the device driver core for async power management")
    Signed-off-by: default avatarDamien Le Moal <dlemoal@kernel.org>
    Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
    Tested-by: default avatarKai-Heng Feng <kai.heng.feng@canonical.com>
    Tested-by: default avatarJoe Breuer <linux-kernel@jmbreuer.net>
    6aa0365a
GitLab Nexedi Edition | About GitLab | About Nexedi | 沪ICP备2021021310号-2 | 沪ICP备2021021310号-7