aboutsummaryrefslogtreecommitdiffstats
path: root/include/scsi/scsi_device.h
diff options
context:
space:
mode:
authorChandra Seetharaman <sekharan@us.ibm.com>2008-05-01 17:49:46 -0400
committerJames Bottomley <James.Bottomley@HansenPartnership.com>2008-06-05 10:23:40 -0400
commita6a8d9f87eb8510a8f53672ea87703f62185d75f (patch)
treed166e14e3c035ae0e0f26329b2b3b0495046d234 /include/scsi/scsi_device.h
parent53c8ba95402be65d412a806cda3430f0e72cd107 (diff)
[SCSI] scsi_dh: add infrastructure for SCSI Device Handlers
Some of the storage devices (that can be accessed through multiple paths), do need some special handling for 1. Activating the passive path of the storage access. 2. Decode and handle the special sense codes returned by the devices. 3. Handle the I/Os being sent to the passive path, especially during the device probe time. when accessed through multiple paths. As of today this special device handling is done at the dm-multipath layer using dm-handlers. That works well for (1); for (2) to be handled at dm layer, scsi sense information need to be exported from SCSI to dm-layer, which is not very attractive; (3) cannot be done at all at the dm layer. Device handler has been moved to SCSI mainly to handle (2) and (3) properly. Signed-off-by: Chandra Seetharaman <sekharan@us.ibm.com> Signed-off-by: Mike Anderson <andmike@linux.vnet.ibm.com> Signed-off-by: Mike Christie <michaelc@cs.wisc.edu> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'include/scsi/scsi_device.h')
-rw-r--r--include/scsi/scsi_device.h22
1 files changed, 22 insertions, 0 deletions
diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h
index f6a9fe0ef09c..06b979f105b7 100644
--- a/include/scsi/scsi_device.h
+++ b/include/scsi/scsi_device.h
@@ -161,9 +161,29 @@ struct scsi_device {
161 161
162 struct execute_work ew; /* used to get process context on put */ 162 struct execute_work ew; /* used to get process context on put */
163 163
164 struct scsi_dh_data *scsi_dh_data;
164 enum scsi_device_state sdev_state; 165 enum scsi_device_state sdev_state;
165 unsigned long sdev_data[0]; 166 unsigned long sdev_data[0];
166} __attribute__((aligned(sizeof(unsigned long)))); 167} __attribute__((aligned(sizeof(unsigned long))));
168
169struct scsi_device_handler {
170 /* Used by the infrastructure */
171 struct list_head list; /* list of scsi_device_handlers */
172 struct notifier_block nb;
173
174 /* Filled by the hardware handler */
175 struct module *module;
176 const char *name;
177 int (*check_sense)(struct scsi_device *, struct scsi_sense_hdr *);
178 int (*activate)(struct scsi_device *);
179 int (*prep_fn)(struct scsi_device *, struct request *);
180};
181
182struct scsi_dh_data {
183 struct scsi_device_handler *scsi_dh;
184 char buf[0];
185};
186
167#define to_scsi_device(d) \ 187#define to_scsi_device(d) \
168 container_of(d, struct scsi_device, sdev_gendev) 188 container_of(d, struct scsi_device, sdev_gendev)
169#define class_to_sdev(d) \ 189#define class_to_sdev(d) \
@@ -230,7 +250,9 @@ extern struct scsi_device *__scsi_add_device(struct Scsi_Host *,
230 uint, uint, uint, void *hostdata); 250 uint, uint, uint, void *hostdata);
231extern int scsi_add_device(struct Scsi_Host *host, uint channel, 251extern int scsi_add_device(struct Scsi_Host *host, uint channel,
232 uint target, uint lun); 252 uint target, uint lun);
253extern int scsi_register_device_handler(struct scsi_device_handler *scsi_dh);
233extern void scsi_remove_device(struct scsi_device *); 254extern void scsi_remove_device(struct scsi_device *);
255extern int scsi_unregister_device_handler(struct scsi_device_handler *scsi_dh);
234 256
235extern int scsi_device_get(struct scsi_device *); 257extern int scsi_device_get(struct scsi_device *);
236extern void scsi_device_put(struct scsi_device *); 258extern void scsi_device_put(struct scsi_device *);