summaryrefslogtreecommitdiffstats
path: root/include/scsi/libsas.h
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2012-06-22 08:30:48 +0200
committerJames Bottomley <JBottomley@Parallels.com>2012-07-20 09:58:50 +0200
commit5db45bdc87ce4f503947adf7896586d60c63322c (patch)
treef939bbcf1e6fc2664c54b46949eb8e5af8aa070b /include/scsi/libsas.h
parent[SCSI] cleanup setting task state in scsi_error_handler() (diff)
downloadlinux-5db45bdc87ce4f503947adf7896586d60c63322c.tar.xz
linux-5db45bdc87ce4f503947adf7896586d60c63322c.zip
[SCSI] libsas: enforce eh strategy handlers only in eh context
The strategy handlers may be called in places that are problematic for libsas (i.e. sata resets outside of domain revalidation filtering / libata link recovery), or problematic for userspace (non-blocking ioctl to sleeping reset functions). However, these routines are also called for eh escalations and recovery of scsi_eh_prep_cmnd(), so permit them as long as we are running in the host's error handler, otherwise arrange for them to be triggered in eh_context. Signed-off-by: Dan Williams <dan.j.williams@intel.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to '')
-rw-r--r--include/scsi/libsas.h10
1 files changed, 10 insertions, 0 deletions
diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h
index 814d8cb592ad..df9cefdf2a8e 100644
--- a/include/scsi/libsas.h
+++ b/include/scsi/libsas.h
@@ -176,10 +176,17 @@ struct sata_device {
u8 fis[ATA_RESP_FIS_SIZE];
};
+struct ssp_device {
+ struct list_head eh_list_node; /* pending a user requested eh action */
+ struct scsi_lun reset_lun;
+};
+
enum {
SAS_DEV_GONE,
SAS_DEV_DESTROY,
SAS_DEV_EH_PENDING,
+ SAS_DEV_LU_RESET,
+ SAS_DEV_RESET,
};
struct domain_device {
@@ -213,6 +220,7 @@ struct domain_device {
union {
struct expander_device ex_dev;
struct sata_device sata_dev; /* STP & directly attached */
+ struct ssp_device ssp_dev;
};
void *lldd_dev;
@@ -389,6 +397,8 @@ struct sas_ha_struct {
unsigned long state;
spinlock_t lock;
int eh_active;
+ wait_queue_head_t eh_wait_q;
+ struct list_head eh_dev_q;
struct mutex disco_mutex;