diff options
| author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-07-21 15:04:53 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-07-21 15:04:53 -0400 |
| commit | 00ab956f2fefd3673edc16df55beed21834b7bdd (patch) | |
| tree | b703a595bbedaccd63b30d048b2f1cbc32ce0519 /drivers/scsi/scsi_lib.c | |
| parent | 53a4998229efbf5cb79ec7ca7c18f4c86f66755d (diff) | |
| parent | 79bd3f8563a275d1d068bbb9189a746dc6e96f3e (diff) | |
Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6: (38 commits)
[SCSI] More buffer->request_buffer changes
[SCSI] mptfusion: bump version to 3.04.01
[SCSI] mptfusion: misc fix's
[SCSI] mptfusion: firmware download boot fix's
[SCSI] mptfusion: task abort fix's
[SCSI] mptfusion: sas nexus loss support
[SCSI] mptfusion: sas loginfo update
[SCSI] mptfusion: mptctl panic when loading
[SCSI] mptfusion: sas enclosures with smart drive
[SCSI] NCR_D700: misc fixes (section and argument ordering)
[SCSI] scsi_debug: must_check fixes
[SCSI] scsi_transport_sas: kill the use of channel
[SCSI] scsi_transport_sas: add expander backlink
[SCSI] hide EH backup data outside the scsi_cmnd
[SCSI] ibmvscsi: handle inactive SCSI target during probe
[SCSI] ibmvscsi: allocate lpevents for ibmvscsi on iseries
[SCSI] aic7[9x]xx: Remove last vestiges of reverse_scan
[SCSI] aha152x: stop poking at saved scsi_cmnd members
[SCSI] st.c: Improve sense output
[SCSI] lpfc 8.1.7: Change version number to 8.1.7
...
Diffstat (limited to 'drivers/scsi/scsi_lib.c')
| -rw-r--r-- | drivers/scsi/scsi_lib.c | 88 |
1 files changed, 6 insertions, 82 deletions
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 08af9aae7df3..077c1c691210 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
| @@ -436,60 +436,16 @@ EXPORT_SYMBOL_GPL(scsi_execute_async); | |||
| 436 | * | 436 | * |
| 437 | * Arguments: cmd - command that is ready to be queued. | 437 | * Arguments: cmd - command that is ready to be queued. |
| 438 | * | 438 | * |
| 439 | * Returns: Nothing | ||
| 440 | * | ||
| 441 | * Notes: This function has the job of initializing a number of | 439 | * Notes: This function has the job of initializing a number of |
| 442 | * fields related to error handling. Typically this will | 440 | * fields related to error handling. Typically this will |
| 443 | * be called once for each command, as required. | 441 | * be called once for each command, as required. |
| 444 | */ | 442 | */ |
| 445 | static int scsi_init_cmd_errh(struct scsi_cmnd *cmd) | 443 | static void scsi_init_cmd_errh(struct scsi_cmnd *cmd) |
| 446 | { | 444 | { |
| 447 | cmd->serial_number = 0; | 445 | cmd->serial_number = 0; |
| 448 | |||
| 449 | memset(cmd->sense_buffer, 0, sizeof cmd->sense_buffer); | 446 | memset(cmd->sense_buffer, 0, sizeof cmd->sense_buffer); |
| 450 | |||
| 451 | if (cmd->cmd_len == 0) | 447 | if (cmd->cmd_len == 0) |
| 452 | cmd->cmd_len = COMMAND_SIZE(cmd->cmnd[0]); | 448 | cmd->cmd_len = COMMAND_SIZE(cmd->cmnd[0]); |
| 453 | |||
| 454 | /* | ||
| 455 | * We need saved copies of a number of fields - this is because | ||
| 456 | * error handling may need to overwrite these with different values | ||
| 457 | * to run different commands, and once error handling is complete, | ||
| 458 | * we will need to restore these values prior to running the actual | ||
| 459 | * command. | ||
| 460 | */ | ||
| 461 | cmd->old_use_sg = cmd->use_sg; | ||
| 462 | cmd->old_cmd_len = cmd->cmd_len; | ||
| 463 | cmd->sc_old_data_direction = cmd->sc_data_direction; | ||
| 464 | cmd->old_underflow = cmd->underflow; | ||
| 465 | memcpy(cmd->data_cmnd, cmd->cmnd, sizeof(cmd->cmnd)); | ||
| 466 | cmd->buffer = cmd->request_buffer; | ||
| 467 | cmd->bufflen = cmd->request_bufflen; | ||
| 468 | |||
| 469 | return 1; | ||
| 470 | } | ||
| 471 | |||
| 472 | /* | ||
| 473 | * Function: scsi_setup_cmd_retry() | ||
| 474 | * | ||
| 475 | * Purpose: Restore the command state for a retry | ||
| 476 | * | ||
| 477 | * Arguments: cmd - command to be restored | ||
| 478 | * | ||
| 479 | * Returns: Nothing | ||
| 480 | * | ||
| 481 | * Notes: Immediately prior to retrying a command, we need | ||
| 482 | * to restore certain fields that we saved above. | ||
| 483 | */ | ||
| 484 | void scsi_setup_cmd_retry(struct scsi_cmnd *cmd) | ||
| 485 | { | ||
| 486 | memcpy(cmd->cmnd, cmd->data_cmnd, sizeof(cmd->data_cmnd)); | ||
| 487 | cmd->request_buffer = cmd->buffer; | ||
| 488 | cmd->request_bufflen = cmd->bufflen; | ||
| 489 | cmd->use_sg = cmd->old_use_sg; | ||
| 490 | cmd->cmd_len = cmd->old_cmd_len; | ||
| 491 | cmd->sc_data_direction = cmd->sc_old_data_direction; | ||
| 492 | cmd->underflow = cmd->old_underflow; | ||
| 493 | } | 449 | } |
| 494 | 450 | ||
| 495 | void scsi_device_unbusy(struct scsi_device *sdev) | 451 | void scsi_device_unbusy(struct scsi_device *sdev) |
| @@ -807,22 +763,13 @@ static void scsi_free_sgtable(struct scatterlist *sgl, int index) | |||
| 807 | */ | 763 | */ |
| 808 | static void scsi_release_buffers(struct scsi_cmnd *cmd) | 764 | static void scsi_release_buffers(struct scsi_cmnd *cmd) |
| 809 | { | 765 | { |
| 810 | struct request *req = cmd->request; | ||
| 811 | |||
| 812 | /* | ||
| 813 | * Free up any indirection buffers we allocated for DMA purposes. | ||
| 814 | */ | ||
| 815 | if (cmd->use_sg) | 766 | if (cmd->use_sg) |
| 816 | scsi_free_sgtable(cmd->request_buffer, cmd->sglist_len); | 767 | scsi_free_sgtable(cmd->request_buffer, cmd->sglist_len); |
| 817 | else if (cmd->request_buffer != req->buffer) | ||
| 818 | kfree(cmd->request_buffer); | ||
| 819 | 768 | ||
| 820 | /* | 769 | /* |
| 821 | * Zero these out. They now point to freed memory, and it is | 770 | * Zero these out. They now point to freed memory, and it is |
| 822 | * dangerous to hang onto the pointers. | 771 | * dangerous to hang onto the pointers. |
| 823 | */ | 772 | */ |
| 824 | cmd->buffer = NULL; | ||
| 825 | cmd->bufflen = 0; | ||
| 826 | cmd->request_buffer = NULL; | 773 | cmd->request_buffer = NULL; |
| 827 | cmd->request_bufflen = 0; | 774 | cmd->request_bufflen = 0; |
| 828 | } | 775 | } |
| @@ -858,7 +805,7 @@ static void scsi_release_buffers(struct scsi_cmnd *cmd) | |||
| 858 | void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes) | 805 | void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes) |
| 859 | { | 806 | { |
| 860 | int result = cmd->result; | 807 | int result = cmd->result; |
| 861 | int this_count = cmd->bufflen; | 808 | int this_count = cmd->request_bufflen; |
| 862 | request_queue_t *q = cmd->device->request_queue; | 809 | request_queue_t *q = cmd->device->request_queue; |
| 863 | struct request *req = cmd->request; | 810 | struct request *req = cmd->request; |
| 864 | int clear_errors = 1; | 811 | int clear_errors = 1; |
| @@ -866,28 +813,14 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes) | |||
| 866 | int sense_valid = 0; | 813 | int sense_valid = 0; |
| 867 | int sense_deferred = 0; | 814 | int sense_deferred = 0; |
| 868 | 815 | ||
| 869 | /* | 816 | scsi_release_buffers(cmd); |
| 870 | * Free up any indirection buffers we allocated for DMA purposes. | ||
| 871 | * For the case of a READ, we need to copy the data out of the | ||
| 872 | * bounce buffer and into the real buffer. | ||
| 873 | */ | ||
| 874 | if (cmd->use_sg) | ||
| 875 | scsi_free_sgtable(cmd->buffer, cmd->sglist_len); | ||
| 876 | else if (cmd->buffer != req->buffer) { | ||
| 877 | if (rq_data_dir(req) == READ) { | ||
| 878 | unsigned long flags; | ||
| 879 | char *to = bio_kmap_irq(req->bio, &flags); | ||
| 880 | memcpy(to, cmd->buffer, cmd->bufflen); | ||
| 881 | bio_kunmap_irq(to, &flags); | ||
| 882 | } | ||
| 883 | kfree(cmd->buffer); | ||
| 884 | } | ||
| 885 | 817 | ||
| 886 | if (result) { | 818 | if (result) { |
| 887 | sense_valid = scsi_command_normalize_sense(cmd, &sshdr); | 819 | sense_valid = scsi_command_normalize_sense(cmd, &sshdr); |
| 888 | if (sense_valid) | 820 | if (sense_valid) |
| 889 | sense_deferred = scsi_sense_is_deferred(&sshdr); | 821 | sense_deferred = scsi_sense_is_deferred(&sshdr); |
| 890 | } | 822 | } |
| 823 | |||
| 891 | if (blk_pc_request(req)) { /* SG_IO ioctl from block level */ | 824 | if (blk_pc_request(req)) { /* SG_IO ioctl from block level */ |
| 892 | req->errors = result; | 825 | req->errors = result; |
| 893 | if (result) { | 826 | if (result) { |
| @@ -908,15 +841,6 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes) | |||
| 908 | } | 841 | } |
| 909 | 842 | ||
| 910 | /* | 843 | /* |
| 911 | * Zero these out. They now point to freed memory, and it is | ||
| 912 | * dangerous to hang onto the pointers. | ||
| 913 | */ | ||
| 914 | cmd->buffer = NULL; | ||
| 915 | cmd->bufflen = 0; | ||
| 916 | cmd->request_buffer = NULL; | ||
| 917 | cmd->request_bufflen = 0; | ||
| 918 | |||
| 919 | /* | ||
| 920 | * Next deal with any sectors which we were able to correctly | 844 | * Next deal with any sectors which we were able to correctly |
| 921 | * handle. | 845 | * handle. |
| 922 | */ | 846 | */ |
| @@ -1012,7 +936,7 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes) | |||
| 1012 | if (!(req->flags & REQ_QUIET)) { | 936 | if (!(req->flags & REQ_QUIET)) { |
| 1013 | scmd_printk(KERN_INFO, cmd, | 937 | scmd_printk(KERN_INFO, cmd, |
| 1014 | "Volume overflow, CDB: "); | 938 | "Volume overflow, CDB: "); |
| 1015 | __scsi_print_command(cmd->data_cmnd); | 939 | __scsi_print_command(cmd->cmnd); |
| 1016 | scsi_print_sense("", cmd); | 940 | scsi_print_sense("", cmd); |
| 1017 | } | 941 | } |
| 1018 | /* See SSC3rXX or current. */ | 942 | /* See SSC3rXX or current. */ |
| @@ -1143,7 +1067,7 @@ static void scsi_blk_pc_done(struct scsi_cmnd *cmd) | |||
| 1143 | * successfully. Since this is a REQ_BLOCK_PC command the | 1067 | * successfully. Since this is a REQ_BLOCK_PC command the |
| 1144 | * caller should check the request's errors value | 1068 | * caller should check the request's errors value |
| 1145 | */ | 1069 | */ |
| 1146 | scsi_io_completion(cmd, cmd->bufflen); | 1070 | scsi_io_completion(cmd, cmd->request_bufflen); |
| 1147 | } | 1071 | } |
| 1148 | 1072 | ||
| 1149 | static void scsi_setup_blk_pc_cmnd(struct scsi_cmnd *cmd) | 1073 | static void scsi_setup_blk_pc_cmnd(struct scsi_cmnd *cmd) |
