Blame view

drivers/scsi/scsi_lib.c 65 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
  /*
   *  scsi_lib.c Copyright (C) 1999 Eric Youngdale
   *
   *  SCSI queueing library.
   *      Initial versions: Eric Youngdale (eric@andante.org).
   *                        Based upon conversations with large numbers
   *                        of people at Linux Expo.
   */
  
  #include <linux/bio.h>
d3f46f39b   James Bottomley   [SCSI] remove use...
11
  #include <linux/bitops.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
12
13
14
  #include <linux/blkdev.h>
  #include <linux/completion.h>
  #include <linux/kernel.h>
09703660e   Paul Gortmaker   scsi: Add export....
15
  #include <linux/export.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
16
17
18
19
20
  #include <linux/mempool.h>
  #include <linux/slab.h>
  #include <linux/init.h>
  #include <linux/pci.h>
  #include <linux/delay.h>
faead26d7   James Bottomley   [PATCH] add scsi_...
21
  #include <linux/hardirq.h>
c6132da17   Jens Axboe   scsi: convert to ...
22
  #include <linux/scatterlist.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
23
24
  
  #include <scsi/scsi.h>
beb404875   Christoph Hellwig   [SCSI] remove scs...
25
  #include <scsi/scsi_cmnd.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
26
27
28
29
30
  #include <scsi/scsi_dbg.h>
  #include <scsi/scsi_device.h>
  #include <scsi/scsi_driver.h>
  #include <scsi/scsi_eh.h>
  #include <scsi/scsi_host.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
31
32
33
  
  #include "scsi_priv.h"
  #include "scsi_logging.h"
6391a1137   Tobias Klauser   [SCSI] drivers/sc...
34
  #define SG_MEMPOOL_NR		ARRAY_SIZE(scsi_sg_pools)
5972511b7   Jens Axboe   [BLOCK] Don't pin...
35
  #define SG_MEMPOOL_SIZE		2
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
36
37
38
  
  struct scsi_host_sg_pool {
  	size_t		size;
a8474ce23   Jens Axboe   SCSI: support for...
39
  	char		*name;
e18b890bb   Christoph Lameter   [PATCH] slab: rem...
40
  	struct kmem_cache	*slab;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
41
42
  	mempool_t	*pool;
  };
d3f46f39b   James Bottomley   [SCSI] remove use...
43
44
45
46
  #define SP(x) { x, "sgpool-" __stringify(x) }
  #if (SCSI_MAX_SG_SEGMENTS < 32)
  #error SCSI_MAX_SG_SEGMENTS is too small (must be 32 or greater)
  #endif
52c1da395   Adrian Bunk   [PATCH] make vari...
47
  static struct scsi_host_sg_pool scsi_sg_pools[] = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
48
49
  	SP(8),
  	SP(16),
fd820f405   FUJITA Tomonori   revert sg segment...
50
  #if (SCSI_MAX_SG_SEGMENTS > 32)
d3f46f39b   James Bottomley   [SCSI] remove use...
51
  	SP(32),
fd820f405   FUJITA Tomonori   revert sg segment...
52
  #if (SCSI_MAX_SG_SEGMENTS > 64)
d3f46f39b   James Bottomley   [SCSI] remove use...
53
54
  	SP(64),
  #if (SCSI_MAX_SG_SEGMENTS > 128)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
55
  	SP(128),
d3f46f39b   James Bottomley   [SCSI] remove use...
56
57
  #if (SCSI_MAX_SG_SEGMENTS > 256)
  #error SCSI_MAX_SG_SEGMENTS is too large (256 MAX)
fd820f405   FUJITA Tomonori   revert sg segment...
58
59
60
  #endif
  #endif
  #endif
d3f46f39b   James Bottomley   [SCSI] remove use...
61
62
  #endif
  	SP(SCSI_MAX_SG_SEGMENTS)
a8474ce23   Jens Axboe   SCSI: support for...
63
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
64
  #undef SP
7027ad72a   Martin K. Petersen   [SCSI] Support de...
65
  struct kmem_cache *scsi_sdb_cache;
6f9a35e2d   Boaz Harrosh   [SCSI] bidirectio...
66

a488e7497   Jens Axboe   scsi: convert to ...
67
68
69
70
71
72
  /*
   * When to reinvoke queueing after a resource shortage. It's 3 msecs to
   * not change behaviour from the previous unplug mechanism, experimentation
   * may prove this needs changing.
   */
  #define SCSI_QUEUE_DELAY	3
e91442b63   James Bottomley   [SCSI] SCSI core:...
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
  /*
   * Function:	scsi_unprep_request()
   *
   * Purpose:	Remove all preparation done for a request, including its
   *		associated scsi_cmnd, so that it can be requeued.
   *
   * Arguments:	req	- request to unprepare
   *
   * Lock status:	Assumed that no locks are held upon entry.
   *
   * Returns:	Nothing.
   */
  static void scsi_unprep_request(struct request *req)
  {
  	struct scsi_cmnd *cmd = req->special;
28018c242   James Bottomley   block: implement ...
88
  	blk_unprep_request(req);
beb404875   Christoph Hellwig   [SCSI] remove scs...
89
  	req->special = NULL;
e91442b63   James Bottomley   [SCSI] SCSI core:...
90

e91442b63   James Bottomley   [SCSI] SCSI core:...
91
92
  	scsi_put_command(cmd);
  }
a1bf9d1d9   Tejun Heo   [SCSI] make scsi_...
93

4f5299ac4   James Bottomley   [SCSI] scsi_lib: ...
94
95
96
97
98
  /**
   * __scsi_queue_insert - private queue insertion
   * @cmd: The SCSI command being requeued
   * @reason:  The reason for the requeue
   * @unbusy: Whether the queue should be unbusied
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
99
   *
4f5299ac4   James Bottomley   [SCSI] scsi_lib: ...
100
101
102
103
104
   * This is a private queue insertion.  The public interface
   * scsi_queue_insert() always assumes the queue should be unbusied
   * because it's always called before the completion.  This function is
   * for a requeue after completion, which should only occur in this
   * file.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
105
   */
4f5299ac4   James Bottomley   [SCSI] scsi_lib: ...
106
  static int __scsi_queue_insert(struct scsi_cmnd *cmd, int reason, int unbusy)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
107
108
109
  {
  	struct Scsi_Host *host = cmd->device->host;
  	struct scsi_device *device = cmd->device;
f0c0a376d   Mike Christie   [SCSI] Add helper...
110
  	struct scsi_target *starget = scsi_target(device);
a1bf9d1d9   Tejun Heo   [SCSI] make scsi_...
111
112
  	struct request_queue *q = device->request_queue;
  	unsigned long flags;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
113
114
115
116
117
118
  
  	SCSI_LOG_MLQUEUE(1,
  		 printk("Inserting command %p into mlqueue
  ", cmd));
  
  	/*
d8c37e7b9   Tejun Heo   [SCSI] remove a t...
119
  	 * Set the appropriate busy bit for the device/host.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
120
121
122
123
124
125
126
127
128
129
130
  	 *
  	 * If the host/device isn't busy, assume that something actually
  	 * completed, and that we should be able to queue a command now.
  	 *
  	 * Note that the prior mid-layer assumption that any host could
  	 * always queue at least one command is now broken.  The mid-layer
  	 * will implement a user specifiable stall (see
  	 * scsi_host.max_host_blocked and scsi_device.max_device_blocked)
  	 * if a command is requeued with no other commands outstanding
  	 * either for the device or for the host.
  	 */
f0c0a376d   Mike Christie   [SCSI] Add helper...
131
132
  	switch (reason) {
  	case SCSI_MLQUEUE_HOST_BUSY:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
133
  		host->host_blocked = host->max_host_blocked;
f0c0a376d   Mike Christie   [SCSI] Add helper...
134
135
  		break;
  	case SCSI_MLQUEUE_DEVICE_BUSY:
573e59135   James Smart   [SCSI] scsi_lib: ...
136
  	case SCSI_MLQUEUE_EH_RETRY:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
137
  		device->device_blocked = device->max_device_blocked;
f0c0a376d   Mike Christie   [SCSI] Add helper...
138
139
140
141
142
  		break;
  	case SCSI_MLQUEUE_TARGET_BUSY:
  		starget->target_blocked = starget->max_target_blocked;
  		break;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
143
144
  
  	/*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
145
146
147
  	 * Decrement the counters, since these commands are no longer
  	 * active on the host/device.
  	 */
4f5299ac4   James Bottomley   [SCSI] scsi_lib: ...
148
149
  	if (unbusy)
  		scsi_device_unbusy(device);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
150
151
  
  	/*
a1bf9d1d9   Tejun Heo   [SCSI] make scsi_...
152
153
  	 * Requeue this command.  It will go before all other commands
  	 * that are already in the queue.
a488e7497   Jens Axboe   scsi: convert to ...
154
  	 */
a1bf9d1d9   Tejun Heo   [SCSI] make scsi_...
155
  	spin_lock_irqsave(q->queue_lock, flags);
59897dad9   James Bottomley   [SCSI] fix sym sc...
156
  	blk_requeue_request(q, cmd->request);
a1bf9d1d9   Tejun Heo   [SCSI] make scsi_...
157
  	spin_unlock_irqrestore(q->queue_lock, flags);
9937a5e2f   Jens Axboe   scsi: remove perf...
158
  	kblockd_schedule_work(q, &device->requeue_work);
a1bf9d1d9   Tejun Heo   [SCSI] make scsi_...
159

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
160
161
  	return 0;
  }
4f5299ac4   James Bottomley   [SCSI] scsi_lib: ...
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
  /*
   * Function:    scsi_queue_insert()
   *
   * Purpose:     Insert a command in the midlevel queue.
   *
   * Arguments:   cmd    - command that we are adding to queue.
   *              reason - why we are inserting command to queue.
   *
   * Lock status: Assumed that lock is not held upon entry.
   *
   * Returns:     Nothing.
   *
   * Notes:       We do this for one of two cases.  Either the host is busy
   *              and it cannot accept any more commands for the time being,
   *              or the device returned QUEUE_FULL and can accept no more
   *              commands.
   * Notes:       This could be called either from an interrupt context or a
   *              normal process context.
   */
  int scsi_queue_insert(struct scsi_cmnd *cmd, int reason)
  {
  	return __scsi_queue_insert(cmd, reason, 1);
  }
392160335   James Bottomley   [SCSI] use scatte...
185
  /**
33aa687db   James Bottomley   [SCSI] convert SP...
186
   * scsi_execute - insert request and wait for the result
392160335   James Bottomley   [SCSI] use scatte...
187
188
189
190
191
192
193
194
   * @sdev:	scsi device
   * @cmd:	scsi command
   * @data_direction: data direction
   * @buffer:	data buffer
   * @bufflen:	len of buffer
   * @sense:	optional sense buffer
   * @timeout:	request timeout in seconds
   * @retries:	number of times to retry request
33aa687db   James Bottomley   [SCSI] convert SP...
195
   * @flags:	or into request flags;
f4f4e47e4   FUJITA Tomonori   [SCSI] add residu...
196
   * @resid:	optional residual length
392160335   James Bottomley   [SCSI] use scatte...
197
   *
59c51591a   Michael Opdenacker   Fix occurrences o...
198
   * returns the req->errors value which is the scsi_cmnd result
ea73a9f23   James Bottomley   [SCSI] convert sd...
199
   * field.
eb44820c2   Rob Landley   [SCSI] Add Docume...
200
   */
33aa687db   James Bottomley   [SCSI] convert SP...
201
202
  int scsi_execute(struct scsi_device *sdev, const unsigned char *cmd,
  		 int data_direction, void *buffer, unsigned bufflen,
f4f4e47e4   FUJITA Tomonori   [SCSI] add residu...
203
204
  		 unsigned char *sense, int timeout, int retries, int flags,
  		 int *resid)
392160335   James Bottomley   [SCSI] use scatte...
205
206
207
208
209
210
  {
  	struct request *req;
  	int write = (data_direction == DMA_TO_DEVICE);
  	int ret = DRIVER_ERROR << 24;
  
  	req = blk_get_request(sdev->request_queue, write, __GFP_WAIT);
bfe159a51   James Bottomley   [SCSI] fix crash ...
211
212
  	if (!req)
  		return ret;
392160335   James Bottomley   [SCSI] use scatte...
213
214
215
216
217
218
219
220
221
  
  	if (bufflen &&	blk_rq_map_kern(sdev->request_queue, req,
  					buffer, bufflen, __GFP_WAIT))
  		goto out;
  
  	req->cmd_len = COMMAND_SIZE(cmd[0]);
  	memcpy(req->cmd, cmd, req->cmd_len);
  	req->sense = sense;
  	req->sense_len = 0;
17e01f216   Mike Christie   [SCSI] add retrie...
222
  	req->retries = retries;
392160335   James Bottomley   [SCSI] use scatte...
223
  	req->timeout = timeout;
4aff5e233   Jens Axboe   [PATCH] Split str...
224
225
  	req->cmd_type = REQ_TYPE_BLOCK_PC;
  	req->cmd_flags |= flags | REQ_QUIET | REQ_PREEMPT;
392160335   James Bottomley   [SCSI] use scatte...
226
227
228
229
230
  
  	/*
  	 * head injection *required* here otherwise quiesce won't work
  	 */
  	blk_execute_rq(req->q, NULL, req, 1);
bdb2b8cab   Alan Stern   [SCSI] erase inva...
231
232
233
234
235
236
  	/*
  	 * Some devices (USB mass-storage in particular) may transfer
  	 * garbage data together with a residue indicating that the data
  	 * is invalid.  Prevent the garbage from being misinterpreted
  	 * and prevent security leaks by zeroing out the excess data.
  	 */
c3a4d78c5   Tejun Heo   block: add rq->re...
237
238
  	if (unlikely(req->resid_len > 0 && req->resid_len <= bufflen))
  		memset(buffer + (bufflen - req->resid_len), 0, req->resid_len);
bdb2b8cab   Alan Stern   [SCSI] erase inva...
239

f4f4e47e4   FUJITA Tomonori   [SCSI] add residu...
240
  	if (resid)
c3a4d78c5   Tejun Heo   block: add rq->re...
241
  		*resid = req->resid_len;
392160335   James Bottomley   [SCSI] use scatte...
242
243
244
245
246
247
  	ret = req->errors;
   out:
  	blk_put_request(req);
  
  	return ret;
  }
33aa687db   James Bottomley   [SCSI] convert SP...
248
  EXPORT_SYMBOL(scsi_execute);
392160335   James Bottomley   [SCSI] use scatte...
249

ea73a9f23   James Bottomley   [SCSI] convert sd...
250
251
252
  
  int scsi_execute_req(struct scsi_device *sdev, const unsigned char *cmd,
  		     int data_direction, void *buffer, unsigned bufflen,
f4f4e47e4   FUJITA Tomonori   [SCSI] add residu...
253
254
  		     struct scsi_sense_hdr *sshdr, int timeout, int retries,
  		     int *resid)
ea73a9f23   James Bottomley   [SCSI] convert sd...
255
256
  {
  	char *sense = NULL;
1ccb48bb1   Andrew Morton   [SCSI] fix C synt...
257
258
  	int result;
  	
ea73a9f23   James Bottomley   [SCSI] convert sd...
259
  	if (sshdr) {
24669f75a   Jes Sorensen   [SCSI] SCSI core ...
260
  		sense = kzalloc(SCSI_SENSE_BUFFERSIZE, GFP_NOIO);
ea73a9f23   James Bottomley   [SCSI] convert sd...
261
262
  		if (!sense)
  			return DRIVER_ERROR << 24;
ea73a9f23   James Bottomley   [SCSI] convert sd...
263
  	}
1ccb48bb1   Andrew Morton   [SCSI] fix C synt...
264
  	result = scsi_execute(sdev, cmd, data_direction, buffer, bufflen,
f4f4e47e4   FUJITA Tomonori   [SCSI] add residu...
265
  			      sense, timeout, retries, 0, resid);
ea73a9f23   James Bottomley   [SCSI] convert sd...
266
  	if (sshdr)
e514385be   James Bottomley   [SCSI] fix sense ...
267
  		scsi_normalize_sense(sense, SCSI_SENSE_BUFFERSIZE, sshdr);
ea73a9f23   James Bottomley   [SCSI] convert sd...
268
269
270
271
272
  
  	kfree(sense);
  	return result;
  }
  EXPORT_SYMBOL(scsi_execute_req);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
273
274
275
276
277
278
279
  /*
   * Function:    scsi_init_cmd_errh()
   *
   * Purpose:     Initialize cmd fields related to error handling.
   *
   * Arguments:   cmd	- command that is ready to be queued.
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
280
281
282
283
   * Notes:       This function has the job of initializing a number of
   *              fields related to error handling.   Typically this will
   *              be called once for each command, as required.
   */
631c228cd   Christoph Hellwig   [SCSI] hide EH ba...
284
  static void scsi_init_cmd_errh(struct scsi_cmnd *cmd)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
285
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
286
  	cmd->serial_number = 0;
30b0c37b2   Boaz Harrosh   [SCSI] implement ...
287
  	scsi_set_resid(cmd, 0);
b80ca4f7e   FUJITA Tomonori   [SCSI] replace si...
288
  	memset(cmd->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
289
  	if (cmd->cmd_len == 0)
db4742dd8   Boaz Harrosh   [SCSI] add suppor...
290
  		cmd->cmd_len = scsi_command_size(cmd->cmnd);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
291
292
293
294
295
  }
  
  void scsi_device_unbusy(struct scsi_device *sdev)
  {
  	struct Scsi_Host *shost = sdev->host;
f0c0a376d   Mike Christie   [SCSI] Add helper...
296
  	struct scsi_target *starget = scsi_target(sdev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
297
298
299
300
  	unsigned long flags;
  
  	spin_lock_irqsave(shost->host_lock, flags);
  	shost->host_busy--;
f0c0a376d   Mike Christie   [SCSI] Add helper...
301
  	starget->target_busy--;
939647ee3   James Bottomley   [SCSI] fix oops o...
302
  	if (unlikely(scsi_host_in_recovery(shost) &&
ee7863bc6   Tejun Heo   [PATCH] SCSI: imp...
303
  		     (shost->host_failed || shost->host_eh_scheduled)))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
304
305
  		scsi_eh_wakeup(shost);
  	spin_unlock(shost->host_lock);
152587deb   Jens Axboe   [PATCH] fix NMI l...
306
  	spin_lock(sdev->request_queue->queue_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
307
  	sdev->device_busy--;
152587deb   Jens Axboe   [PATCH] fix NMI l...
308
  	spin_unlock_irqrestore(sdev->request_queue->queue_lock, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
  }
  
  /*
   * Called for single_lun devices on IO completion. Clear starget_sdev_user,
   * and call blk_run_queue for all the scsi_devices on the target -
   * including current_sdev first.
   *
   * Called with *no* scsi locks held.
   */
  static void scsi_single_lun_run(struct scsi_device *current_sdev)
  {
  	struct Scsi_Host *shost = current_sdev->host;
  	struct scsi_device *sdev, *tmp;
  	struct scsi_target *starget = scsi_target(current_sdev);
  	unsigned long flags;
  
  	spin_lock_irqsave(shost->host_lock, flags);
  	starget->starget_sdev_user = NULL;
  	spin_unlock_irqrestore(shost->host_lock, flags);
  
  	/*
  	 * Call blk_run_queue for all LUNs on the target, starting with
  	 * current_sdev. We race with others (to set starget_sdev_user),
  	 * but in most cases, we will be first. Ideally, each LU on the
  	 * target would get some limited time or requests on the target.
  	 */
  	blk_run_queue(current_sdev->request_queue);
  
  	spin_lock_irqsave(shost->host_lock, flags);
  	if (starget->starget_sdev_user)
  		goto out;
  	list_for_each_entry_safe(sdev, tmp, &starget->devices,
  			same_target_siblings) {
  		if (sdev == current_sdev)
  			continue;
  		if (scsi_device_get(sdev))
  			continue;
  
  		spin_unlock_irqrestore(shost->host_lock, flags);
  		blk_run_queue(sdev->request_queue);
  		spin_lock_irqsave(shost->host_lock, flags);
  	
  		scsi_device_put(sdev);
  	}
   out:
  	spin_unlock_irqrestore(shost->host_lock, flags);
  }
9d1125170   Kiyoshi Ueda   [SCSI] refactor s...
356
357
358
359
360
361
362
  static inline int scsi_device_is_busy(struct scsi_device *sdev)
  {
  	if (sdev->device_busy >= sdev->queue_depth || sdev->device_blocked)
  		return 1;
  
  	return 0;
  }
f0c0a376d   Mike Christie   [SCSI] Add helper...
363
364
365
366
367
368
  static inline int scsi_target_is_busy(struct scsi_target *starget)
  {
  	return ((starget->can_queue > 0 &&
  		 starget->target_busy >= starget->can_queue) ||
  		 starget->target_blocked);
  }
9d1125170   Kiyoshi Ueda   [SCSI] refactor s...
369
370
371
372
373
374
375
376
  static inline int scsi_host_is_busy(struct Scsi_Host *shost)
  {
  	if ((shost->can_queue > 0 && shost->host_busy >= shost->can_queue) ||
  	    shost->host_blocked || shost->host_self_blocked)
  		return 1;
  
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
377
378
379
380
381
382
383
384
385
386
387
388
389
390
  /*
   * Function:	scsi_run_queue()
   *
   * Purpose:	Select a proper request queue to serve next
   *
   * Arguments:	q	- last request's queue
   *
   * Returns:     Nothing
   *
   * Notes:	The previous command was completely finished, start
   *		a new one if possible.
   */
  static void scsi_run_queue(struct request_queue *q)
  {
2a3a59e5c   Mike Christie   [SCSI] Fix hang i...
391
  	struct scsi_device *sdev = q->queuedata;
c055f5b26   James Bottomley   [SCSI] fix oops i...
392
  	struct Scsi_Host *shost;
2a3a59e5c   Mike Christie   [SCSI] Fix hang i...
393
  	LIST_HEAD(starved_list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
394
  	unsigned long flags;
c055f5b26   James Bottomley   [SCSI] fix oops i...
395
396
397
398
399
  	/* if the device is dead, sdev will be NULL, so no queue to run */
  	if (!sdev)
  		return;
  
  	shost = sdev->host;
25d7c363f   Tony Battersby   [SCSI] move singl...
400
  	if (scsi_target(sdev)->single_lun)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
401
402
403
  		scsi_single_lun_run(sdev);
  
  	spin_lock_irqsave(shost->host_lock, flags);
2a3a59e5c   Mike Christie   [SCSI] Fix hang i...
404
405
406
  	list_splice_init(&shost->starved_list, &starved_list);
  
  	while (!list_empty(&starved_list)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
407
408
409
410
411
412
413
414
415
416
  		/*
  		 * As long as shost is accepting commands and we have
  		 * starved queues, call blk_run_queue. scsi_request_fn
  		 * drops the queue_lock and can add us back to the
  		 * starved_list.
  		 *
  		 * host_lock protects the starved_list and starved_entry.
  		 * scsi_request_fn must get the host_lock before checking
  		 * or modifying starved_list or starved_entry.
  		 */
2a3a59e5c   Mike Christie   [SCSI] Fix hang i...
417
  		if (scsi_host_is_busy(shost))
f0c0a376d   Mike Christie   [SCSI] Add helper...
418
  			break;
f0c0a376d   Mike Christie   [SCSI] Add helper...
419

2a3a59e5c   Mike Christie   [SCSI] Fix hang i...
420
421
422
  		sdev = list_entry(starved_list.next,
  				  struct scsi_device, starved_entry);
  		list_del_init(&sdev->starved_entry);
f0c0a376d   Mike Christie   [SCSI] Add helper...
423
424
425
426
427
  		if (scsi_target_is_busy(scsi_target(sdev))) {
  			list_move_tail(&sdev->starved_entry,
  				       &shost->starved_list);
  			continue;
  		}
9937a5e2f   Jens Axboe   scsi: remove perf...
428
429
430
431
432
  		spin_unlock(shost->host_lock);
  		spin_lock(sdev->request_queue->queue_lock);
  		__blk_run_queue(sdev->request_queue);
  		spin_unlock(sdev->request_queue->queue_lock);
  		spin_lock(shost->host_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
433
  	}
2a3a59e5c   Mike Christie   [SCSI] Fix hang i...
434
435
  	/* put any unprocessed entries back */
  	list_splice(&starved_list, &shost->starved_list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
436
437
438
439
  	spin_unlock_irqrestore(shost->host_lock, flags);
  
  	blk_run_queue(q);
  }
9937a5e2f   Jens Axboe   scsi: remove perf...
440
441
442
443
444
445
446
447
448
  void scsi_requeue_run_queue(struct work_struct *work)
  {
  	struct scsi_device *sdev;
  	struct request_queue *q;
  
  	sdev = container_of(work, struct scsi_device, requeue_work);
  	q = sdev->request_queue;
  	scsi_run_queue(q);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
  /*
   * Function:	scsi_requeue_command()
   *
   * Purpose:	Handle post-processing of completed commands.
   *
   * Arguments:	q	- queue to operate on
   *		cmd	- command that may need to be requeued.
   *
   * Returns:	Nothing
   *
   * Notes:	After command completion, there may be blocks left
   *		over which weren't finished by the previous command
   *		this can be for a number of reasons - the main one is
   *		I/O errors in the middle of the request, in which case
   *		we need to request the blocks that come after the bad
   *		sector.
e91442b63   James Bottomley   [SCSI] SCSI core:...
465
   * Notes:	Upon return, cmd is a stale pointer.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
466
467
468
   */
  static void scsi_requeue_command(struct request_queue *q, struct scsi_cmnd *cmd)
  {
e91442b63   James Bottomley   [SCSI] SCSI core:...
469
  	struct request *req = cmd->request;
283369ccc   Tejun Heo   [SCSI] make scsi_...
470
  	unsigned long flags;
283369ccc   Tejun Heo   [SCSI] make scsi_...
471
  	spin_lock_irqsave(q->queue_lock, flags);
02bd3499a   James Bottomley   [SCSI] scsi_lib: ...
472
  	scsi_unprep_request(req);
e91442b63   James Bottomley   [SCSI] SCSI core:...
473
  	blk_requeue_request(q, req);
283369ccc   Tejun Heo   [SCSI] make scsi_...
474
  	spin_unlock_irqrestore(q->queue_lock, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
475
476
477
478
479
480
  
  	scsi_run_queue(q);
  }
  
  void scsi_next_command(struct scsi_cmnd *cmd)
  {
49d7bc642   Linus Torvalds   Revert revert of ...
481
482
483
484
485
  	struct scsi_device *sdev = cmd->device;
  	struct request_queue *q = sdev->request_queue;
  
  	/* need to hold a reference on the device before we let go of the cmd */
  	get_device(&sdev->sdev_gendev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
486
487
488
  
  	scsi_put_command(cmd);
  	scsi_run_queue(q);
49d7bc642   Linus Torvalds   Revert revert of ...
489
490
491
  
  	/* ok to remove device now */
  	put_device(&sdev->sdev_gendev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
492
493
494
495
496
497
498
499
500
  }
  
  void scsi_run_host_queues(struct Scsi_Host *shost)
  {
  	struct scsi_device *sdev;
  
  	shost_for_each_device(sdev, shost)
  		scsi_run_queue(sdev->request_queue);
  }
79ed24297   James Bottomley   [SCSI] scsi_lib: ...
501
  static void __scsi_release_buffers(struct scsi_cmnd *, int);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
502
503
504
505
506
507
508
  /*
   * Function:    scsi_end_request()
   *
   * Purpose:     Post-processing of completed commands (usually invoked at end
   *		of upper level post-processing and scsi_io_completion).
   *
   * Arguments:   cmd	 - command that is complete.
610d8b0c9   Kiyoshi Ueda   blk_end_request: ...
509
   *              error    - 0 if I/O indicates success, < 0 for I/O error.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
510
511
512
513
514
   *              bytes    - number of bytes of completed I/O
   *		requeue  - indicates whether we should requeue leftovers.
   *
   * Lock status: Assumed that lock is not held upon entry.
   *
e91442b63   James Bottomley   [SCSI] SCSI core:...
515
   * Returns:     cmd if requeue required, NULL otherwise.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
516
517
518
519
520
521
   *
   * Notes:       This is called for block device requests in order to
   *              mark some number of sectors as complete.
   * 
   *		We are guaranteeing that the request queue will be goosed
   *		at some point during this call.
e91442b63   James Bottomley   [SCSI] SCSI core:...
522
   * Notes:	If cmd was requeued, upon return it will be a stale pointer.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
523
   */
610d8b0c9   Kiyoshi Ueda   blk_end_request: ...
524
  static struct scsi_cmnd *scsi_end_request(struct scsi_cmnd *cmd, int error,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
525
526
  					  int bytes, int requeue)
  {
165125e1e   Jens Axboe   [BLOCK] Get rid o...
527
  	struct request_queue *q = cmd->device->request_queue;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
528
  	struct request *req = cmd->request;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
529
530
531
532
533
  
  	/*
  	 * If there are blocks left over at the end, set up the command
  	 * to queue the remainder of them.
  	 */
610d8b0c9   Kiyoshi Ueda   blk_end_request: ...
534
  	if (blk_end_request(req, error, bytes)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
535
  		/* kill remainder if no retrys */
4a27446f3   Mike Christie   [SCSI] modify scs...
536
  		if (error && scsi_noretry_cmd(cmd))
e458824f9   Tejun Heo   scsi: fix resid_l...
537
  			blk_end_request_all(req, error);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
538
  		else {
e91442b63   James Bottomley   [SCSI] SCSI core:...
539
  			if (requeue) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
540
541
542
543
544
  				/*
  				 * Bleah.  Leftovers again.  Stick the
  				 * leftovers in the front of the
  				 * queue, and goose the queue again.
  				 */
79ed24297   James Bottomley   [SCSI] scsi_lib: ...
545
  				scsi_release_buffers(cmd);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
546
  				scsi_requeue_command(q, cmd);
e91442b63   James Bottomley   [SCSI] SCSI core:...
547
548
  				cmd = NULL;
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
549
550
551
  			return cmd;
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
552
553
554
555
  	/*
  	 * This will goose the queue request function at the end, so we don't
  	 * need to worry about launching another command.
  	 */
79ed24297   James Bottomley   [SCSI] scsi_lib: ...
556
  	__scsi_release_buffers(cmd, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
557
558
559
  	scsi_next_command(cmd);
  	return NULL;
  }
a8474ce23   Jens Axboe   SCSI: support for...
560
561
562
  static inline unsigned int scsi_sgtable_index(unsigned short nents)
  {
  	unsigned int index;
d3f46f39b   James Bottomley   [SCSI] remove use...
563
564
565
  	BUG_ON(nents > SCSI_MAX_SG_SEGMENTS);
  
  	if (nents <= 8)
a8474ce23   Jens Axboe   SCSI: support for...
566
  		index = 0;
d3f46f39b   James Bottomley   [SCSI] remove use...
567
568
  	else
  		index = get_count_order(nents) - 3;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
569

a8474ce23   Jens Axboe   SCSI: support for...
570
571
  	return index;
  }
5ed7959ed   Jens Axboe   SG: Convert SCSI ...
572
  static void scsi_sg_free(struct scatterlist *sgl, unsigned int nents)
a8474ce23   Jens Axboe   SCSI: support for...
573
574
  {
  	struct scsi_host_sg_pool *sgp;
a8474ce23   Jens Axboe   SCSI: support for...
575

5ed7959ed   Jens Axboe   SG: Convert SCSI ...
576
577
578
  	sgp = scsi_sg_pools + scsi_sgtable_index(nents);
  	mempool_free(sgl, sgp->pool);
  }
a8474ce23   Jens Axboe   SCSI: support for...
579

5ed7959ed   Jens Axboe   SG: Convert SCSI ...
580
581
582
  static struct scatterlist *scsi_sg_alloc(unsigned int nents, gfp_t gfp_mask)
  {
  	struct scsi_host_sg_pool *sgp;
a8474ce23   Jens Axboe   SCSI: support for...
583

5ed7959ed   Jens Axboe   SG: Convert SCSI ...
584
585
586
  	sgp = scsi_sg_pools + scsi_sgtable_index(nents);
  	return mempool_alloc(sgp->pool, gfp_mask);
  }
a3bec5c5a   Jens Axboe   Revert "[SCSI] Re...
587

30b0c37b2   Boaz Harrosh   [SCSI] implement ...
588
589
  static int scsi_alloc_sgtable(struct scsi_data_buffer *sdb, int nents,
  			      gfp_t gfp_mask)
5ed7959ed   Jens Axboe   SG: Convert SCSI ...
590
591
  {
  	int ret;
a8474ce23   Jens Axboe   SCSI: support for...
592

30b0c37b2   Boaz Harrosh   [SCSI] implement ...
593
  	BUG_ON(!nents);
a8474ce23   Jens Axboe   SCSI: support for...
594

30b0c37b2   Boaz Harrosh   [SCSI] implement ...
595
596
  	ret = __sg_alloc_table(&sdb->table, nents, SCSI_MAX_SG_SEGMENTS,
  			       gfp_mask, scsi_sg_alloc);
5ed7959ed   Jens Axboe   SG: Convert SCSI ...
597
  	if (unlikely(ret))
30b0c37b2   Boaz Harrosh   [SCSI] implement ...
598
  		__sg_free_table(&sdb->table, SCSI_MAX_SG_SEGMENTS,
7cedb1f17   James Bottomley   SG: work with the...
599
  				scsi_sg_free);
45711f1af   Jens Axboe   [SG] Update drive...
600

a8474ce23   Jens Axboe   SCSI: support for...
601
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
602
  }
30b0c37b2   Boaz Harrosh   [SCSI] implement ...
603
  static void scsi_free_sgtable(struct scsi_data_buffer *sdb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
604
  {
30b0c37b2   Boaz Harrosh   [SCSI] implement ...
605
  	__sg_free_table(&sdb->table, SCSI_MAX_SG_SEGMENTS, scsi_sg_free);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
606
  }
79ed24297   James Bottomley   [SCSI] scsi_lib: ...
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
  static void __scsi_release_buffers(struct scsi_cmnd *cmd, int do_bidi_check)
  {
  
  	if (cmd->sdb.table.nents)
  		scsi_free_sgtable(&cmd->sdb);
  
  	memset(&cmd->sdb, 0, sizeof(cmd->sdb));
  
  	if (do_bidi_check && scsi_bidi_cmnd(cmd)) {
  		struct scsi_data_buffer *bidi_sdb =
  			cmd->request->next_rq->special;
  		scsi_free_sgtable(bidi_sdb);
  		kmem_cache_free(scsi_sdb_cache, bidi_sdb);
  		cmd->request->next_rq->special = NULL;
  	}
  
  	if (scsi_prot_sg_count(cmd))
  		scsi_free_sgtable(cmd->prot_sdb);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
  /*
   * Function:    scsi_release_buffers()
   *
   * Purpose:     Completion processing for block device I/O requests.
   *
   * Arguments:   cmd	- command that we are bailing.
   *
   * Lock status: Assumed that no lock is held upon entry.
   *
   * Returns:     Nothing
   *
   * Notes:       In the event that an upper level driver rejects a
   *		command, we must release resources allocated during
   *		the __init_io() function.  Primarily this would involve
   *		the scatter-gather table, and potentially any bounce
   *		buffers.
   */
bb52d82f4   Boaz Harrosh   [SCSI] tgt: use s...
643
  void scsi_release_buffers(struct scsi_cmnd *cmd)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
644
  {
79ed24297   James Bottomley   [SCSI] scsi_lib: ...
645
  	__scsi_release_buffers(cmd, 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
646
  }
bb52d82f4   Boaz Harrosh   [SCSI] tgt: use s...
647
  EXPORT_SYMBOL(scsi_release_buffers);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
648

63583cca7   Hannes Reinecke   [SCSI] Add detail...
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
  static int __scsi_error_from_host_byte(struct scsi_cmnd *cmd, int result)
  {
  	int error = 0;
  
  	switch(host_byte(result)) {
  	case DID_TRANSPORT_FAILFAST:
  		error = -ENOLINK;
  		break;
  	case DID_TARGET_FAILURE:
  		cmd->result |= (DID_OK << 16);
  		error = -EREMOTEIO;
  		break;
  	case DID_NEXUS_FAILURE:
  		cmd->result |= (DID_OK << 16);
  		error = -EBADE;
  		break;
  	default:
  		error = -EIO;
  		break;
  	}
  
  	return error;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
  /*
   * Function:    scsi_io_completion()
   *
   * Purpose:     Completion processing for block device I/O requests.
   *
   * Arguments:   cmd   - command that is finished.
   *
   * Lock status: Assumed that no lock is held upon entry.
   *
   * Returns:     Nothing
   *
   * Notes:       This function is matched in terms of capabilities to
   *              the function that created the scatter-gather list.
   *              In other words, if there are no bounce buffers
   *              (the normal case for most drivers), we don't need
   *              the logic to deal with cleaning up afterwards.
   *
b60af5b0a   Alan Stern   [SCSI] simplify s...
689
690
691
692
693
   *		We must call scsi_end_request().  This will finish off
   *		the specified number of sectors.  If we are done, the
   *		command block will be released and the queue function
   *		will be goosed.  If we are not done then we have to
   *		figure out what to do next:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
694
   *
b60af5b0a   Alan Stern   [SCSI] simplify s...
695
696
697
698
699
   *		a) We can call scsi_requeue_command().  The request
   *		   will be unprepared and put back on the queue.  Then
   *		   a new command will be created for it.  This should
   *		   be used if we made forward progress, or if we want
   *		   to switch from READ(10) to READ(6) for example.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
700
   *
b60af5b0a   Alan Stern   [SCSI] simplify s...
701
702
703
704
705
706
   *		b) We can call scsi_queue_insert().  The request will
   *		   be put back on the queue and retried using the same
   *		   command as before, possibly after a delay.
   *
   *		c) We can call blk_end_request() with -EIO to fail
   *		   the remainder of the request.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
707
   */
03aba2f79   Luben Tuikov   [SCSI] sd/scsi_li...
708
  void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
709
710
  {
  	int result = cmd->result;
165125e1e   Jens Axboe   [BLOCK] Get rid o...
711
  	struct request_queue *q = cmd->device->request_queue;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
712
  	struct request *req = cmd->request;
fa8e36c39   James Bottomley   [SCSI] fix barrie...
713
  	int error = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
714
715
716
  	struct scsi_sense_hdr sshdr;
  	int sense_valid = 0;
  	int sense_deferred = 0;
b60af5b0a   Alan Stern   [SCSI] simplify s...
717
718
719
  	enum {ACTION_FAIL, ACTION_REPREP, ACTION_RETRY,
  	      ACTION_DELAYED_RETRY} action;
  	char *description = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
720

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
721
722
723
724
725
  	if (result) {
  		sense_valid = scsi_command_normalize_sense(cmd, &sshdr);
  		if (sense_valid)
  			sense_deferred = scsi_sense_is_deferred(&sshdr);
  	}
631c228cd   Christoph Hellwig   [SCSI] hide EH ba...
726

33659ebba   Christoph Hellwig   block: remove wra...
727
  	if (req->cmd_type == REQ_TYPE_BLOCK_PC) { /* SG_IO ioctl from block level */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
728
729
  		req->errors = result;
  		if (result) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
730
731
732
733
734
735
736
737
738
739
740
  			if (sense_valid && req->sense) {
  				/*
  				 * SG_IO wants current and deferred errors
  				 */
  				int len = 8 + cmd->sense_buffer[7];
  
  				if (len > SCSI_SENSE_BUFFERSIZE)
  					len = SCSI_SENSE_BUFFERSIZE;
  				memcpy(req->sense, cmd->sense_buffer,  len);
  				req->sense_len = len;
  			}
fa8e36c39   James Bottomley   [SCSI] fix barrie...
741
  			if (!sense_deferred)
63583cca7   Hannes Reinecke   [SCSI] Add detail...
742
  				error = __scsi_error_from_host_byte(cmd, result);
b22f687dd   Pete Wyckoff   [SCSI] set resid ...
743
  		}
e6bb7a96c   FUJITA Tomonori   scsi: simplify th...
744
745
  
  		req->resid_len = scsi_get_resid(cmd);
6f9a35e2d   Boaz Harrosh   [SCSI] bidirectio...
746
  		if (scsi_bidi_cmnd(cmd)) {
e6bb7a96c   FUJITA Tomonori   scsi: simplify th...
747
748
749
750
751
  			/*
  			 * Bidi commands Must be complete as a whole,
  			 * both sides at once.
  			 */
  			req->next_rq->resid_len = scsi_in(cmd)->resid;
63c43b0ec   Boaz Harrosh   [SCSI] scsi_lib: ...
752
  			scsi_release_buffers(cmd);
e6bb7a96c   FUJITA Tomonori   scsi: simplify th...
753
  			blk_end_request_all(req, 0);
e6bb7a96c   FUJITA Tomonori   scsi: simplify th...
754
  			scsi_next_command(cmd);
6f9a35e2d   Boaz Harrosh   [SCSI] bidirectio...
755
756
  			return;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
757
  	}
33659ebba   Christoph Hellwig   block: remove wra...
758
759
  	/* no bidi support for !REQ_TYPE_BLOCK_PC yet */
  	BUG_ON(blk_bidi_rq(req));
30b0c37b2   Boaz Harrosh   [SCSI] implement ...
760

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
761
  	/*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
762
763
764
  	 * Next deal with any sectors which we were able to correctly
  	 * handle.
  	 */
83096ebf1   Tejun Heo   block: convert to...
765
  	SCSI_LOG_HLCOMPLETE(1, printk("%u sectors total, "
d6b0c5372   James Bottomley   [SCSI] fix error ...
766
767
  				      "%d bytes done.
  ",
83096ebf1   Tejun Heo   block: convert to...
768
  				      blk_rq_sectors(req), good_bytes));
d6b0c5372   James Bottomley   [SCSI] fix error ...
769

a9bddd746   James Bottomley   [SCSI] fix recove...
770
771
772
773
774
775
  	/*
  	 * Recovered errors need reporting, but they're always treated
  	 * as success, so fiddle the result code here.  For BLOCK_PC
  	 * we already took a copy of the original into rq->errors which
  	 * is what gets returned to the user
  	 */
e7efe5932   Douglas Gilbert   [SCSI] skip sense...
776
777
778
779
780
781
782
783
  	if (sense_valid && (sshdr.sense_key == RECOVERED_ERROR)) {
  		/* if ATA PASS-THROUGH INFORMATION AVAILABLE skip
  		 * print since caller wants ATA registers. Only occurs on
  		 * SCSI ATA PASS_THROUGH commands when CK_COND=1
  		 */
  		if ((sshdr.asc == 0x0) && (sshdr.ascq == 0x1d))
  			;
  		else if (!(req->cmd_flags & REQ_QUIET))
a9bddd746   James Bottomley   [SCSI] fix recove...
784
785
786
787
788
789
790
791
  			scsi_print_sense("", cmd);
  		result = 0;
  		/* BLOCK_PC may have set error */
  		error = 0;
  	}
  
  	/*
  	 * A number of bytes were successfully read.  If there
d6b0c5372   James Bottomley   [SCSI] fix error ...
792
793
794
  	 * are leftovers and there is some kind of error
  	 * (result != 0), retry the rest.
  	 */
fa8e36c39   James Bottomley   [SCSI] fix barrie...
795
  	if (scsi_end_request(cmd, error, good_bytes, result == 0) == NULL)
d6b0c5372   James Bottomley   [SCSI] fix error ...
796
  		return;
03aba2f79   Luben Tuikov   [SCSI] sd/scsi_li...
797

63583cca7   Hannes Reinecke   [SCSI] Add detail...
798
  	error = __scsi_error_from_host_byte(cmd, result);
3e695f89c   Martin K. Petersen   [SCSI] Fix error ...
799

b60af5b0a   Alan Stern   [SCSI] simplify s...
800
801
802
803
804
805
806
  	if (host_byte(result) == DID_RESET) {
  		/* Third party bus reset or reset for error recovery
  		 * reasons.  Just retry the command and see what
  		 * happens.
  		 */
  		action = ACTION_RETRY;
  	} else if (sense_valid && !sense_deferred) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
807
808
809
  		switch (sshdr.sense_key) {
  		case UNIT_ATTENTION:
  			if (cmd->device->removable) {
03aba2f79   Luben Tuikov   [SCSI] sd/scsi_li...
810
  				/* Detected disc change.  Set a bit
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
811
812
813
  				 * and quietly refuse further access.
  				 */
  				cmd->device->changed = 1;
b60af5b0a   Alan Stern   [SCSI] simplify s...
814
815
  				description = "Media Changed";
  				action = ACTION_FAIL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
816
  			} else {
03aba2f79   Luben Tuikov   [SCSI] sd/scsi_li...
817
818
819
  				/* Must have been a power glitch, or a
  				 * bus reset.  Could not have been a
  				 * media change, so we just retry the
b60af5b0a   Alan Stern   [SCSI] simplify s...
820
  				 * command and see what happens.
03aba2f79   Luben Tuikov   [SCSI] sd/scsi_li...
821
  				 */
b60af5b0a   Alan Stern   [SCSI] simplify s...
822
  				action = ACTION_RETRY;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
823
824
825
  			}
  			break;
  		case ILLEGAL_REQUEST:
03aba2f79   Luben Tuikov   [SCSI] sd/scsi_li...
826
827
828
829
830
831
832
833
  			/* If we had an ILLEGAL REQUEST returned, then
  			 * we may have performed an unsupported
  			 * command.  The only thing this should be
  			 * would be a ten byte read where only a six
  			 * byte read was supported.  Also, on a system
  			 * where READ CAPACITY failed, we may have
  			 * read past the end of the disk.
  			 */
26a68019c   Jens Axboe   [SCSI] scsi_lib: ...
834
835
  			if ((cmd->device->use_10_for_rw &&
  			    sshdr.asc == 0x20 && sshdr.ascq == 0x00) &&
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
836
837
  			    (cmd->cmnd[0] == READ_10 ||
  			     cmd->cmnd[0] == WRITE_10)) {
b60af5b0a   Alan Stern   [SCSI] simplify s...
838
  				/* This will issue a new 6-byte command. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
839
  				cmd->device->use_10_for_rw = 0;
b60af5b0a   Alan Stern   [SCSI] simplify s...
840
  				action = ACTION_REPREP;
3e695f89c   Martin K. Petersen   [SCSI] Fix error ...
841
842
843
844
  			} else if (sshdr.asc == 0x10) /* DIX */ {
  				description = "Host Data Integrity Failure";
  				action = ACTION_FAIL;
  				error = -EILSEQ;
c98a0eb0e   Martin K. Petersen   [SCSI] sd: Logica...
845
846
847
848
849
850
851
  			/* INVALID COMMAND OPCODE or INVALID FIELD IN CDB */
  			} else if ((sshdr.asc == 0x20 || sshdr.asc == 0x24) &&
  				   (cmd->cmnd[0] == UNMAP ||
  				    cmd->cmnd[0] == WRITE_SAME_16 ||
  				    cmd->cmnd[0] == WRITE_SAME)) {
  				description = "Discard failure";
  				action = ACTION_FAIL;
b60af5b0a   Alan Stern   [SCSI] simplify s...
852
853
854
  			} else
  				action = ACTION_FAIL;
  			break;
511e44f42   Martin K. Petersen   [SCSI] Do not ret...
855
  		case ABORTED_COMMAND:
126c09829   James Bottomley   [SCSI] fix ABORTE...
856
  			action = ACTION_FAIL;
511e44f42   Martin K. Petersen   [SCSI] Do not ret...
857
  			if (sshdr.asc == 0x10) { /* DIF */
3e695f89c   Martin K. Petersen   [SCSI] Fix error ...
858
  				description = "Target Data Integrity Failure";
3e695f89c   Martin K. Petersen   [SCSI] Fix error ...
859
  				error = -EILSEQ;
126c09829   James Bottomley   [SCSI] fix ABORTE...
860
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
861
862
  			break;
  		case NOT_READY:
03aba2f79   Luben Tuikov   [SCSI] sd/scsi_li...
863
  			/* If the device is in the process of becoming
f3e93f735   James Bottomley   [SCSI] Fix DVD bu...
864
  			 * ready, or has a temporary blockage, retry.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
865
  			 */
f3e93f735   James Bottomley   [SCSI] Fix DVD bu...
866
867
868
869
870
871
872
873
874
  			if (sshdr.asc == 0x04) {
  				switch (sshdr.ascq) {
  				case 0x01: /* becoming ready */
  				case 0x04: /* format in progress */
  				case 0x05: /* rebuild in progress */
  				case 0x06: /* recalculation in progress */
  				case 0x07: /* operation in progress */
  				case 0x08: /* Long write in progress */
  				case 0x09: /* self test in progress */
d8705f11d   Martin K. Petersen   [SCSI] Correctly ...
875
  				case 0x14: /* space allocation in progress */
b60af5b0a   Alan Stern   [SCSI] simplify s...
876
  					action = ACTION_DELAYED_RETRY;
f3e93f735   James Bottomley   [SCSI] Fix DVD bu...
877
  					break;
3dbf6a540   Alan Stern   [SCSI] Fix uninit...
878
879
880
881
  				default:
  					description = "Device not ready";
  					action = ACTION_FAIL;
  					break;
f3e93f735   James Bottomley   [SCSI] Fix DVD bu...
882
  				}
b60af5b0a   Alan Stern   [SCSI] simplify s...
883
884
885
  			} else {
  				description = "Device not ready";
  				action = ACTION_FAIL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
886
  			}
b60af5b0a   Alan Stern   [SCSI] simplify s...
887
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
888
  		case VOLUME_OVERFLOW:
03aba2f79   Luben Tuikov   [SCSI] sd/scsi_li...
889
  			/* See SSC3rXX or current. */
b60af5b0a   Alan Stern   [SCSI] simplify s...
890
891
  			action = ACTION_FAIL;
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
892
  		default:
b60af5b0a   Alan Stern   [SCSI] simplify s...
893
894
  			description = "Unhandled sense code";
  			action = ACTION_FAIL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
895
896
  			break;
  		}
b60af5b0a   Alan Stern   [SCSI] simplify s...
897
898
899
  	} else {
  		description = "Unhandled error code";
  		action = ACTION_FAIL;
03aba2f79   Luben Tuikov   [SCSI] sd/scsi_li...
900
  	}
b60af5b0a   Alan Stern   [SCSI] simplify s...
901
902
903
904
  
  	switch (action) {
  	case ACTION_FAIL:
  		/* Give up and fail the remainder of the request */
79ed24297   James Bottomley   [SCSI] scsi_lib: ...
905
  		scsi_release_buffers(cmd);
4aff5e233   Jens Axboe   [PATCH] Split str...
906
  		if (!(req->cmd_flags & REQ_QUIET)) {
b60af5b0a   Alan Stern   [SCSI] simplify s...
907
  			if (description)
3dbf6a540   Alan Stern   [SCSI] Fix uninit...
908
909
  				scmd_printk(KERN_INFO, cmd, "%s
  ",
b60af5b0a   Alan Stern   [SCSI] simplify s...
910
  					    description);
a4d04a4cd   Martin K. Petersen   [SCSI] Make error...
911
  			scsi_print_result(cmd);
3173d8c34   James Bottomley   [SCSI] quieten me...
912
913
  			if (driver_byte(result) & DRIVER_SENSE)
  				scsi_print_sense("", cmd);
002b1eb2c   Martin K. Petersen   [SCSI] Print fail...
914
  			scsi_print_command(cmd);
3173d8c34   James Bottomley   [SCSI] quieten me...
915
  		}
ad6308262   Mike Christie   [SCSI] fix propog...
916
  		if (blk_end_request_err(req, error))
da6c5c720   Tejun Heo   scsi,block: updat...
917
918
919
  			scsi_requeue_command(q, cmd);
  		else
  			scsi_next_command(cmd);
b60af5b0a   Alan Stern   [SCSI] simplify s...
920
921
922
923
924
  		break;
  	case ACTION_REPREP:
  		/* Unprep the request and put it back at the head of the queue.
  		 * A new command will be prepared and issued.
  		 */
79ed24297   James Bottomley   [SCSI] scsi_lib: ...
925
  		scsi_release_buffers(cmd);
b60af5b0a   Alan Stern   [SCSI] simplify s...
926
927
928
929
  		scsi_requeue_command(q, cmd);
  		break;
  	case ACTION_RETRY:
  		/* Retry the same command immediately */
4f5299ac4   James Bottomley   [SCSI] scsi_lib: ...
930
  		__scsi_queue_insert(cmd, SCSI_MLQUEUE_EH_RETRY, 0);
b60af5b0a   Alan Stern   [SCSI] simplify s...
931
932
933
  		break;
  	case ACTION_DELAYED_RETRY:
  		/* Retry the same command after a delay */
4f5299ac4   James Bottomley   [SCSI] scsi_lib: ...
934
  		__scsi_queue_insert(cmd, SCSI_MLQUEUE_DEVICE_BUSY, 0);
b60af5b0a   Alan Stern   [SCSI] simplify s...
935
  		break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
936
937
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
938

6f9a35e2d   Boaz Harrosh   [SCSI] bidirectio...
939
940
  static int scsi_init_sgtable(struct request *req, struct scsi_data_buffer *sdb,
  			     gfp_t gfp_mask)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
941
  {
6f9a35e2d   Boaz Harrosh   [SCSI] bidirectio...
942
  	int count;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
943
944
  
  	/*
3b0031579   Christoph Hellwig   [SCSI] untangle s...
945
  	 * If sg table allocation fails, requeue request later.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
946
  	 */
30b0c37b2   Boaz Harrosh   [SCSI] implement ...
947
948
  	if (unlikely(scsi_alloc_sgtable(sdb, req->nr_phys_segments,
  					gfp_mask))) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
949
  		return BLKPREP_DEFER;
7c72ce818   Alan Stern   [SCSI] Fix leak o...
950
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
951

3b0031579   Christoph Hellwig   [SCSI] untangle s...
952
  	req->buffer = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
953
954
955
956
957
  
  	/* 
  	 * Next, walk the list, and fill in the addresses and sizes of
  	 * each segment.
  	 */
30b0c37b2   Boaz Harrosh   [SCSI] implement ...
958
959
960
  	count = blk_rq_map_sg(req->q, req, sdb->table.sgl);
  	BUG_ON(count > sdb->table.nents);
  	sdb->table.nents = count;
1011c1b9f   Tejun Heo   block: blk_rq_[cu...
961
  	sdb->length = blk_rq_bytes(req);
4a03d90e3   Rusty Russell   [SCSI] BUG_ON() i...
962
  	return BLKPREP_OK;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
963
  }
6f9a35e2d   Boaz Harrosh   [SCSI] bidirectio...
964
965
966
967
968
969
970
971
972
973
974
975
976
977
  
  /*
   * Function:    scsi_init_io()
   *
   * Purpose:     SCSI I/O initialize function.
   *
   * Arguments:   cmd   - Command descriptor we wish to initialize
   *
   * Returns:     0 on success
   *		BLKPREP_DEFER if the failure is retryable
   *		BLKPREP_KILL if the failure is fatal
   */
  int scsi_init_io(struct scsi_cmnd *cmd, gfp_t gfp_mask)
  {
13f05c8d8   Martin K. Petersen   block/scsi: Provi...
978
979
980
  	struct request *rq = cmd->request;
  
  	int error = scsi_init_sgtable(rq, &cmd->sdb, gfp_mask);
6f9a35e2d   Boaz Harrosh   [SCSI] bidirectio...
981
982
  	if (error)
  		goto err_exit;
13f05c8d8   Martin K. Petersen   block/scsi: Provi...
983
  	if (blk_bidi_rq(rq)) {
6f9a35e2d   Boaz Harrosh   [SCSI] bidirectio...
984
  		struct scsi_data_buffer *bidi_sdb = kmem_cache_zalloc(
6362abd3e   Martin K. Petersen   [SCSI] Rename scs...
985
  			scsi_sdb_cache, GFP_ATOMIC);
6f9a35e2d   Boaz Harrosh   [SCSI] bidirectio...
986
987
988
989
  		if (!bidi_sdb) {
  			error = BLKPREP_DEFER;
  			goto err_exit;
  		}
13f05c8d8   Martin K. Petersen   block/scsi: Provi...
990
991
  		rq->next_rq->special = bidi_sdb;
  		error = scsi_init_sgtable(rq->next_rq, bidi_sdb, GFP_ATOMIC);
6f9a35e2d   Boaz Harrosh   [SCSI] bidirectio...
992
993
994
  		if (error)
  			goto err_exit;
  	}
13f05c8d8   Martin K. Petersen   block/scsi: Provi...
995
  	if (blk_integrity_rq(rq)) {
7027ad72a   Martin K. Petersen   [SCSI] Support de...
996
997
998
999
  		struct scsi_data_buffer *prot_sdb = cmd->prot_sdb;
  		int ivecs, count;
  
  		BUG_ON(prot_sdb == NULL);
13f05c8d8   Martin K. Petersen   block/scsi: Provi...
1000
  		ivecs = blk_rq_count_integrity_sg(rq->q, rq->bio);
7027ad72a   Martin K. Petersen   [SCSI] Support de...
1001
1002
1003
1004
1005
  
  		if (scsi_alloc_sgtable(prot_sdb, ivecs, gfp_mask)) {
  			error = BLKPREP_DEFER;
  			goto err_exit;
  		}
13f05c8d8   Martin K. Petersen   block/scsi: Provi...
1006
  		count = blk_rq_map_integrity_sg(rq->q, rq->bio,
7027ad72a   Martin K. Petersen   [SCSI] Support de...
1007
1008
  						prot_sdb->table.sgl);
  		BUG_ON(unlikely(count > ivecs));
13f05c8d8   Martin K. Petersen   block/scsi: Provi...
1009
  		BUG_ON(unlikely(count > queue_max_integrity_segments(rq->q)));
7027ad72a   Martin K. Petersen   [SCSI] Support de...
1010
1011
1012
1013
  
  		cmd->prot_sdb = prot_sdb;
  		cmd->prot_sdb->table.nents = count;
  	}
6f9a35e2d   Boaz Harrosh   [SCSI] bidirectio...
1014
1015
1016
1017
  	return BLKPREP_OK ;
  
  err_exit:
  	scsi_release_buffers(cmd);
610a63498   FUJITA Tomonori   scsi: fix discard...
1018
  	cmd->request->special = NULL;
3a5c19c23   James Bottomley   [SCSI] fix use-af...
1019
  	scsi_put_command(cmd);
6f9a35e2d   Boaz Harrosh   [SCSI] bidirectio...
1020
1021
  	return error;
  }
bb52d82f4   Boaz Harrosh   [SCSI] tgt: use s...
1022
  EXPORT_SYMBOL(scsi_init_io);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1023

3b0031579   Christoph Hellwig   [SCSI] untangle s...
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
  static struct scsi_cmnd *scsi_get_cmd_from_req(struct scsi_device *sdev,
  		struct request *req)
  {
  	struct scsi_cmnd *cmd;
  
  	if (!req->special) {
  		cmd = scsi_get_command(sdev, GFP_ATOMIC);
  		if (unlikely(!cmd))
  			return NULL;
  		req->special = cmd;
  	} else {
  		cmd = req->special;
  	}
  
  	/* pull a tag out of the request if we have one */
  	cmd->tag = req->tag;
  	cmd->request = req;
64a87b244   Boaz Harrosh   [SCSI] Let scsi_c...
1041
  	cmd->cmnd = req->cmd;
72f7d322f   Martin K. Petersen   [SCSI] Include pr...
1042
  	cmd->prot_op = SCSI_PROT_NORMAL;
64a87b244   Boaz Harrosh   [SCSI] Let scsi_c...
1043

3b0031579   Christoph Hellwig   [SCSI] untangle s...
1044
1045
  	return cmd;
  }
7f9a6bc4e   James Bottomley   [SCSI] move ULD a...
1046
  int scsi_setup_blk_pc_cmnd(struct scsi_device *sdev, struct request *req)
7b16318de   James Bottomley   Fix up SCSI mismerge
1047
  {
3b0031579   Christoph Hellwig   [SCSI] untangle s...
1048
  	struct scsi_cmnd *cmd;
7f9a6bc4e   James Bottomley   [SCSI] move ULD a...
1049
1050
1051
1052
  	int ret = scsi_prep_state_check(sdev, req);
  
  	if (ret != BLKPREP_OK)
  		return ret;
3b0031579   Christoph Hellwig   [SCSI] untangle s...
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
  
  	cmd = scsi_get_cmd_from_req(sdev, req);
  	if (unlikely(!cmd))
  		return BLKPREP_DEFER;
  
  	/*
  	 * BLOCK_PC requests may transfer data, in which case they must
  	 * a bio attached to them.  Or they might contain a SCSI command
  	 * that does not transfer data, in which case they may optionally
  	 * submit a request without an attached bio.
  	 */
  	if (req->bio) {
  		int ret;
  
  		BUG_ON(!req->nr_phys_segments);
bb52d82f4   Boaz Harrosh   [SCSI] tgt: use s...
1068
  		ret = scsi_init_io(cmd, GFP_ATOMIC);
3b0031579   Christoph Hellwig   [SCSI] untangle s...
1069
1070
1071
  		if (unlikely(ret))
  			return ret;
  	} else {
b07904103   Tejun Heo   block: cleanup rq...
1072
  		BUG_ON(blk_rq_bytes(req));
3b0031579   Christoph Hellwig   [SCSI] untangle s...
1073

30b0c37b2   Boaz Harrosh   [SCSI] implement ...
1074
  		memset(&cmd->sdb, 0, sizeof(cmd->sdb));
3b0031579   Christoph Hellwig   [SCSI] untangle s...
1075
1076
  		req->buffer = NULL;
  	}
7b16318de   James Bottomley   Fix up SCSI mismerge
1077

7b16318de   James Bottomley   Fix up SCSI mismerge
1078
  	cmd->cmd_len = req->cmd_len;
b07904103   Tejun Heo   block: cleanup rq...
1079
  	if (!blk_rq_bytes(req))
7b16318de   James Bottomley   Fix up SCSI mismerge
1080
1081
1082
1083
1084
1085
  		cmd->sc_data_direction = DMA_NONE;
  	else if (rq_data_dir(req) == WRITE)
  		cmd->sc_data_direction = DMA_TO_DEVICE;
  	else
  		cmd->sc_data_direction = DMA_FROM_DEVICE;
  	
b07904103   Tejun Heo   block: cleanup rq...
1086
  	cmd->transfersize = blk_rq_bytes(req);
7b16318de   James Bottomley   Fix up SCSI mismerge
1087
  	cmd->allowed = req->retries;
3b0031579   Christoph Hellwig   [SCSI] untangle s...
1088
  	return BLKPREP_OK;
7b16318de   James Bottomley   Fix up SCSI mismerge
1089
  }
7f9a6bc4e   James Bottomley   [SCSI] move ULD a...
1090
  EXPORT_SYMBOL(scsi_setup_blk_pc_cmnd);
7b16318de   James Bottomley   Fix up SCSI mismerge
1091

3b0031579   Christoph Hellwig   [SCSI] untangle s...
1092
1093
1094
1095
1096
  /*
   * Setup a REQ_TYPE_FS command.  These are simple read/write request
   * from filesystems that still need to be translated to SCSI CDBs from
   * the ULD.
   */
7f9a6bc4e   James Bottomley   [SCSI] move ULD a...
1097
  int scsi_setup_fs_cmnd(struct scsi_device *sdev, struct request *req)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1098
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1099
  	struct scsi_cmnd *cmd;
7f9a6bc4e   James Bottomley   [SCSI] move ULD a...
1100
  	int ret = scsi_prep_state_check(sdev, req);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1101

7f9a6bc4e   James Bottomley   [SCSI] move ULD a...
1102
1103
  	if (ret != BLKPREP_OK)
  		return ret;
a6a8d9f87   Chandra Seetharaman   [SCSI] scsi_dh: a...
1104
1105
1106
1107
1108
1109
1110
  
  	if (unlikely(sdev->scsi_dh_data && sdev->scsi_dh_data->scsi_dh
  			 && sdev->scsi_dh_data->scsi_dh->prep_fn)) {
  		ret = sdev->scsi_dh_data->scsi_dh->prep_fn(sdev, req);
  		if (ret != BLKPREP_OK)
  			return ret;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1111
  	/*
3b0031579   Christoph Hellwig   [SCSI] untangle s...
1112
  	 * Filesystem requests must transfer data.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1113
  	 */
3b0031579   Christoph Hellwig   [SCSI] untangle s...
1114
1115
1116
1117
1118
  	BUG_ON(!req->nr_phys_segments);
  
  	cmd = scsi_get_cmd_from_req(sdev, req);
  	if (unlikely(!cmd))
  		return BLKPREP_DEFER;
64a87b244   Boaz Harrosh   [SCSI] Let scsi_c...
1119
  	memset(cmd->cmnd, 0, BLK_MAX_CDB);
bb52d82f4   Boaz Harrosh   [SCSI] tgt: use s...
1120
  	return scsi_init_io(cmd, GFP_ATOMIC);
3b0031579   Christoph Hellwig   [SCSI] untangle s...
1121
  }
7f9a6bc4e   James Bottomley   [SCSI] move ULD a...
1122
  EXPORT_SYMBOL(scsi_setup_fs_cmnd);
3b0031579   Christoph Hellwig   [SCSI] untangle s...
1123

7f9a6bc4e   James Bottomley   [SCSI] move ULD a...
1124
  int scsi_prep_state_check(struct scsi_device *sdev, struct request *req)
3b0031579   Christoph Hellwig   [SCSI] untangle s...
1125
  {
3b0031579   Christoph Hellwig   [SCSI] untangle s...
1126
  	int ret = BLKPREP_OK;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1127
  	/*
3b0031579   Christoph Hellwig   [SCSI] untangle s...
1128
1129
  	 * If the device is not in running state we will reject some
  	 * or all commands.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1130
  	 */
3b0031579   Christoph Hellwig   [SCSI] untangle s...
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
  	if (unlikely(sdev->sdev_state != SDEV_RUNNING)) {
  		switch (sdev->sdev_state) {
  		case SDEV_OFFLINE:
  			/*
  			 * If the device is offline we refuse to process any
  			 * commands.  The device must be brought online
  			 * before trying any recovery commands.
  			 */
  			sdev_printk(KERN_ERR, sdev,
  				    "rejecting I/O to offline device
  ");
  			ret = BLKPREP_KILL;
  			break;
  		case SDEV_DEL:
  			/*
  			 * If the device is fully deleted, we refuse to
  			 * process any commands as well.
  			 */
9ccfc756a   James Bottomley   [SCSI] move the m...
1149
  			sdev_printk(KERN_ERR, sdev,
3b0031579   Christoph Hellwig   [SCSI] untangle s...
1150
1151
1152
1153
1154
1155
  				    "rejecting I/O to dead device
  ");
  			ret = BLKPREP_KILL;
  			break;
  		case SDEV_QUIESCE:
  		case SDEV_BLOCK:
6f4267e3b   James Bottomley   [SCSI] Update the...
1156
  		case SDEV_CREATED_BLOCK:
3b0031579   Christoph Hellwig   [SCSI] untangle s...
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
  			/*
  			 * If the devices is blocked we defer normal commands.
  			 */
  			if (!(req->cmd_flags & REQ_PREEMPT))
  				ret = BLKPREP_DEFER;
  			break;
  		default:
  			/*
  			 * For any other not fully online state we only allow
  			 * special commands.  In particular any user initiated
  			 * command is not allowed.
  			 */
  			if (!(req->cmd_flags & REQ_PREEMPT))
  				ret = BLKPREP_KILL;
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1172
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1173
  	}
7f9a6bc4e   James Bottomley   [SCSI] move ULD a...
1174
1175
1176
  	return ret;
  }
  EXPORT_SYMBOL(scsi_prep_state_check);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1177

7f9a6bc4e   James Bottomley   [SCSI] move ULD a...
1178
1179
1180
  int scsi_prep_return(struct request_queue *q, struct request *req, int ret)
  {
  	struct scsi_device *sdev = q->queuedata;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1181

3b0031579   Christoph Hellwig   [SCSI] untangle s...
1182
1183
1184
  	switch (ret) {
  	case BLKPREP_KILL:
  		req->errors = DID_NO_CONNECT << 16;
7f9a6bc4e   James Bottomley   [SCSI] move ULD a...
1185
1186
1187
1188
1189
1190
1191
  		/* release the command and kill it */
  		if (req->special) {
  			struct scsi_cmnd *cmd = req->special;
  			scsi_release_buffers(cmd);
  			scsi_put_command(cmd);
  			req->special = NULL;
  		}
3b0031579   Christoph Hellwig   [SCSI] untangle s...
1192
1193
  		break;
  	case BLKPREP_DEFER:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1194
  		/*
9934c8c04   Tejun Heo   block: implement ...
1195
  		 * If we defer, the blk_peek_request() returns NULL, but the
a488e7497   Jens Axboe   scsi: convert to ...
1196
1197
  		 * queue must be restarted, so we schedule a callback to happen
  		 * shortly.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1198
  		 */
3b0031579   Christoph Hellwig   [SCSI] untangle s...
1199
  		if (sdev->device_busy == 0)
a488e7497   Jens Axboe   scsi: convert to ...
1200
  			blk_delay_queue(q, SCSI_QUEUE_DELAY);
3b0031579   Christoph Hellwig   [SCSI] untangle s...
1201
1202
1203
  		break;
  	default:
  		req->cmd_flags |= REQ_DONTPREP;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1204
  	}
3b0031579   Christoph Hellwig   [SCSI] untangle s...
1205
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1206
  }
7f9a6bc4e   James Bottomley   [SCSI] move ULD a...
1207
  EXPORT_SYMBOL(scsi_prep_return);
751bf4d78   James Bottomley   [SCSI] scsi_sysfs...
1208
  int scsi_prep_fn(struct request_queue *q, struct request *req)
7f9a6bc4e   James Bottomley   [SCSI] move ULD a...
1209
1210
1211
1212
1213
1214
1215
1216
  {
  	struct scsi_device *sdev = q->queuedata;
  	int ret = BLKPREP_KILL;
  
  	if (req->cmd_type == REQ_TYPE_BLOCK_PC)
  		ret = scsi_setup_blk_pc_cmnd(sdev, req);
  	return scsi_prep_return(q, req, ret);
  }
b391277a5   Hannes Reinecke   sd, sr: fix Drive...
1217
  EXPORT_SYMBOL(scsi_prep_fn);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
  
  /*
   * scsi_dev_queue_ready: if we can send requests to sdev, return 1 else
   * return 0.
   *
   * Called with the queue_lock held.
   */
  static inline int scsi_dev_queue_ready(struct request_queue *q,
  				  struct scsi_device *sdev)
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1228
1229
1230
1231
1232
1233
  	if (sdev->device_busy == 0 && sdev->device_blocked) {
  		/*
  		 * unblock after device_blocked iterates to zero
  		 */
  		if (--sdev->device_blocked == 0) {
  			SCSI_LOG_MLQUEUE(3,
9ccfc756a   James Bottomley   [SCSI] move the m...
1234
1235
1236
  				   sdev_printk(KERN_INFO, sdev,
  				   "unblocking device at zero depth
  "));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1237
  		} else {
a488e7497   Jens Axboe   scsi: convert to ...
1238
  			blk_delay_queue(q, SCSI_QUEUE_DELAY);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1239
1240
1241
  			return 0;
  		}
  	}
9d1125170   Kiyoshi Ueda   [SCSI] refactor s...
1242
  	if (scsi_device_is_busy(sdev))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1243
1244
1245
1246
  		return 0;
  
  	return 1;
  }
f0c0a376d   Mike Christie   [SCSI] Add helper...
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
  
  /*
   * scsi_target_queue_ready: checks if there we can send commands to target
   * @sdev: scsi device on starget to check.
   *
   * Called with the host lock held.
   */
  static inline int scsi_target_queue_ready(struct Scsi_Host *shost,
  					   struct scsi_device *sdev)
  {
  	struct scsi_target *starget = scsi_target(sdev);
  
  	if (starget->single_lun) {
  		if (starget->starget_sdev_user &&
  		    starget->starget_sdev_user != sdev)
  			return 0;
  		starget->starget_sdev_user = sdev;
  	}
  
  	if (starget->target_busy == 0 && starget->target_blocked) {
  		/*
  		 * unblock after target_blocked iterates to zero
  		 */
  		if (--starget->target_blocked == 0) {
  			SCSI_LOG_MLQUEUE(3, starget_printk(KERN_INFO, starget,
  					 "unblocking target at zero depth
  "));
b4efdd586   Mike Christie   [SCSI] fix q->loc...
1274
  		} else
f0c0a376d   Mike Christie   [SCSI] Add helper...
1275
  			return 0;
f0c0a376d   Mike Christie   [SCSI] Add helper...
1276
1277
1278
  	}
  
  	if (scsi_target_is_busy(starget)) {
fd01a6632   Hillf Danton   [SCSI] fix the re...
1279
  		if (list_empty(&sdev->starved_entry))
f0c0a376d   Mike Christie   [SCSI] Add helper...
1280
1281
  			list_add_tail(&sdev->starved_entry,
  				      &shost->starved_list);
fd01a6632   Hillf Danton   [SCSI] fix the re...
1282
  		return 0;
f0c0a376d   Mike Christie   [SCSI] Add helper...
1283
1284
1285
1286
1287
1288
1289
  	}
  
  	/* We're OK to process the command, so we can't be starved */
  	if (!list_empty(&sdev->starved_entry))
  		list_del_init(&sdev->starved_entry);
  	return 1;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
  /*
   * scsi_host_queue_ready: if we can send requests to shost, return 1 else
   * return 0. We must end up running the queue again whenever 0 is
   * returned, else IO can hang.
   *
   * Called with host_lock held.
   */
  static inline int scsi_host_queue_ready(struct request_queue *q,
  				   struct Scsi_Host *shost,
  				   struct scsi_device *sdev)
  {
939647ee3   James Bottomley   [SCSI] fix oops o...
1301
  	if (scsi_host_in_recovery(shost))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
  		return 0;
  	if (shost->host_busy == 0 && shost->host_blocked) {
  		/*
  		 * unblock after host_blocked iterates to zero
  		 */
  		if (--shost->host_blocked == 0) {
  			SCSI_LOG_MLQUEUE(3,
  				printk("scsi%d unblocking host at zero depth
  ",
  					shost->host_no));
  		} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1313
1314
1315
  			return 0;
  		}
  	}
9d1125170   Kiyoshi Ueda   [SCSI] refactor s...
1316
  	if (scsi_host_is_busy(shost)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
  		if (list_empty(&sdev->starved_entry))
  			list_add_tail(&sdev->starved_entry, &shost->starved_list);
  		return 0;
  	}
  
  	/* We're OK to process the command, so we can't be starved */
  	if (!list_empty(&sdev->starved_entry))
  		list_del_init(&sdev->starved_entry);
  
  	return 1;
  }
  
  /*
6c5121b78   Kiyoshi Ueda   [SCSI] export bus...
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
   * Busy state exporting function for request stacking drivers.
   *
   * For efficiency, no lock is taken to check the busy state of
   * shost/starget/sdev, since the returned value is not guaranteed and
   * may be changed after request stacking drivers call the function,
   * regardless of taking lock or not.
   *
   * When scsi can't dispatch I/Os anymore and needs to kill I/Os
   * (e.g. !sdev), scsi needs to return 'not busy'.
   * Otherwise, request stacking drivers may hold requests forever.
   */
  static int scsi_lld_busy(struct request_queue *q)
  {
  	struct scsi_device *sdev = q->queuedata;
  	struct Scsi_Host *shost;
  	struct scsi_target *starget;
  
  	if (!sdev)
  		return 0;
  
  	shost = sdev->host;
  	starget = scsi_target(sdev);
  
  	if (scsi_host_in_recovery(shost) || scsi_host_is_busy(shost) ||
  	    scsi_target_is_busy(starget) || scsi_device_is_busy(sdev))
  		return 1;
  
  	return 0;
  }
  
  /*
e91442b63   James Bottomley   [SCSI] SCSI core:...
1361
   * Kill a request for a dead device
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1362
   */
165125e1e   Jens Axboe   [BLOCK] Get rid o...
1363
  static void scsi_kill_request(struct request *req, struct request_queue *q)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1364
  {
e91442b63   James Bottomley   [SCSI] SCSI core:...
1365
  	struct scsi_cmnd *cmd = req->special;
03b147083   Jiri Slaby   [SCSI] scsi_lib: ...
1366
1367
1368
  	struct scsi_device *sdev;
  	struct scsi_target *starget;
  	struct Scsi_Host *shost;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1369

9934c8c04   Tejun Heo   block: implement ...
1370
  	blk_start_request(req);
788ce43aa   James Bottomley   [SCSI] SCSI core:...
1371

745718132   Hannes Reinecke   [SCSI] Silencing ...
1372
1373
  	scmd_printk(KERN_INFO, cmd, "killing request
  ");
03b147083   Jiri Slaby   [SCSI] scsi_lib: ...
1374
1375
1376
  	sdev = cmd->device;
  	starget = scsi_target(sdev);
  	shost = sdev->host;
e91442b63   James Bottomley   [SCSI] SCSI core:...
1377
1378
1379
  	scsi_init_cmd_errh(cmd);
  	cmd->result = DID_NO_CONNECT << 16;
  	atomic_inc(&cmd->device->iorequest_cnt);
e36e0c801   Tejun Heo   [SCSI] SCSI: fix ...
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
  
  	/*
  	 * SCSI request completion path will do scsi_device_unbusy(),
  	 * bump busy counts.  To bump the counters, we need to dance
  	 * with the locks as normal issue path does.
  	 */
  	sdev->device_busy++;
  	spin_unlock(sdev->request_queue->queue_lock);
  	spin_lock(shost->host_lock);
  	shost->host_busy++;
f0c0a376d   Mike Christie   [SCSI] Add helper...
1390
  	starget->target_busy++;
e36e0c801   Tejun Heo   [SCSI] SCSI: fix ...
1391
1392
  	spin_unlock(shost->host_lock);
  	spin_lock(sdev->request_queue->queue_lock);
242f9dcb8   Jens Axboe   block: unify requ...
1393
  	blk_complete_request(req);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1394
  }
1aea6434e   Jens Axboe   [SCSI] Kill the S...
1395
1396
  static void scsi_softirq_done(struct request *rq)
  {
242f9dcb8   Jens Axboe   block: unify requ...
1397
1398
  	struct scsi_cmnd *cmd = rq->special;
  	unsigned long wait_for = (cmd->allowed + 1) * rq->timeout;
1aea6434e   Jens Axboe   [SCSI] Kill the S...
1399
1400
1401
  	int disposition;
  
  	INIT_LIST_HEAD(&cmd->eh_entry);
242f9dcb8   Jens Axboe   block: unify requ...
1402
1403
1404
  	atomic_inc(&cmd->device->iodone_cnt);
  	if (cmd->result)
  		atomic_inc(&cmd->device->ioerr_cnt);
1aea6434e   Jens Axboe   [SCSI] Kill the S...
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
  	disposition = scsi_decide_disposition(cmd);
  	if (disposition != SUCCESS &&
  	    time_before(cmd->jiffies_at_alloc + wait_for, jiffies)) {
  		sdev_printk(KERN_ERR, cmd->device,
  			    "timing out command, waited %lus
  ",
  			    wait_for/HZ);
  		disposition = SUCCESS;
  	}
  			
  	scsi_log_completion(cmd, disposition);
  
  	switch (disposition) {
  		case SUCCESS:
  			scsi_finish_command(cmd);
  			break;
  		case NEEDS_RETRY:
596f482a9   Christoph Hellwig   [SCSI] kill scsi_...
1422
  			scsi_queue_insert(cmd, SCSI_MLQUEUE_EH_RETRY);
1aea6434e   Jens Axboe   [SCSI] Kill the S...
1423
1424
1425
1426
1427
1428
1429
1430
1431
  			break;
  		case ADD_TO_MLQUEUE:
  			scsi_queue_insert(cmd, SCSI_MLQUEUE_DEVICE_BUSY);
  			break;
  		default:
  			if (!scsi_eh_scmd_add(cmd, 0))
  				scsi_finish_command(cmd);
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
  /*
   * Function:    scsi_request_fn()
   *
   * Purpose:     Main strategy routine for SCSI.
   *
   * Arguments:   q       - Pointer to actual queue.
   *
   * Returns:     Nothing
   *
   * Lock status: IO request lock assumed to be held when called.
   */
  static void scsi_request_fn(struct request_queue *q)
  {
  	struct scsi_device *sdev = q->queuedata;
  	struct Scsi_Host *shost;
  	struct scsi_cmnd *cmd;
  	struct request *req;
  
  	if (!sdev) {
9934c8c04   Tejun Heo   block: implement ...
1451
  		while ((req = blk_peek_request(q)) != NULL)
e91442b63   James Bottomley   [SCSI] SCSI core:...
1452
  			scsi_kill_request(req, q);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
  		return;
  	}
  
  	if(!get_device(&sdev->sdev_gendev))
  		/* We must be tearing the block queue down already */
  		return;
  
  	/*
  	 * To start with, we keep looping until the queue is empty, or until
  	 * the host is no longer able to accept any more requests.
  	 */
  	shost = sdev->host;
a488e7497   Jens Axboe   scsi: convert to ...
1465
  	for (;;) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1466
1467
1468
1469
1470
1471
  		int rtn;
  		/*
  		 * get next queueable request.  We do this early to make sure
  		 * that the request is fully prepared even if we cannot 
  		 * accept it.
  		 */
9934c8c04   Tejun Heo   block: implement ...
1472
  		req = blk_peek_request(q);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1473
1474
1475
1476
  		if (!req || !scsi_dev_queue_ready(q, sdev))
  			break;
  
  		if (unlikely(!scsi_device_online(sdev))) {
9ccfc756a   James Bottomley   [SCSI] move the m...
1477
1478
1479
  			sdev_printk(KERN_ERR, sdev,
  				    "rejecting I/O to offline device
  ");
e91442b63   James Bottomley   [SCSI] SCSI core:...
1480
  			scsi_kill_request(req, q);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1481
1482
1483
1484
1485
1486
1487
1488
  			continue;
  		}
  
  
  		/*
  		 * Remove the request from the request list.
  		 */
  		if (!(blk_queue_tagged(q) && !blk_queue_start_tag(q, req)))
9934c8c04   Tejun Heo   block: implement ...
1489
  			blk_start_request(req);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1490
1491
1492
  		sdev->device_busy++;
  
  		spin_unlock(q->queue_lock);
e91442b63   James Bottomley   [SCSI] SCSI core:...
1493
1494
1495
1496
1497
  		cmd = req->special;
  		if (unlikely(cmd == NULL)) {
  			printk(KERN_CRIT "impossible request in %s.
  "
  					 "please mail a stack trace to "
4aff5e233   Jens Axboe   [PATCH] Split str...
1498
1499
  					 "linux-scsi@vger.kernel.org
  ",
cadbd4a5e   Harvey Harrison   [SCSI] replace __...
1500
  					 __func__);
4aff5e233   Jens Axboe   [PATCH] Split str...
1501
  			blk_dump_rq_flags(req, "foo");
e91442b63   James Bottomley   [SCSI] SCSI core:...
1502
1503
  			BUG();
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1504
  		spin_lock(shost->host_lock);
ecefe8a97   Mike Christie   [SCSI] fix shared...
1505
1506
1507
1508
1509
1510
1511
1512
  		/*
  		 * We hit this when the driver is using a host wide
  		 * tag map. For device level tag maps the queue_depth check
  		 * in the device ready fn would prevent us from trying
  		 * to allocate a tag. Since the map is a shared host resource
  		 * we add the dev to the starved list so it eventually gets
  		 * a run when a tag is freed.
  		 */
6bd522f6a   Mike Christie   [SCSI] scsi_lib: ...
1513
  		if (blk_queue_tagged(q) && !blk_rq_tagged(req)) {
ecefe8a97   Mike Christie   [SCSI] fix shared...
1514
1515
1516
1517
1518
  			if (list_empty(&sdev->starved_entry))
  				list_add_tail(&sdev->starved_entry,
  					      &shost->starved_list);
  			goto not_ready;
  		}
f0c0a376d   Mike Christie   [SCSI] Add helper...
1519
1520
  		if (!scsi_target_queue_ready(shost, sdev))
  			goto not_ready;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1521
1522
  		if (!scsi_host_queue_ready(q, shost, sdev))
  			goto not_ready;
f0c0a376d   Mike Christie   [SCSI] Add helper...
1523
1524
  
  		scsi_target(sdev)->target_busy++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1525
1526
1527
1528
1529
1530
1531
  		shost->host_busy++;
  
  		/*
  		 * XXX(hch): This is rather suboptimal, scsi_dispatch_cmd will
  		 *		take the lock again.
  		 */
  		spin_unlock_irq(shost->host_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
  		/*
  		 * Finally, initialize any error handling parameters, and set up
  		 * the timers for timeouts.
  		 */
  		scsi_init_cmd_errh(cmd);
  
  		/*
  		 * Dispatch the command to the low-level driver.
  		 */
  		rtn = scsi_dispatch_cmd(cmd);
  		spin_lock_irq(q->queue_lock);
a488e7497   Jens Axboe   scsi: convert to ...
1543
1544
  		if (rtn)
  			goto out_delay;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
  	}
  
  	goto out;
  
   not_ready:
  	spin_unlock_irq(shost->host_lock);
  
  	/*
  	 * lock q, handle tag, requeue req, and decrement device_busy. We
  	 * must return with queue_lock held.
  	 *
  	 * Decrementing device_busy without checking it is OK, as all such
  	 * cases (host limits or settings) should run the queue at some
  	 * later time.
  	 */
  	spin_lock_irq(q->queue_lock);
  	blk_requeue_request(q, req);
  	sdev->device_busy--;
a488e7497   Jens Axboe   scsi: convert to ...
1563
1564
1565
1566
  out_delay:
  	if (sdev->device_busy == 0)
  		blk_delay_queue(q, SCSI_QUEUE_DELAY);
  out:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
  	/* must be careful here...if we trigger the ->remove() function
  	 * we cannot be holding the q lock */
  	spin_unlock_irq(q->queue_lock);
  	put_device(&sdev->sdev_gendev);
  	spin_lock_irq(q->queue_lock);
  }
  
  u64 scsi_calculate_bounce_limit(struct Scsi_Host *shost)
  {
  	struct device *host_dev;
  	u64 bounce_limit = 0xffffffff;
  
  	if (shost->unchecked_isa_dma)
  		return BLK_BOUNCE_ISA;
  	/*
  	 * Platforms with virtual-DMA translation
  	 * hardware have no practical limit.
  	 */
  	if (!PCI_DMA_BUS_IS_PHYS)
  		return BLK_BOUNCE_ANY;
  
  	host_dev = scsi_get_device(shost);
  	if (host_dev && host_dev->dma_mask)
  		bounce_limit = *host_dev->dma_mask;
  
  	return bounce_limit;
  }
  EXPORT_SYMBOL(scsi_calculate_bounce_limit);
b58d91547   FUJITA Tomonori   [SCSI] export scs...
1595
1596
  struct request_queue *__scsi_alloc_queue(struct Scsi_Host *shost,
  					 request_fn_proc *request_fn)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1597
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1598
  	struct request_queue *q;
860ac568e   FUJITA Tomonori   iommu sg merging:...
1599
  	struct device *dev = shost->shost_gendev.parent;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1600

b58d91547   FUJITA Tomonori   [SCSI] export scs...
1601
  	q = blk_init_queue(request_fn, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1602
1603
  	if (!q)
  		return NULL;
a8474ce23   Jens Axboe   SCSI: support for...
1604
1605
1606
  	/*
  	 * this limit is imposed by hardware restrictions
  	 */
8a78362c4   Martin K. Petersen   block: Consolidat...
1607
1608
  	blk_queue_max_segments(q, min_t(unsigned short, shost->sg_tablesize,
  					SCSI_MAX_SG_CHAIN_SEGMENTS));
a8474ce23   Jens Axboe   SCSI: support for...
1609

13f05c8d8   Martin K. Petersen   block/scsi: Provi...
1610
1611
1612
1613
1614
1615
1616
  	if (scsi_host_prot_dma(shost)) {
  		shost->sg_prot_tablesize =
  			min_not_zero(shost->sg_prot_tablesize,
  				     (unsigned short)SCSI_MAX_PROT_SG_SEGMENTS);
  		BUG_ON(shost->sg_prot_tablesize < shost->sg_tablesize);
  		blk_queue_max_integrity_segments(q, shost->sg_prot_tablesize);
  	}
086fa5ff0   Martin K. Petersen   block: Rename blk...
1617
  	blk_queue_max_hw_sectors(q, shost->max_sectors);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1618
1619
  	blk_queue_bounce_limit(q, scsi_calculate_bounce_limit(shost));
  	blk_queue_segment_boundary(q, shost->dma_boundary);
99c84dbdc   FUJITA Tomonori   iommu sg merging:...
1620
  	dma_set_seg_boundary(dev, shost->dma_boundary);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1621

860ac568e   FUJITA Tomonori   iommu sg merging:...
1622
  	blk_queue_max_segment_size(q, dma_get_max_seg_size(dev));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1623
  	if (!shost->use_clustering)
e692cb668   Martin K. Petersen   block: Deprecate ...
1624
  		q->limits.cluster = 0;
465ff3185   James Bottomley   [SCSI] relax scsi...
1625
1626
1627
1628
1629
1630
1631
  
  	/*
  	 * set a reasonable default alignment on word boundaries: the
  	 * host and device may alter it using
  	 * blk_queue_update_dma_alignment() later.
  	 */
  	blk_queue_dma_alignment(q, 0x03);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1632
1633
  	return q;
  }
b58d91547   FUJITA Tomonori   [SCSI] export scs...
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
  EXPORT_SYMBOL(__scsi_alloc_queue);
  
  struct request_queue *scsi_alloc_queue(struct scsi_device *sdev)
  {
  	struct request_queue *q;
  
  	q = __scsi_alloc_queue(sdev->host, scsi_request_fn);
  	if (!q)
  		return NULL;
  
  	blk_queue_prep_rq(q, scsi_prep_fn);
b58d91547   FUJITA Tomonori   [SCSI] export scs...
1645
  	blk_queue_softirq_done(q, scsi_softirq_done);
242f9dcb8   Jens Axboe   block: unify requ...
1646
  	blk_queue_rq_timed_out(q, scsi_times_out);
6c5121b78   Kiyoshi Ueda   [SCSI] export bus...
1647
  	blk_queue_lld_busy(q, scsi_lld_busy);
b58d91547   FUJITA Tomonori   [SCSI] export scs...
1648
1649
  	return q;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1650
1651
1652
  
  void scsi_free_queue(struct request_queue *q)
  {
3308511c9   Bart Van Assche   [SCSI] Make scsi_...
1653
1654
1655
1656
1657
1658
1659
1660
  	unsigned long flags;
  
  	WARN_ON(q->queuedata);
  
  	/* cause scsi_request_fn() to kill all non-finished requests */
  	spin_lock_irqsave(q->queue_lock, flags);
  	q->request_fn(q);
  	spin_unlock_irqrestore(q->queue_lock, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
  	blk_cleanup_queue(q);
  }
  
  /*
   * Function:    scsi_block_requests()
   *
   * Purpose:     Utility function used by low-level drivers to prevent further
   *		commands from being queued to the device.
   *
   * Arguments:   shost       - Host in question
   *
   * Returns:     Nothing
   *
   * Lock status: No locks are assumed held.
   *
   * Notes:       There is no timer nor any other means by which the requests
   *		get unblocked other than the low-level driver calling
   *		scsi_unblock_requests().
   */
  void scsi_block_requests(struct Scsi_Host *shost)
  {
  	shost->host_self_blocked = 1;
  }
  EXPORT_SYMBOL(scsi_block_requests);
  
  /*
   * Function:    scsi_unblock_requests()
   *
   * Purpose:     Utility function used by low-level drivers to allow further
   *		commands from being queued to the device.
   *
   * Arguments:   shost       - Host in question
   *
   * Returns:     Nothing
   *
   * Lock status: No locks are assumed held.
   *
   * Notes:       There is no timer nor any other means by which the requests
   *		get unblocked other than the low-level driver calling
   *		scsi_unblock_requests().
   *
   *		This is done as an API function so that changes to the
   *		internals of the scsi mid-layer won't require wholesale
   *		changes to drivers that use this feature.
   */
  void scsi_unblock_requests(struct Scsi_Host *shost)
  {
  	shost->host_self_blocked = 0;
  	scsi_run_host_queues(shost);
  }
  EXPORT_SYMBOL(scsi_unblock_requests);
  
  int __init scsi_init_queue(void)
  {
  	int i;
6362abd3e   Martin K. Petersen   [SCSI] Rename scs...
1716
1717
1718
1719
1720
1721
  	scsi_sdb_cache = kmem_cache_create("scsi_data_buffer",
  					   sizeof(struct scsi_data_buffer),
  					   0, 0, NULL);
  	if (!scsi_sdb_cache) {
  		printk(KERN_ERR "SCSI: can't init scsi sdb cache
  ");
f078727b2   FUJITA Tomonori   [SCSI] remove scs...
1722
  		return -ENOMEM;
6f9a35e2d   Boaz Harrosh   [SCSI] bidirectio...
1723
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1724
1725
1726
1727
1728
  	for (i = 0; i < SG_MEMPOOL_NR; i++) {
  		struct scsi_host_sg_pool *sgp = scsi_sg_pools + i;
  		int size = sgp->size * sizeof(struct scatterlist);
  
  		sgp->slab = kmem_cache_create(sgp->name, size, 0,
20c2df83d   Paul Mundt   mm: Remove slab d...
1729
  				SLAB_HWCACHE_ALIGN, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1730
1731
1732
1733
  		if (!sgp->slab) {
  			printk(KERN_ERR "SCSI: can't init sg slab %s
  ",
  					sgp->name);
6362abd3e   Martin K. Petersen   [SCSI] Rename scs...
1734
  			goto cleanup_sdb;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1735
  		}
93d2341c7   Matthew Dobson   [PATCH] mempool: ...
1736
1737
  		sgp->pool = mempool_create_slab_pool(SG_MEMPOOL_SIZE,
  						     sgp->slab);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1738
1739
1740
1741
  		if (!sgp->pool) {
  			printk(KERN_ERR "SCSI: can't init sg mempool %s
  ",
  					sgp->name);
6362abd3e   Martin K. Petersen   [SCSI] Rename scs...
1742
  			goto cleanup_sdb;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1743
1744
1745
1746
  		}
  	}
  
  	return 0;
3d9dd6eef   FUJITA Tomonori   [SCSI] handle scs...
1747

6362abd3e   Martin K. Petersen   [SCSI] Rename scs...
1748
  cleanup_sdb:
3d9dd6eef   FUJITA Tomonori   [SCSI] handle scs...
1749
1750
1751
1752
1753
1754
1755
  	for (i = 0; i < SG_MEMPOOL_NR; i++) {
  		struct scsi_host_sg_pool *sgp = scsi_sg_pools + i;
  		if (sgp->pool)
  			mempool_destroy(sgp->pool);
  		if (sgp->slab)
  			kmem_cache_destroy(sgp->slab);
  	}
6362abd3e   Martin K. Petersen   [SCSI] Rename scs...
1756
  	kmem_cache_destroy(scsi_sdb_cache);
3d9dd6eef   FUJITA Tomonori   [SCSI] handle scs...
1757
1758
  
  	return -ENOMEM;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1759
1760
1761
1762
1763
  }
  
  void scsi_exit_queue(void)
  {
  	int i;
6362abd3e   Martin K. Petersen   [SCSI] Rename scs...
1764
  	kmem_cache_destroy(scsi_sdb_cache);
aa7b5cd75   Mike Christie   [SCSI] add kmemca...
1765

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1766
1767
1768
1769
1770
1771
  	for (i = 0; i < SG_MEMPOOL_NR; i++) {
  		struct scsi_host_sg_pool *sgp = scsi_sg_pools + i;
  		mempool_destroy(sgp->pool);
  		kmem_cache_destroy(sgp->slab);
  	}
  }
5baba830e   James Bottomley   [SCSI] add scsi_m...
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
  
  /**
   *	scsi_mode_select - issue a mode select
   *	@sdev:	SCSI device to be queried
   *	@pf:	Page format bit (1 == standard, 0 == vendor specific)
   *	@sp:	Save page bit (0 == don't save, 1 == save)
   *	@modepage: mode page being requested
   *	@buffer: request buffer (may not be smaller than eight bytes)
   *	@len:	length of request buffer.
   *	@timeout: command timeout
   *	@retries: number of retries before failing
   *	@data: returns a structure abstracting the mode header data
eb44820c2   Rob Landley   [SCSI] Add Docume...
1784
   *	@sshdr: place to put sense data (or NULL if no sense to be collected).
5baba830e   James Bottomley   [SCSI] add scsi_m...
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
   *		must be SCSI_SENSE_BUFFERSIZE big.
   *
   *	Returns zero if successful; negative error number or scsi
   *	status on error
   *
   */
  int
  scsi_mode_select(struct scsi_device *sdev, int pf, int sp, int modepage,
  		 unsigned char *buffer, int len, int timeout, int retries,
  		 struct scsi_mode_data *data, struct scsi_sense_hdr *sshdr)
  {
  	unsigned char cmd[10];
  	unsigned char *real_buffer;
  	int ret;
  
  	memset(cmd, 0, sizeof(cmd));
  	cmd[1] = (pf ? 0x10 : 0) | (sp ? 0x01 : 0);
  
  	if (sdev->use_10_for_ms) {
  		if (len > 65535)
  			return -EINVAL;
  		real_buffer = kmalloc(8 + len, GFP_KERNEL);
  		if (!real_buffer)
  			return -ENOMEM;
  		memcpy(real_buffer + 8, buffer, len);
  		len += 8;
  		real_buffer[0] = 0;
  		real_buffer[1] = 0;
  		real_buffer[2] = data->medium_type;
  		real_buffer[3] = data->device_specific;
  		real_buffer[4] = data->longlba ? 0x01 : 0;
  		real_buffer[5] = 0;
  		real_buffer[6] = data->block_descriptor_length >> 8;
  		real_buffer[7] = data->block_descriptor_length;
  
  		cmd[0] = MODE_SELECT_10;
  		cmd[7] = len >> 8;
  		cmd[8] = len;
  	} else {
  		if (len > 255 || data->block_descriptor_length > 255 ||
  		    data->longlba)
  			return -EINVAL;
  
  		real_buffer = kmalloc(4 + len, GFP_KERNEL);
  		if (!real_buffer)
  			return -ENOMEM;
  		memcpy(real_buffer + 4, buffer, len);
  		len += 4;
  		real_buffer[0] = 0;
  		real_buffer[1] = data->medium_type;
  		real_buffer[2] = data->device_specific;
  		real_buffer[3] = data->block_descriptor_length;
  		
  
  		cmd[0] = MODE_SELECT;
  		cmd[4] = len;
  	}
  
  	ret = scsi_execute_req(sdev, cmd, DMA_TO_DEVICE, real_buffer, len,
f4f4e47e4   FUJITA Tomonori   [SCSI] add residu...
1844
  			       sshdr, timeout, retries, NULL);
5baba830e   James Bottomley   [SCSI] add scsi_m...
1845
1846
1847
1848
  	kfree(real_buffer);
  	return ret;
  }
  EXPORT_SYMBOL_GPL(scsi_mode_select);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1849
  /**
eb44820c2   Rob Landley   [SCSI] Add Docume...
1850
   *	scsi_mode_sense - issue a mode sense, falling back from 10 to six bytes if necessary.
1cf72699c   James Bottomley   [SCSI] convert th...
1851
   *	@sdev:	SCSI device to be queried
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1852
1853
1854
1855
1856
1857
1858
   *	@dbd:	set if mode sense will allow block descriptors to be returned
   *	@modepage: mode page being requested
   *	@buffer: request buffer (may not be smaller than eight bytes)
   *	@len:	length of request buffer.
   *	@timeout: command timeout
   *	@retries: number of retries before failing
   *	@data: returns a structure abstracting the mode header data
eb44820c2   Rob Landley   [SCSI] Add Docume...
1859
   *	@sshdr: place to put sense data (or NULL if no sense to be collected).
1cf72699c   James Bottomley   [SCSI] convert th...
1860
   *		must be SCSI_SENSE_BUFFERSIZE big.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1861
1862
1863
1864
   *
   *	Returns zero if unsuccessful, or the header offset (either 4
   *	or 8 depending on whether a six or ten byte command was
   *	issued) if successful.
eb44820c2   Rob Landley   [SCSI] Add Docume...
1865
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1866
  int
1cf72699c   James Bottomley   [SCSI] convert th...
1867
  scsi_mode_sense(struct scsi_device *sdev, int dbd, int modepage,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1868
  		  unsigned char *buffer, int len, int timeout, int retries,
5baba830e   James Bottomley   [SCSI] add scsi_m...
1869
1870
  		  struct scsi_mode_data *data, struct scsi_sense_hdr *sshdr)
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1871
1872
1873
  	unsigned char cmd[12];
  	int use_10_for_ms;
  	int header_length;
1cf72699c   James Bottomley   [SCSI] convert th...
1874
  	int result;
ea73a9f23   James Bottomley   [SCSI] convert sd...
1875
  	struct scsi_sense_hdr my_sshdr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1876
1877
1878
1879
1880
  
  	memset(data, 0, sizeof(*data));
  	memset(&cmd[0], 0, 12);
  	cmd[1] = dbd & 0x18;	/* allows DBD and LLBA bits */
  	cmd[2] = modepage;
ea73a9f23   James Bottomley   [SCSI] convert sd...
1881
1882
1883
  	/* caller might not be interested in sense, but we need it */
  	if (!sshdr)
  		sshdr = &my_sshdr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1884
   retry:
1cf72699c   James Bottomley   [SCSI] convert th...
1885
  	use_10_for_ms = sdev->use_10_for_ms;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
  
  	if (use_10_for_ms) {
  		if (len < 8)
  			len = 8;
  
  		cmd[0] = MODE_SENSE_10;
  		cmd[8] = len;
  		header_length = 8;
  	} else {
  		if (len < 4)
  			len = 4;
  
  		cmd[0] = MODE_SENSE;
  		cmd[4] = len;
  		header_length = 4;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1902
  	memset(buffer, 0, len);
1cf72699c   James Bottomley   [SCSI] convert th...
1903
  	result = scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, buffer, len,
f4f4e47e4   FUJITA Tomonori   [SCSI] add residu...
1904
  				  sshdr, timeout, retries, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1905
1906
1907
1908
1909
  
  	/* This code looks awful: what it's doing is making sure an
  	 * ILLEGAL REQUEST sense return identifies the actual command
  	 * byte as the problem.  MODE_SENSE commands can return
  	 * ILLEGAL REQUEST if the code page isn't supported */
1cf72699c   James Bottomley   [SCSI] convert th...
1910
1911
  	if (use_10_for_ms && !scsi_status_is_good(result) &&
  	    (driver_byte(result) & DRIVER_SENSE)) {
ea73a9f23   James Bottomley   [SCSI] convert sd...
1912
1913
1914
  		if (scsi_sense_valid(sshdr)) {
  			if ((sshdr->sense_key == ILLEGAL_REQUEST) &&
  			    (sshdr->asc == 0x20) && (sshdr->ascq == 0)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1915
1916
1917
  				/* 
  				 * Invalid command operation code
  				 */
1cf72699c   James Bottomley   [SCSI] convert th...
1918
  				sdev->use_10_for_ms = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1919
1920
1921
1922
  				goto retry;
  			}
  		}
  	}
1cf72699c   James Bottomley   [SCSI] convert th...
1923
  	if(scsi_status_is_good(result)) {
6d73c8514   Al Viro   [SCSI] scsi_lib: ...
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
  		if (unlikely(buffer[0] == 0x86 && buffer[1] == 0x0b &&
  			     (modepage == 6 || modepage == 8))) {
  			/* Initio breakage? */
  			header_length = 0;
  			data->length = 13;
  			data->medium_type = 0;
  			data->device_specific = 0;
  			data->longlba = 0;
  			data->block_descriptor_length = 0;
  		} else if(use_10_for_ms) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
  			data->length = buffer[0]*256 + buffer[1] + 2;
  			data->medium_type = buffer[2];
  			data->device_specific = buffer[3];
  			data->longlba = buffer[4] & 0x01;
  			data->block_descriptor_length = buffer[6]*256
  				+ buffer[7];
  		} else {
  			data->length = buffer[0] + 1;
  			data->medium_type = buffer[1];
  			data->device_specific = buffer[2];
  			data->block_descriptor_length = buffer[3];
  		}
6d73c8514   Al Viro   [SCSI] scsi_lib: ...
1946
  		data->header_length = header_length;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1947
  	}
1cf72699c   James Bottomley   [SCSI] convert th...
1948
  	return result;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1949
1950
  }
  EXPORT_SYMBOL(scsi_mode_sense);
001aac257   James Bottomley   [SCSI] sd,sr: add...
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
  /**
   *	scsi_test_unit_ready - test if unit is ready
   *	@sdev:	scsi device to change the state of.
   *	@timeout: command timeout
   *	@retries: number of retries before failing
   *	@sshdr_external: Optional pointer to struct scsi_sense_hdr for
   *		returning sense. Make sure that this is cleared before passing
   *		in.
   *
   *	Returns zero if unsuccessful or an error if TUR failed.  For
9f8a2c23c   Tejun Heo   scsi: replace sr_...
1961
   *	removable media, UNIT_ATTENTION sets ->changed flag.
001aac257   James Bottomley   [SCSI] sd,sr: add...
1962
   **/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1963
  int
001aac257   James Bottomley   [SCSI] sd,sr: add...
1964
1965
  scsi_test_unit_ready(struct scsi_device *sdev, int timeout, int retries,
  		     struct scsi_sense_hdr *sshdr_external)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1966
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1967
1968
1969
  	char cmd[] = {
  		TEST_UNIT_READY, 0, 0, 0, 0, 0,
  	};
001aac257   James Bottomley   [SCSI] sd,sr: add...
1970
  	struct scsi_sense_hdr *sshdr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1971
  	int result;
001aac257   James Bottomley   [SCSI] sd,sr: add...
1972
1973
1974
1975
1976
1977
1978
1979
1980
  
  	if (!sshdr_external)
  		sshdr = kzalloc(sizeof(*sshdr), GFP_KERNEL);
  	else
  		sshdr = sshdr_external;
  
  	/* try to eat the UNIT_ATTENTION if there are enough retries */
  	do {
  		result = scsi_execute_req(sdev, cmd, DMA_NONE, NULL, 0, sshdr,
f4f4e47e4   FUJITA Tomonori   [SCSI] add residu...
1981
  					  timeout, retries, NULL);
32c356d76   James Bottomley   [SCSI] fix remova...
1982
1983
1984
1985
1986
  		if (sdev->removable && scsi_sense_valid(sshdr) &&
  		    sshdr->sense_key == UNIT_ATTENTION)
  			sdev->changed = 1;
  	} while (scsi_sense_valid(sshdr) &&
  		 sshdr->sense_key == UNIT_ATTENTION && --retries);
001aac257   James Bottomley   [SCSI] sd,sr: add...
1987

001aac257   James Bottomley   [SCSI] sd,sr: add...
1988
1989
  	if (!sshdr_external)
  		kfree(sshdr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1990
1991
1992
1993
1994
  	return result;
  }
  EXPORT_SYMBOL(scsi_test_unit_ready);
  
  /**
eb44820c2   Rob Landley   [SCSI] Add Docume...
1995
   *	scsi_device_set_state - Take the given device through the device state model.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1996
1997
1998
1999
2000
   *	@sdev:	scsi device to change the state of.
   *	@state:	state to change to.
   *
   *	Returns zero if unsuccessful or an error if the requested 
   *	transition is illegal.
eb44820c2   Rob Landley   [SCSI] Add Docume...
2001
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
  int
  scsi_device_set_state(struct scsi_device *sdev, enum scsi_device_state state)
  {
  	enum scsi_device_state oldstate = sdev->sdev_state;
  
  	if (state == oldstate)
  		return 0;
  
  	switch (state) {
  	case SDEV_CREATED:
6f4267e3b   James Bottomley   [SCSI] Update the...
2012
2013
2014
2015
2016
2017
2018
  		switch (oldstate) {
  		case SDEV_CREATED_BLOCK:
  			break;
  		default:
  			goto illegal;
  		}
  		break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
  			
  	case SDEV_RUNNING:
  		switch (oldstate) {
  		case SDEV_CREATED:
  		case SDEV_OFFLINE:
  		case SDEV_QUIESCE:
  		case SDEV_BLOCK:
  			break;
  		default:
  			goto illegal;
  		}
  		break;
  
  	case SDEV_QUIESCE:
  		switch (oldstate) {
  		case SDEV_RUNNING:
  		case SDEV_OFFLINE:
  			break;
  		default:
  			goto illegal;
  		}
  		break;
  
  	case SDEV_OFFLINE:
  		switch (oldstate) {
  		case SDEV_CREATED:
  		case SDEV_RUNNING:
  		case SDEV_QUIESCE:
  		case SDEV_BLOCK:
  			break;
  		default:
  			goto illegal;
  		}
  		break;
  
  	case SDEV_BLOCK:
  		switch (oldstate) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2056
  		case SDEV_RUNNING:
6f4267e3b   James Bottomley   [SCSI] Update the...
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
  		case SDEV_CREATED_BLOCK:
  			break;
  		default:
  			goto illegal;
  		}
  		break;
  
  	case SDEV_CREATED_BLOCK:
  		switch (oldstate) {
  		case SDEV_CREATED:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
  			break;
  		default:
  			goto illegal;
  		}
  		break;
  
  	case SDEV_CANCEL:
  		switch (oldstate) {
  		case SDEV_CREATED:
  		case SDEV_RUNNING:
9ea729090   Alan Stern   [SCSI] SCSI core:...
2077
  		case SDEV_QUIESCE:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
  		case SDEV_OFFLINE:
  		case SDEV_BLOCK:
  			break;
  		default:
  			goto illegal;
  		}
  		break;
  
  	case SDEV_DEL:
  		switch (oldstate) {
309bd2712   Brian King   [SCSI] scsi: Devi...
2088
2089
2090
  		case SDEV_CREATED:
  		case SDEV_RUNNING:
  		case SDEV_OFFLINE:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
  		case SDEV_CANCEL:
  			break;
  		default:
  			goto illegal;
  		}
  		break;
  
  	}
  	sdev->sdev_state = state;
  	return 0;
  
   illegal:
  	SCSI_LOG_ERROR_RECOVERY(1, 
9ccfc756a   James Bottomley   [SCSI] move the m...
2104
2105
2106
2107
2108
  				sdev_printk(KERN_ERR, sdev,
  					    "Illegal state transition %s->%s
  ",
  					    scsi_device_state_name(oldstate),
  					    scsi_device_state_name(state))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2109
2110
2111
2112
2113
2114
  				);
  	return -EINVAL;
  }
  EXPORT_SYMBOL(scsi_device_set_state);
  
  /**
a341cd0f6   Jeff Garzik   SCSI: add asynchr...
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
   * 	sdev_evt_emit - emit a single SCSI device uevent
   *	@sdev: associated SCSI device
   *	@evt: event to emit
   *
   *	Send a single uevent (scsi_event) to the associated scsi_device.
   */
  static void scsi_evt_emit(struct scsi_device *sdev, struct scsi_event *evt)
  {
  	int idx = 0;
  	char *envp[3];
  
  	switch (evt->evt_type) {
  	case SDEV_EVT_MEDIA_CHANGE:
  		envp[idx++] = "SDEV_MEDIA_CHANGE=1";
  		break;
  
  	default:
  		/* do nothing */
  		break;
  	}
  
  	envp[idx++] = NULL;
  
  	kobject_uevent_env(&sdev->sdev_gendev.kobj, KOBJ_CHANGE, envp);
  }
  
  /**
   * 	sdev_evt_thread - send a uevent for each scsi event
   *	@work: work struct for scsi_device
   *
   *	Dispatch queued events to their associated scsi_device kobjects
   *	as uevents.
   */
  void scsi_evt_thread(struct work_struct *work)
  {
  	struct scsi_device *sdev;
  	LIST_HEAD(event_list);
  
  	sdev = container_of(work, struct scsi_device, event_work);
  
  	while (1) {
  		struct scsi_event *evt;
  		struct list_head *this, *tmp;
  		unsigned long flags;
  
  		spin_lock_irqsave(&sdev->list_lock, flags);
  		list_splice_init(&sdev->event_list, &event_list);
  		spin_unlock_irqrestore(&sdev->list_lock, flags);
  
  		if (list_empty(&event_list))
  			break;
  
  		list_for_each_safe(this, tmp, &event_list) {
  			evt = list_entry(this, struct scsi_event, node);
  			list_del(&evt->node);
  			scsi_evt_emit(sdev, evt);
  			kfree(evt);
  		}
  	}
  }
  
  /**
   * 	sdev_evt_send - send asserted event to uevent thread
   *	@sdev: scsi_device event occurred on
   *	@evt: event to send
   *
   *	Assert scsi device event asynchronously.
   */
  void sdev_evt_send(struct scsi_device *sdev, struct scsi_event *evt)
  {
  	unsigned long flags;
4d1566ed2   Kay Sievers   [SCSI] fix media ...
2186
2187
2188
2189
  #if 0
  	/* FIXME: currently this check eliminates all media change events
  	 * for polled devices.  Need to update to discriminate between AN
  	 * and polled events */
a341cd0f6   Jeff Garzik   SCSI: add asynchr...
2190
2191
2192
2193
  	if (!test_bit(evt->evt_type, sdev->supported_events)) {
  		kfree(evt);
  		return;
  	}
4d1566ed2   Kay Sievers   [SCSI] fix media ...
2194
  #endif
a341cd0f6   Jeff Garzik   SCSI: add asynchr...
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
  
  	spin_lock_irqsave(&sdev->list_lock, flags);
  	list_add_tail(&evt->node, &sdev->event_list);
  	schedule_work(&sdev->event_work);
  	spin_unlock_irqrestore(&sdev->list_lock, flags);
  }
  EXPORT_SYMBOL_GPL(sdev_evt_send);
  
  /**
   * 	sdev_evt_alloc - allocate a new scsi event
   *	@evt_type: type of event to allocate
   *	@gfpflags: GFP flags for allocation
   *
   *	Allocates and returns a new scsi_event.
   */
  struct scsi_event *sdev_evt_alloc(enum scsi_device_event evt_type,
  				  gfp_t gfpflags)
  {
  	struct scsi_event *evt = kzalloc(sizeof(struct scsi_event), gfpflags);
  	if (!evt)
  		return NULL;
  
  	evt->evt_type = evt_type;
  	INIT_LIST_HEAD(&evt->node);
  
  	/* evt_type-specific initialization, if any */
  	switch (evt_type) {
  	case SDEV_EVT_MEDIA_CHANGE:
  	default:
  		/* do nothing */
  		break;
  	}
  
  	return evt;
  }
  EXPORT_SYMBOL_GPL(sdev_evt_alloc);
  
  /**
   * 	sdev_evt_send_simple - send asserted event to uevent thread
   *	@sdev: scsi_device event occurred on
   *	@evt_type: type of event to send
   *	@gfpflags: GFP flags for allocation
   *
   *	Assert scsi device event asynchronously, given an event type.
   */
  void sdev_evt_send_simple(struct scsi_device *sdev,
  			  enum scsi_device_event evt_type, gfp_t gfpflags)
  {
  	struct scsi_event *evt = sdev_evt_alloc(evt_type, gfpflags);
  	if (!evt) {
  		sdev_printk(KERN_ERR, sdev, "event %d eaten due to OOM
  ",
  			    evt_type);
  		return;
  	}
  
  	sdev_evt_send(sdev, evt);
  }
  EXPORT_SYMBOL_GPL(sdev_evt_send_simple);
  
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
   *	scsi_device_quiesce - Block user issued commands.
   *	@sdev:	scsi device to quiesce.
   *
   *	This works by trying to transition to the SDEV_QUIESCE state
   *	(which must be a legal transition).  When the device is in this
   *	state, only special requests will be accepted, all others will
   *	be deferred.  Since special requests may also be requeued requests,
   *	a successful return doesn't guarantee the device will be 
   *	totally quiescent.
   *
   *	Must be called with user context, may sleep.
   *
   *	Returns zero if unsuccessful or an error if not.
eb44820c2   Rob Landley   [SCSI] Add Docume...
2269
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
  int
  scsi_device_quiesce(struct scsi_device *sdev)
  {
  	int err = scsi_device_set_state(sdev, SDEV_QUIESCE);
  	if (err)
  		return err;
  
  	scsi_run_queue(sdev->request_queue);
  	while (sdev->device_busy) {
  		msleep_interruptible(200);
  		scsi_run_queue(sdev->request_queue);
  	}
  	return 0;
  }
  EXPORT_SYMBOL(scsi_device_quiesce);
  
  /**
   *	scsi_device_resume - Restart user issued commands to a quiesced device.
   *	@sdev:	scsi device to resume.
   *
   *	Moves the device from quiesced back to running and restarts the
   *	queues.
   *
   *	Must be called with user context, may sleep.
eb44820c2   Rob Landley   [SCSI] Add Docume...
2294
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
  void
  scsi_device_resume(struct scsi_device *sdev)
  {
  	if(scsi_device_set_state(sdev, SDEV_RUNNING))
  		return;
  	scsi_run_queue(sdev->request_queue);
  }
  EXPORT_SYMBOL(scsi_device_resume);
  
  static void
  device_quiesce_fn(struct scsi_device *sdev, void *data)
  {
  	scsi_device_quiesce(sdev);
  }
  
  void
  scsi_target_quiesce(struct scsi_target *starget)
  {
  	starget_for_each_device(starget, NULL, device_quiesce_fn);
  }
  EXPORT_SYMBOL(scsi_target_quiesce);
  
  static void
  device_resume_fn(struct scsi_device *sdev, void *data)
  {
  	scsi_device_resume(sdev);
  }
  
  void
  scsi_target_resume(struct scsi_target *starget)
  {
  	starget_for_each_device(starget, NULL, device_resume_fn);
  }
  EXPORT_SYMBOL(scsi_target_resume);
  
  /**
eb44820c2   Rob Landley   [SCSI] Add Docume...
2331
   * scsi_internal_device_block - internal function to put a device temporarily into the SDEV_BLOCK state
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
   * @sdev:	device to block
   *
   * Block request made by scsi lld's to temporarily stop all
   * scsi commands on the specified device.  Called from interrupt
   * or normal process context.
   *
   * Returns zero if successful or error if not
   *
   * Notes:       
   *	This routine transitions the device to the SDEV_BLOCK state
   *	(which must be a legal transition).  When the device is in this
   *	state, all commands are deferred until the scsi lld reenables
   *	the device with scsi_device_unblock or device_block_tmo fires.
   *	This routine assumes the host_lock is held on entry.
eb44820c2   Rob Landley   [SCSI] Add Docume...
2346
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2347
2348
2349
  int
  scsi_internal_device_block(struct scsi_device *sdev)
  {
165125e1e   Jens Axboe   [BLOCK] Get rid o...
2350
  	struct request_queue *q = sdev->request_queue;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2351
2352
2353
2354
  	unsigned long flags;
  	int err = 0;
  
  	err = scsi_device_set_state(sdev, SDEV_BLOCK);
6f4267e3b   James Bottomley   [SCSI] Update the...
2355
2356
2357
2358
2359
2360
  	if (err) {
  		err = scsi_device_set_state(sdev, SDEV_CREATED_BLOCK);
  
  		if (err)
  			return err;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
  
  	/* 
  	 * The device has transitioned to SDEV_BLOCK.  Stop the
  	 * block layer from calling the midlayer with this device's
  	 * request queue. 
  	 */
  	spin_lock_irqsave(q->queue_lock, flags);
  	blk_stop_queue(q);
  	spin_unlock_irqrestore(q->queue_lock, flags);
  
  	return 0;
  }
  EXPORT_SYMBOL_GPL(scsi_internal_device_block);
   
  /**
   * scsi_internal_device_unblock - resume a device after a block request
   * @sdev:	device to resume
   *
   * Called by scsi lld's or the midlayer to restart the device queue
   * for the previously suspended scsi device.  Called from interrupt or
   * normal process context.
   *
   * Returns zero if successful or error if not.
   *
   * Notes:       
   *	This routine transitions the device to the SDEV_RUNNING state
   *	(which must be a legal transition) allowing the midlayer to
   *	goose the queue for this device.  This routine assumes the 
   *	host_lock is held upon entry.
eb44820c2   Rob Landley   [SCSI] Add Docume...
2390
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2391
2392
2393
  int
  scsi_internal_device_unblock(struct scsi_device *sdev)
  {
165125e1e   Jens Axboe   [BLOCK] Get rid o...
2394
  	struct request_queue *q = sdev->request_queue; 
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2395
2396
2397
2398
2399
2400
  	unsigned long flags;
  	
  	/* 
  	 * Try to transition the scsi device to SDEV_RUNNING
  	 * and goose the device queue if successful.  
  	 */
5c10e63c9   Takahiro Yasui   [SCSI] limit stat...
2401
2402
2403
2404
  	if (sdev->sdev_state == SDEV_BLOCK)
  		sdev->sdev_state = SDEV_RUNNING;
  	else if (sdev->sdev_state == SDEV_CREATED_BLOCK)
  		sdev->sdev_state = SDEV_CREATED;
986fe6c7f   Mike Christie   [SCSI] Fix regres...
2405
2406
  	else if (sdev->sdev_state != SDEV_CANCEL &&
  		 sdev->sdev_state != SDEV_OFFLINE)
5c10e63c9   Takahiro Yasui   [SCSI] limit stat...
2407
  		return -EINVAL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
  
  	spin_lock_irqsave(q->queue_lock, flags);
  	blk_start_queue(q);
  	spin_unlock_irqrestore(q->queue_lock, flags);
  
  	return 0;
  }
  EXPORT_SYMBOL_GPL(scsi_internal_device_unblock);
  
  static void
  device_block(struct scsi_device *sdev, void *data)
  {
  	scsi_internal_device_block(sdev);
  }
  
  static int
  target_block(struct device *dev, void *data)
  {
  	if (scsi_is_target_device(dev))
  		starget_for_each_device(to_scsi_target(dev), NULL,
  					device_block);
  	return 0;
  }
  
  void
  scsi_target_block(struct device *dev)
  {
  	if (scsi_is_target_device(dev))
  		starget_for_each_device(to_scsi_target(dev), NULL,
  					device_block);
  	else
  		device_for_each_child(dev, NULL, target_block);
  }
  EXPORT_SYMBOL_GPL(scsi_target_block);
  
  static void
  device_unblock(struct scsi_device *sdev, void *data)
  {
  	scsi_internal_device_unblock(sdev);
  }
  
  static int
  target_unblock(struct device *dev, void *data)
  {
  	if (scsi_is_target_device(dev))
  		starget_for_each_device(to_scsi_target(dev), NULL,
  					device_unblock);
  	return 0;
  }
  
  void
  scsi_target_unblock(struct device *dev)
  {
  	if (scsi_is_target_device(dev))
  		starget_for_each_device(to_scsi_target(dev), NULL,
  					device_unblock);
  	else
  		device_for_each_child(dev, NULL, target_unblock);
  }
  EXPORT_SYMBOL_GPL(scsi_target_unblock);
cdb8c2a6d   Guennadi Liakhovetski   [SCSI] dc395x: dy...
2468
2469
2470
  
  /**
   * scsi_kmap_atomic_sg - find and atomically map an sg-elemnt
eb44820c2   Rob Landley   [SCSI] Add Docume...
2471
   * @sgl:	scatter-gather list
cdb8c2a6d   Guennadi Liakhovetski   [SCSI] dc395x: dy...
2472
2473
2474
2475
2476
2477
   * @sg_count:	number of segments in sg
   * @offset:	offset in bytes into sg, on return offset into the mapped area
   * @len:	bytes to map, on return number of bytes mapped
   *
   * Returns virtual address of the start of the mapped page
   */
c6132da17   Jens Axboe   scsi: convert to ...
2478
  void *scsi_kmap_atomic_sg(struct scatterlist *sgl, int sg_count,
cdb8c2a6d   Guennadi Liakhovetski   [SCSI] dc395x: dy...
2479
2480
2481
2482
  			  size_t *offset, size_t *len)
  {
  	int i;
  	size_t sg_len = 0, len_complete = 0;
c6132da17   Jens Axboe   scsi: convert to ...
2483
  	struct scatterlist *sg;
cdb8c2a6d   Guennadi Liakhovetski   [SCSI] dc395x: dy...
2484
  	struct page *page;
22cfefb56   Andrew Morton   [SCSI] scsi_kmap_...
2485
  	WARN_ON(!irqs_disabled());
c6132da17   Jens Axboe   scsi: convert to ...
2486
  	for_each_sg(sgl, sg, sg_count, i) {
cdb8c2a6d   Guennadi Liakhovetski   [SCSI] dc395x: dy...
2487
  		len_complete = sg_len; /* Complete sg-entries */
c6132da17   Jens Axboe   scsi: convert to ...
2488
  		sg_len += sg->length;
cdb8c2a6d   Guennadi Liakhovetski   [SCSI] dc395x: dy...
2489
2490
2491
2492
2493
  		if (sg_len > *offset)
  			break;
  	}
  
  	if (unlikely(i == sg_count)) {
169e1a2a8   Andrew Morton   [SCSI] scsi_lib.c...
2494
2495
2496
  		printk(KERN_ERR "%s: Bytes in sg: %zu, requested offset %zu, "
  			"elements %d
  ",
cadbd4a5e   Harvey Harrison   [SCSI] replace __...
2497
  		       __func__, sg_len, *offset, sg_count);
cdb8c2a6d   Guennadi Liakhovetski   [SCSI] dc395x: dy...
2498
2499
2500
2501
2502
  		WARN_ON(1);
  		return NULL;
  	}
  
  	/* Offset starting from the beginning of first page in this sg-entry */
c6132da17   Jens Axboe   scsi: convert to ...
2503
  	*offset = *offset - len_complete + sg->offset;
cdb8c2a6d   Guennadi Liakhovetski   [SCSI] dc395x: dy...
2504
2505
  
  	/* Assumption: contiguous pages can be accessed as "page + i" */
45711f1af   Jens Axboe   [SG] Update drive...
2506
  	page = nth_page(sg_page(sg), (*offset >> PAGE_SHIFT));
cdb8c2a6d   Guennadi Liakhovetski   [SCSI] dc395x: dy...
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
  	*offset &= ~PAGE_MASK;
  
  	/* Bytes in this sg-entry from *offset to the end of the page */
  	sg_len = PAGE_SIZE - *offset;
  	if (*len > sg_len)
  		*len = sg_len;
  
  	return kmap_atomic(page, KM_BIO_SRC_IRQ);
  }
  EXPORT_SYMBOL(scsi_kmap_atomic_sg);
  
  /**
eb44820c2   Rob Landley   [SCSI] Add Docume...
2519
   * scsi_kunmap_atomic_sg - atomically unmap a virtual address, previously mapped with scsi_kmap_atomic_sg
cdb8c2a6d   Guennadi Liakhovetski   [SCSI] dc395x: dy...
2520
2521
2522
2523
2524
2525
2526
   * @virt:	virtual address to be unmapped
   */
  void scsi_kunmap_atomic_sg(void *virt)
  {
  	kunmap_atomic(virt, KM_BIO_SRC_IRQ);
  }
  EXPORT_SYMBOL(scsi_kunmap_atomic_sg);