diff options
author | Boaz Harrosh <bharrosh@panasas.com> | 2007-10-08 10:36:45 -0400 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.localdomain> | 2007-10-12 14:54:58 -0400 |
commit | e1c234685c50807e10a3e7873e6e006976a4d8e8 (patch) | |
tree | 4be0f09620503f6669a40dacd49326443c9c07dc /include/scsi/scsi_eh.h | |
parent | 55db6c1b8ed52bfc876e87971de8c67c42f36909 (diff) |
[SCSI] scsi_error: Refactoring scsi_error to facilitate in synchronous REQUEST_SENSE
- Drivers/transports that want to send a synchronous REQUEST_SENSE command
as part of their .queuecommand sequence, have 2 new API's that facilitate
in doing so and abstract them from scsi-ml internals.
void scsi_eh_prep_cmnd(struct scsi_cmnd *scmd,
struct scsi_eh_save *sesci, unsigned char *cmnd,
int cmnd_size, int sense_bytes)
Will hijack a command and prepare it for request sense if needed.
And will save any later needed info into a scsi_eh_save structure.
void scsi_eh_restore_cmnd(struct scsi_cmnd* scmd,
struct scsi_eh_save *sesci);
Will undo any changes done to a command by above function. Making
it ready for completion.
- Re-factor scsi_send_eh_cmnd() to use above APIs
Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'include/scsi/scsi_eh.h')
-rw-r--r-- | include/scsi/scsi_eh.h | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/include/scsi/scsi_eh.h b/include/scsi/scsi_eh.h index c5c0f6762a01..44224ba4dd90 100644 --- a/include/scsi/scsi_eh.h +++ b/include/scsi/scsi_eh.h | |||
@@ -1,7 +1,7 @@ | |||
1 | #ifndef _SCSI_SCSI_EH_H | 1 | #ifndef _SCSI_SCSI_EH_H |
2 | #define _SCSI_SCSI_EH_H | 2 | #define _SCSI_SCSI_EH_H |
3 | 3 | ||
4 | struct scsi_cmnd; | 4 | #include <scsi/scsi_cmnd.h> |
5 | struct scsi_device; | 5 | struct scsi_device; |
6 | struct Scsi_Host; | 6 | struct Scsi_Host; |
7 | 7 | ||
@@ -65,4 +65,25 @@ extern int scsi_get_sense_info_fld(const u8 * sense_buffer, int sb_len, | |||
65 | 65 | ||
66 | extern int scsi_reset_provider(struct scsi_device *, int); | 66 | extern int scsi_reset_provider(struct scsi_device *, int); |
67 | 67 | ||
68 | struct scsi_eh_save { | ||
69 | int result; | ||
70 | enum dma_data_direction data_direction; | ||
71 | unsigned char cmd_len; | ||
72 | unsigned char cmnd[MAX_COMMAND_SIZE]; | ||
73 | |||
74 | void *buffer; | ||
75 | unsigned bufflen; | ||
76 | unsigned short use_sg; | ||
77 | int resid; | ||
78 | |||
79 | struct scatterlist sense_sgl; | ||
80 | }; | ||
81 | |||
82 | extern void scsi_eh_prep_cmnd(struct scsi_cmnd *scmd, | ||
83 | struct scsi_eh_save *ses, unsigned char *cmnd, | ||
84 | int cmnd_size, unsigned sense_bytes); | ||
85 | |||
86 | extern void scsi_eh_restore_cmnd(struct scsi_cmnd* scmd, | ||
87 | struct scsi_eh_save *ses); | ||
88 | |||
68 | #endif /* _SCSI_SCSI_EH_H */ | 89 | #endif /* _SCSI_SCSI_EH_H */ |