diff options
Diffstat (limited to 'drivers/scsi/scsi_debug.c')
| -rw-r--r-- | drivers/scsi/scsi_debug.c | 37 |
1 files changed, 10 insertions, 27 deletions
diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c index 46cae5a212de..82c06f0a9d02 100644 --- a/drivers/scsi/scsi_debug.c +++ b/drivers/scsi/scsi_debug.c | |||
| @@ -329,7 +329,7 @@ int scsi_debug_queuecommand(struct scsi_cmnd * SCpnt, done_funct_t done) | |||
| 329 | if (done == NULL) | 329 | if (done == NULL) |
| 330 | return 0; /* assume mid level reprocessing command */ | 330 | return 0; /* assume mid level reprocessing command */ |
| 331 | 331 | ||
| 332 | SCpnt->resid = 0; | 332 | scsi_set_resid(SCpnt, 0); |
| 333 | if ((SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) && cmd) { | 333 | if ((SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) && cmd) { |
| 334 | printk(KERN_INFO "scsi_debug: cmd "); | 334 | printk(KERN_INFO "scsi_debug: cmd "); |
| 335 | for (k = 0, len = SCpnt->cmd_len; k < len; ++k) | 335 | for (k = 0, len = SCpnt->cmd_len; k < len; ++k) |
| @@ -603,26 +603,16 @@ static int fill_from_dev_buffer(struct scsi_cmnd * scp, unsigned char * arr, | |||
| 603 | void * kaddr_off; | 603 | void * kaddr_off; |
| 604 | struct scatterlist * sg; | 604 | struct scatterlist * sg; |
| 605 | 605 | ||
| 606 | if (0 == scp->request_bufflen) | 606 | if (0 == scsi_bufflen(scp)) |
| 607 | return 0; | 607 | return 0; |
| 608 | if (NULL == scp->request_buffer) | 608 | if (NULL == scsi_sglist(scp)) |
| 609 | return (DID_ERROR << 16); | 609 | return (DID_ERROR << 16); |
| 610 | if (! ((scp->sc_data_direction == DMA_BIDIRECTIONAL) || | 610 | if (! ((scp->sc_data_direction == DMA_BIDIRECTIONAL) || |
| 611 | (scp->sc_data_direction == DMA_FROM_DEVICE))) | 611 | (scp->sc_data_direction == DMA_FROM_DEVICE))) |
| 612 | return (DID_ERROR << 16); | 612 | return (DID_ERROR << 16); |
| 613 | if (0 == scp->use_sg) { | ||
| 614 | req_len = scp->request_bufflen; | ||
| 615 | act_len = (req_len < arr_len) ? req_len : arr_len; | ||
| 616 | memcpy(scp->request_buffer, arr, act_len); | ||
| 617 | if (scp->resid) | ||
| 618 | scp->resid -= act_len; | ||
| 619 | else | ||
| 620 | scp->resid = req_len - act_len; | ||
| 621 | return 0; | ||
| 622 | } | ||
| 623 | active = 1; | 613 | active = 1; |
| 624 | req_len = act_len = 0; | 614 | req_len = act_len = 0; |
| 625 | scsi_for_each_sg(scp, sg, scp->use_sg, k) { | 615 | scsi_for_each_sg(scp, sg, scsi_sg_count(scp), k) { |
| 626 | if (active) { | 616 | if (active) { |
| 627 | kaddr = (unsigned char *) | 617 | kaddr = (unsigned char *) |
| 628 | kmap_atomic(sg_page(sg), KM_USER0); | 618 | kmap_atomic(sg_page(sg), KM_USER0); |
| @@ -640,10 +630,10 @@ static int fill_from_dev_buffer(struct scsi_cmnd * scp, unsigned char * arr, | |||
| 640 | } | 630 | } |
| 641 | req_len += sg->length; | 631 | req_len += sg->length; |
| 642 | } | 632 | } |
| 643 | if (scp->resid) | 633 | if (scsi_get_resid(scp)) |
| 644 | scp->resid -= act_len; | 634 | scsi_set_resid(scp, scsi_get_resid(scp) - act_len); |
| 645 | else | 635 | else |
| 646 | scp->resid = req_len - act_len; | 636 | scsi_set_resid(scp, req_len - act_len); |
| 647 | return 0; | 637 | return 0; |
| 648 | } | 638 | } |
| 649 | 639 | ||
| @@ -656,22 +646,15 @@ static int fetch_to_dev_buffer(struct scsi_cmnd * scp, unsigned char * arr, | |||
| 656 | void * kaddr_off; | 646 | void * kaddr_off; |
| 657 | struct scatterlist * sg; | 647 | struct scatterlist * sg; |
| 658 | 648 | ||
| 659 | if (0 == scp->request_bufflen) | 649 | if (0 == scsi_bufflen(scp)) |
| 660 | return 0; | 650 | return 0; |
| 661 | if (NULL == scp->request_buffer) | 651 | if (NULL == scsi_sglist(scp)) |
| 662 | return -1; | 652 | return -1; |
| 663 | if (! ((scp->sc_data_direction == DMA_BIDIRECTIONAL) || | 653 | if (! ((scp->sc_data_direction == DMA_BIDIRECTIONAL) || |
| 664 | (scp->sc_data_direction == DMA_TO_DEVICE))) | 654 | (scp->sc_data_direction == DMA_TO_DEVICE))) |
| 665 | return -1; | 655 | return -1; |
| 666 | if (0 == scp->use_sg) { | ||
| 667 | req_len = scp->request_bufflen; | ||
| 668 | len = (req_len < max_arr_len) ? req_len : max_arr_len; | ||
| 669 | memcpy(arr, scp->request_buffer, len); | ||
| 670 | return len; | ||
| 671 | } | ||
| 672 | sg = scsi_sglist(scp); | ||
| 673 | req_len = fin = 0; | 656 | req_len = fin = 0; |
| 674 | for (k = 0; k < scp->use_sg; ++k, sg = sg_next(sg)) { | 657 | scsi_for_each_sg(scp, sg, scsi_sg_count(scp), k) { |
| 675 | kaddr = (unsigned char *)kmap_atomic(sg_page(sg), KM_USER0); | 658 | kaddr = (unsigned char *)kmap_atomic(sg_page(sg), KM_USER0); |
| 676 | if (NULL == kaddr) | 659 | if (NULL == kaddr) |
| 677 | return -1; | 660 | return -1; |
