diff options
author | Boaz Harrosh <bharrosh@panasas.com> | 2007-12-13 06:47:40 -0500 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2008-01-30 14:03:40 -0500 |
commit | 30b0c37b27485a9cb897bfe3824f6f517b8c80d6 (patch) | |
tree | 22643da8e175ff7badf2413dc8c84b2e99613a6f /drivers/scsi/sr.c | |
parent | bb52d82f45df3a2661d88befba7c79a7db8be496 (diff) |
[SCSI] implement scsi_data_buffer
In preparation for bidi we abstract all IO members of scsi_cmnd,
that will need to duplicate, into a substructure.
- Group all IO members of scsi_cmnd into a scsi_data_buffer
structure.
- Adjust accessors to new members.
- scsi_{alloc,free}_sgtable receive a scsi_data_buffer instead of
scsi_cmnd. And work on it.
- Adjust scsi_init_io() and scsi_release_buffers() for above
change.
- Fix other parts of scsi_lib/scsi.c to members migration. Use
accessors where appropriate.
- fix Documentation about scsi_cmnd in scsi_host.h
- scsi_error.c
* Changed needed members of struct scsi_eh_save.
* Careful considerations in scsi_eh_prep/restore_cmnd.
- sd.c and sr.c
* sd and sr would adjust IO size to align on device's block
size so code needs to change once we move to scsi_data_buff
implementation.
* Convert code to use scsi_for_each_sg
* Use data accessors where appropriate.
- tgt: convert libsrp to use scsi_data_buffer
- isd200: This driver still bangs on scsi_cmnd IO members,
so need changing
[jejb: rebased on top of sg_table patches fixed up conflicts
and used the synergy to eliminate use_sg and sg_count]
Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers/scsi/sr.c')
-rw-r--r-- | drivers/scsi/sr.c | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c index 1fcee16fa36d..50ba49250203 100644 --- a/drivers/scsi/sr.c +++ b/drivers/scsi/sr.c | |||
@@ -231,7 +231,7 @@ out: | |||
231 | static int sr_done(struct scsi_cmnd *SCpnt) | 231 | static int sr_done(struct scsi_cmnd *SCpnt) |
232 | { | 232 | { |
233 | int result = SCpnt->result; | 233 | int result = SCpnt->result; |
234 | int this_count = SCpnt->request_bufflen; | 234 | int this_count = scsi_bufflen(SCpnt); |
235 | int good_bytes = (result == 0 ? this_count : 0); | 235 | int good_bytes = (result == 0 ? this_count : 0); |
236 | int block_sectors = 0; | 236 | int block_sectors = 0; |
237 | long error_sector; | 237 | long error_sector; |
@@ -379,17 +379,18 @@ static int sr_prep_fn(struct request_queue *q, struct request *rq) | |||
379 | } | 379 | } |
380 | 380 | ||
381 | { | 381 | { |
382 | struct scatterlist *sg = SCpnt->request_buffer; | 382 | struct scatterlist *sg; |
383 | int i, size = 0; | 383 | int i, size = 0, sg_count = scsi_sg_count(SCpnt); |
384 | for (i = 0; i < SCpnt->use_sg; i++) | ||
385 | size += sg[i].length; | ||
386 | 384 | ||
387 | if (size != SCpnt->request_bufflen && SCpnt->use_sg) { | 385 | scsi_for_each_sg(SCpnt, sg, sg_count, i) |
386 | size += sg->length; | ||
387 | |||
388 | if (size != scsi_bufflen(SCpnt)) { | ||
388 | scmd_printk(KERN_ERR, SCpnt, | 389 | scmd_printk(KERN_ERR, SCpnt, |
389 | "mismatch count %d, bytes %d\n", | 390 | "mismatch count %d, bytes %d\n", |
390 | size, SCpnt->request_bufflen); | 391 | size, scsi_bufflen(SCpnt)); |
391 | if (SCpnt->request_bufflen > size) | 392 | if (scsi_bufflen(SCpnt) > size) |
392 | SCpnt->request_bufflen = size; | 393 | SCpnt->sdb.length = size; |
393 | } | 394 | } |
394 | } | 395 | } |
395 | 396 | ||
@@ -397,12 +398,12 @@ static int sr_prep_fn(struct request_queue *q, struct request *rq) | |||
397 | * request doesn't start on hw block boundary, add scatter pads | 398 | * request doesn't start on hw block boundary, add scatter pads |
398 | */ | 399 | */ |
399 | if (((unsigned int)rq->sector % (s_size >> 9)) || | 400 | if (((unsigned int)rq->sector % (s_size >> 9)) || |
400 | (SCpnt->request_bufflen % s_size)) { | 401 | (scsi_bufflen(SCpnt) % s_size)) { |
401 | scmd_printk(KERN_NOTICE, SCpnt, "unaligned transfer\n"); | 402 | scmd_printk(KERN_NOTICE, SCpnt, "unaligned transfer\n"); |
402 | goto out; | 403 | goto out; |
403 | } | 404 | } |
404 | 405 | ||
405 | this_count = (SCpnt->request_bufflen >> 9) / (s_size >> 9); | 406 | this_count = (scsi_bufflen(SCpnt) >> 9) / (s_size >> 9); |
406 | 407 | ||
407 | 408 | ||
408 | SCSI_LOG_HLQUEUE(2, printk("%s : %s %d/%ld 512 byte blocks.\n", | 409 | SCSI_LOG_HLQUEUE(2, printk("%s : %s %d/%ld 512 byte blocks.\n", |
@@ -416,7 +417,7 @@ static int sr_prep_fn(struct request_queue *q, struct request *rq) | |||
416 | 417 | ||
417 | if (this_count > 0xffff) { | 418 | if (this_count > 0xffff) { |
418 | this_count = 0xffff; | 419 | this_count = 0xffff; |
419 | SCpnt->request_bufflen = this_count * s_size; | 420 | SCpnt->sdb.length = this_count * s_size; |
420 | } | 421 | } |
421 | 422 | ||
422 | SCpnt->cmnd[2] = (unsigned char) (block >> 24) & 0xff; | 423 | SCpnt->cmnd[2] = (unsigned char) (block >> 24) & 0xff; |