mirror of
https://github.com/FEX-Emu/linux.git
synced 2025-01-17 06:52:43 +00:00
87c8331fcf
libata error handling provides for a timeout for link recovery. libsas must not rescan for previously known devices in this interval otherwise it may remove a device that is simply waiting for its link to recover. Let libata-eh make the determination of when the link is stable and prevent libsas (host workqueue) from taking action while this determination is pending. Using a mutex (ha->disco_mutex) to flush and disable revalidation while eh is running requires any discovery action that may block on eh be moved to its own context outside the lock. Probing ATA devices explicitly waits on ata-eh and the cache-flush-io issued during device removal may also pend awaiting eh completion. Essentially any rphy add/remove activity needs to run outside the lock. This adds two new cleanup states for sas_unregister_domain_devices() 'allocated-but-not-probed', and 'flagged-for-destruction'. In the 'allocated-but-not-probed' state dev->rphy points to a rphy that is known to have not been through a sas_rphy_add() event. At domain teardown check if this device is still pending probe and cleanup accordingly. Similarly if a device has already been queued for removal then sas_unregister_domain_devices has nothing to do. Signed-off-by: Dan Williams <dan.j.williams@intel.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
89 lines
2.3 KiB
C
89 lines
2.3 KiB
C
/*
|
|
* Support for SATA devices on Serial Attached SCSI (SAS) controllers
|
|
*
|
|
* Copyright (C) 2006 IBM Corporation
|
|
*
|
|
* Written by: Darrick J. Wong <djwong@us.ibm.com>, IBM Corporation
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License as
|
|
* published by the Free Software Foundation; either version 2 of the
|
|
* License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
|
* USA
|
|
*
|
|
*/
|
|
|
|
#ifndef _SAS_ATA_H_
|
|
#define _SAS_ATA_H_
|
|
|
|
#include <linux/libata.h>
|
|
#include <scsi/libsas.h>
|
|
|
|
#ifdef CONFIG_SCSI_SAS_ATA
|
|
|
|
static inline int dev_is_sata(struct domain_device *dev)
|
|
{
|
|
return dev->dev_type == SATA_DEV || dev->dev_type == SATA_PM ||
|
|
dev->dev_type == SATA_PM_PORT;
|
|
}
|
|
|
|
int sas_ata_init_host_and_port(struct domain_device *found_dev,
|
|
struct scsi_target *starget);
|
|
|
|
void sas_ata_task_abort(struct sas_task *task);
|
|
void sas_ata_strategy_handler(struct Scsi_Host *shost);
|
|
int sas_ata_timed_out(struct scsi_cmnd *cmd, struct sas_task *task,
|
|
enum blk_eh_timer_return *rtn);
|
|
int sas_ata_eh(struct Scsi_Host *shost, struct list_head *work_q,
|
|
struct list_head *done_q);
|
|
void sas_probe_sata(struct work_struct *work);
|
|
|
|
#else
|
|
|
|
|
|
static inline int dev_is_sata(struct domain_device *dev)
|
|
{
|
|
return 0;
|
|
}
|
|
static inline int sas_ata_init_host_and_port(struct domain_device *found_dev,
|
|
struct scsi_target *starget)
|
|
{
|
|
return 0;
|
|
}
|
|
static inline void sas_ata_task_abort(struct sas_task *task)
|
|
{
|
|
}
|
|
|
|
static inline void sas_ata_strategy_handler(struct Scsi_Host *shost)
|
|
{
|
|
}
|
|
|
|
static inline int sas_ata_timed_out(struct scsi_cmnd *cmd,
|
|
struct sas_task *task,
|
|
enum blk_eh_timer_return *rtn)
|
|
{
|
|
return 0;
|
|
}
|
|
static inline int sas_ata_eh(struct Scsi_Host *shost, struct list_head *work_q,
|
|
struct list_head *done_q)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline void sas_probe_sata(struct work_struct *work)
|
|
{
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif /* _SAS_ATA_H_ */
|