diff options
-rw-r--r-- | drivers/scsi/scsi_error.c | 7 | ||||
-rw-r--r-- | drivers/scsi/scsi_lib.c | 225 | ||||
-rw-r--r-- | drivers/scsi/sd.c | 48 | ||||
-rw-r--r-- | drivers/scsi/sr.c | 19 | ||||
-rw-r--r-- | include/scsi/osd_protocol.h | 10 | ||||
-rw-r--r-- | include/scsi/scsi_driver.h | 9 |
6 files changed, 127 insertions, 191 deletions
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c index f17aa7aa7879..47a1ffc4c904 100644 --- a/drivers/scsi/scsi_error.c +++ b/drivers/scsi/scsi_error.c | |||
@@ -1029,6 +1029,7 @@ retry: | |||
1029 | rtn = NEEDS_RETRY; | 1029 | rtn = NEEDS_RETRY; |
1030 | } else { | 1030 | } else { |
1031 | timeleft = wait_for_completion_timeout(&done, timeout); | 1031 | timeleft = wait_for_completion_timeout(&done, timeout); |
1032 | rtn = SUCCESS; | ||
1032 | } | 1033 | } |
1033 | 1034 | ||
1034 | shost->eh_action = NULL; | 1035 | shost->eh_action = NULL; |
@@ -2306,6 +2307,12 @@ scsi_reset_provider(struct scsi_device *dev, int flag) | |||
2306 | } | 2307 | } |
2307 | 2308 | ||
2308 | scmd = scsi_get_command(dev, GFP_KERNEL); | 2309 | scmd = scsi_get_command(dev, GFP_KERNEL); |
2310 | if (!scmd) { | ||
2311 | rtn = FAILED; | ||
2312 | put_device(&dev->sdev_gendev); | ||
2313 | goto out_put_autopm_host; | ||
2314 | } | ||
2315 | |||
2309 | blk_rq_init(NULL, &req); | 2316 | blk_rq_init(NULL, &req); |
2310 | scmd->request = &req; | 2317 | scmd->request = &req; |
2311 | 2318 | ||
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 9db097a28a74..9f841df6add8 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
@@ -512,68 +512,6 @@ void scsi_run_host_queues(struct Scsi_Host *shost) | |||
512 | scsi_run_queue(sdev->request_queue); | 512 | scsi_run_queue(sdev->request_queue); |
513 | } | 513 | } |
514 | 514 | ||
515 | static void __scsi_release_buffers(struct scsi_cmnd *, int); | ||
516 | |||
517 | /* | ||
518 | * Function: scsi_end_request() | ||
519 | * | ||
520 | * Purpose: Post-processing of completed commands (usually invoked at end | ||
521 | * of upper level post-processing and scsi_io_completion). | ||
522 | * | ||
523 | * Arguments: cmd - command that is complete. | ||
524 | * error - 0 if I/O indicates success, < 0 for I/O error. | ||
525 | * bytes - number of bytes of completed I/O | ||
526 | * requeue - indicates whether we should requeue leftovers. | ||
527 | * | ||
528 | * Lock status: Assumed that lock is not held upon entry. | ||
529 | * | ||
530 | * Returns: cmd if requeue required, NULL otherwise. | ||
531 | * | ||
532 | * Notes: This is called for block device requests in order to | ||
533 | * mark some number of sectors as complete. | ||
534 | * | ||
535 | * We are guaranteeing that the request queue will be goosed | ||
536 | * at some point during this call. | ||
537 | * Notes: If cmd was requeued, upon return it will be a stale pointer. | ||
538 | */ | ||
539 | static struct scsi_cmnd *scsi_end_request(struct scsi_cmnd *cmd, int error, | ||
540 | int bytes, int requeue) | ||
541 | { | ||
542 | struct request_queue *q = cmd->device->request_queue; | ||
543 | struct request *req = cmd->request; | ||
544 | |||
545 | /* | ||
546 | * If there are blocks left over at the end, set up the command | ||
547 | * to queue the remainder of them. | ||
548 | */ | ||
549 | if (blk_end_request(req, error, bytes)) { | ||
550 | /* kill remainder if no retrys */ | ||
551 | if (error && scsi_noretry_cmd(cmd)) | ||
552 | blk_end_request_all(req, error); | ||
553 | else { | ||
554 | if (requeue) { | ||
555 | /* | ||
556 | * Bleah. Leftovers again. Stick the | ||
557 | * leftovers in the front of the | ||
558 | * queue, and goose the queue again. | ||
559 | */ | ||
560 | scsi_release_buffers(cmd); | ||
561 | scsi_requeue_command(q, cmd); | ||
562 | cmd = NULL; | ||
563 | } | ||
564 | return cmd; | ||
565 | } | ||
566 | } | ||
567 | |||
568 | /* | ||
569 | * This will goose the queue request function at the end, so we don't | ||
570 | * need to worry about launching another command. | ||
571 | */ | ||
572 | __scsi_release_buffers(cmd, 0); | ||
573 | scsi_next_command(cmd); | ||
574 | return NULL; | ||
575 | } | ||
576 | |||
577 | static inline unsigned int scsi_sgtable_index(unsigned short nents) | 515 | static inline unsigned int scsi_sgtable_index(unsigned short nents) |
578 | { | 516 | { |
579 | unsigned int index; | 517 | unsigned int index; |
@@ -625,30 +563,10 @@ static void scsi_free_sgtable(struct scsi_data_buffer *sdb) | |||
625 | __sg_free_table(&sdb->table, SCSI_MAX_SG_SEGMENTS, scsi_sg_free); | 563 | __sg_free_table(&sdb->table, SCSI_MAX_SG_SEGMENTS, scsi_sg_free); |
626 | } | 564 | } |
627 | 565 | ||
628 | static void __scsi_release_buffers(struct scsi_cmnd *cmd, int do_bidi_check) | ||
629 | { | ||
630 | |||
631 | if (cmd->sdb.table.nents) | ||
632 | scsi_free_sgtable(&cmd->sdb); | ||
633 | |||
634 | memset(&cmd->sdb, 0, sizeof(cmd->sdb)); | ||
635 | |||
636 | if (do_bidi_check && scsi_bidi_cmnd(cmd)) { | ||
637 | struct scsi_data_buffer *bidi_sdb = | ||
638 | cmd->request->next_rq->special; | ||
639 | scsi_free_sgtable(bidi_sdb); | ||
640 | kmem_cache_free(scsi_sdb_cache, bidi_sdb); | ||
641 | cmd->request->next_rq->special = NULL; | ||
642 | } | ||
643 | |||
644 | if (scsi_prot_sg_count(cmd)) | ||
645 | scsi_free_sgtable(cmd->prot_sdb); | ||
646 | } | ||
647 | |||
648 | /* | 566 | /* |
649 | * Function: scsi_release_buffers() | 567 | * Function: scsi_release_buffers() |
650 | * | 568 | * |
651 | * Purpose: Completion processing for block device I/O requests. | 569 | * Purpose: Free resources allocate for a scsi_command. |
652 | * | 570 | * |
653 | * Arguments: cmd - command that we are bailing. | 571 | * Arguments: cmd - command that we are bailing. |
654 | * | 572 | * |
@@ -659,15 +577,29 @@ static void __scsi_release_buffers(struct scsi_cmnd *cmd, int do_bidi_check) | |||
659 | * Notes: In the event that an upper level driver rejects a | 577 | * Notes: In the event that an upper level driver rejects a |
660 | * command, we must release resources allocated during | 578 | * command, we must release resources allocated during |
661 | * the __init_io() function. Primarily this would involve | 579 | * the __init_io() function. Primarily this would involve |
662 | * the scatter-gather table, and potentially any bounce | 580 | * the scatter-gather table. |
663 | * buffers. | ||
664 | */ | 581 | */ |
665 | void scsi_release_buffers(struct scsi_cmnd *cmd) | 582 | void scsi_release_buffers(struct scsi_cmnd *cmd) |
666 | { | 583 | { |
667 | __scsi_release_buffers(cmd, 1); | 584 | if (cmd->sdb.table.nents) |
585 | scsi_free_sgtable(&cmd->sdb); | ||
586 | |||
587 | memset(&cmd->sdb, 0, sizeof(cmd->sdb)); | ||
588 | |||
589 | if (scsi_prot_sg_count(cmd)) | ||
590 | scsi_free_sgtable(cmd->prot_sdb); | ||
668 | } | 591 | } |
669 | EXPORT_SYMBOL(scsi_release_buffers); | 592 | EXPORT_SYMBOL(scsi_release_buffers); |
670 | 593 | ||
594 | static void scsi_release_bidi_buffers(struct scsi_cmnd *cmd) | ||
595 | { | ||
596 | struct scsi_data_buffer *bidi_sdb = cmd->request->next_rq->special; | ||
597 | |||
598 | scsi_free_sgtable(bidi_sdb); | ||
599 | kmem_cache_free(scsi_sdb_cache, bidi_sdb); | ||
600 | cmd->request->next_rq->special = NULL; | ||
601 | } | ||
602 | |||
671 | /** | 603 | /** |
672 | * __scsi_error_from_host_byte - translate SCSI error code into errno | 604 | * __scsi_error_from_host_byte - translate SCSI error code into errno |
673 | * @cmd: SCSI command (unused) | 605 | * @cmd: SCSI command (unused) |
@@ -725,16 +657,9 @@ static int __scsi_error_from_host_byte(struct scsi_cmnd *cmd, int result) | |||
725 | * | 657 | * |
726 | * Returns: Nothing | 658 | * Returns: Nothing |
727 | * | 659 | * |
728 | * Notes: This function is matched in terms of capabilities to | 660 | * Notes: We will finish off the specified number of sectors. If we |
729 | * the function that created the scatter-gather list. | 661 | * are done, the command block will be released and the queue |
730 | * In other words, if there are no bounce buffers | 662 | * function will be goosed. If we are not done then we have to |
731 | * (the normal case for most drivers), we don't need | ||
732 | * the logic to deal with cleaning up afterwards. | ||
733 | * | ||
734 | * We must call scsi_end_request(). This will finish off | ||
735 | * the specified number of sectors. If we are done, the | ||
736 | * command block will be released and the queue function | ||
737 | * will be goosed. If we are not done then we have to | ||
738 | * figure out what to do next: | 663 | * figure out what to do next: |
739 | * | 664 | * |
740 | * a) We can call scsi_requeue_command(). The request | 665 | * a) We can call scsi_requeue_command(). The request |
@@ -743,7 +668,7 @@ static int __scsi_error_from_host_byte(struct scsi_cmnd *cmd, int result) | |||
743 | * be used if we made forward progress, or if we want | 668 | * be used if we made forward progress, or if we want |
744 | * to switch from READ(10) to READ(6) for example. | 669 | * to switch from READ(10) to READ(6) for example. |
745 | * | 670 | * |
746 | * b) We can call scsi_queue_insert(). The request will | 671 | * b) We can call __scsi_queue_insert(). The request will |
747 | * be put back on the queue and retried using the same | 672 | * be put back on the queue and retried using the same |
748 | * command as before, possibly after a delay. | 673 | * command as before, possibly after a delay. |
749 | * | 674 | * |
@@ -801,6 +726,8 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes) | |||
801 | req->next_rq->resid_len = scsi_in(cmd)->resid; | 726 | req->next_rq->resid_len = scsi_in(cmd)->resid; |
802 | 727 | ||
803 | scsi_release_buffers(cmd); | 728 | scsi_release_buffers(cmd); |
729 | scsi_release_bidi_buffers(cmd); | ||
730 | |||
804 | blk_end_request_all(req, 0); | 731 | blk_end_request_all(req, 0); |
805 | 732 | ||
806 | scsi_next_command(cmd); | 733 | scsi_next_command(cmd); |
@@ -840,12 +767,25 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes) | |||
840 | } | 767 | } |
841 | 768 | ||
842 | /* | 769 | /* |
843 | * A number of bytes were successfully read. If there | 770 | * If we finished all bytes in the request we are done now. |
844 | * are leftovers and there is some kind of error | ||
845 | * (result != 0), retry the rest. | ||
846 | */ | 771 | */ |
847 | if (scsi_end_request(cmd, error, good_bytes, result == 0) == NULL) | 772 | if (!blk_end_request(req, error, good_bytes)) |
848 | return; | 773 | goto next_command; |
774 | |||
775 | /* | ||
776 | * Kill remainder if no retrys. | ||
777 | */ | ||
778 | if (error && scsi_noretry_cmd(cmd)) { | ||
779 | blk_end_request_all(req, error); | ||
780 | goto next_command; | ||
781 | } | ||
782 | |||
783 | /* | ||
784 | * If there had been no error, but we have leftover bytes in the | ||
785 | * requeues just queue the command up again. | ||
786 | */ | ||
787 | if (result == 0) | ||
788 | goto requeue; | ||
849 | 789 | ||
850 | error = __scsi_error_from_host_byte(cmd, result); | 790 | error = __scsi_error_from_host_byte(cmd, result); |
851 | 791 | ||
@@ -973,7 +913,6 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes) | |||
973 | switch (action) { | 913 | switch (action) { |
974 | case ACTION_FAIL: | 914 | case ACTION_FAIL: |
975 | /* Give up and fail the remainder of the request */ | 915 | /* Give up and fail the remainder of the request */ |
976 | scsi_release_buffers(cmd); | ||
977 | if (!(req->cmd_flags & REQ_QUIET)) { | 916 | if (!(req->cmd_flags & REQ_QUIET)) { |
978 | if (description) | 917 | if (description) |
979 | scmd_printk(KERN_INFO, cmd, "%s\n", | 918 | scmd_printk(KERN_INFO, cmd, "%s\n", |
@@ -983,12 +922,11 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes) | |||
983 | scsi_print_sense("", cmd); | 922 | scsi_print_sense("", cmd); |
984 | scsi_print_command(cmd); | 923 | scsi_print_command(cmd); |
985 | } | 924 | } |
986 | if (blk_end_request_err(req, error)) | 925 | if (!blk_end_request_err(req, error)) |
987 | scsi_requeue_command(q, cmd); | 926 | goto next_command; |
988 | else | 927 | /*FALLTHRU*/ |
989 | scsi_next_command(cmd); | ||
990 | break; | ||
991 | case ACTION_REPREP: | 928 | case ACTION_REPREP: |
929 | requeue: | ||
992 | /* Unprep the request and put it back at the head of the queue. | 930 | /* Unprep the request and put it back at the head of the queue. |
993 | * A new command will be prepared and issued. | 931 | * A new command will be prepared and issued. |
994 | */ | 932 | */ |
@@ -1004,6 +942,11 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes) | |||
1004 | __scsi_queue_insert(cmd, SCSI_MLQUEUE_DEVICE_BUSY, 0); | 942 | __scsi_queue_insert(cmd, SCSI_MLQUEUE_DEVICE_BUSY, 0); |
1005 | break; | 943 | break; |
1006 | } | 944 | } |
945 | return; | ||
946 | |||
947 | next_command: | ||
948 | scsi_release_buffers(cmd); | ||
949 | scsi_next_command(cmd); | ||
1007 | } | 950 | } |
1008 | 951 | ||
1009 | static int scsi_init_sgtable(struct request *req, struct scsi_data_buffer *sdb, | 952 | static int scsi_init_sgtable(struct request *req, struct scsi_data_buffer *sdb, |
@@ -1130,15 +1073,7 @@ static struct scsi_cmnd *scsi_get_cmd_from_req(struct scsi_device *sdev, | |||
1130 | 1073 | ||
1131 | int scsi_setup_blk_pc_cmnd(struct scsi_device *sdev, struct request *req) | 1074 | int scsi_setup_blk_pc_cmnd(struct scsi_device *sdev, struct request *req) |
1132 | { | 1075 | { |
1133 | struct scsi_cmnd *cmd; | 1076 | struct scsi_cmnd *cmd = req->special; |
1134 | int ret = scsi_prep_state_check(sdev, req); | ||
1135 | |||
1136 | if (ret != BLKPREP_OK) | ||
1137 | return ret; | ||
1138 | |||
1139 | cmd = scsi_get_cmd_from_req(sdev, req); | ||
1140 | if (unlikely(!cmd)) | ||
1141 | return BLKPREP_DEFER; | ||
1142 | 1077 | ||
1143 | /* | 1078 | /* |
1144 | * BLOCK_PC requests may transfer data, in which case they must | 1079 | * BLOCK_PC requests may transfer data, in which case they must |
@@ -1182,15 +1117,11 @@ EXPORT_SYMBOL(scsi_setup_blk_pc_cmnd); | |||
1182 | */ | 1117 | */ |
1183 | int scsi_setup_fs_cmnd(struct scsi_device *sdev, struct request *req) | 1118 | int scsi_setup_fs_cmnd(struct scsi_device *sdev, struct request *req) |
1184 | { | 1119 | { |
1185 | struct scsi_cmnd *cmd; | 1120 | struct scsi_cmnd *cmd = req->special; |
1186 | int ret = scsi_prep_state_check(sdev, req); | ||
1187 | |||
1188 | if (ret != BLKPREP_OK) | ||
1189 | return ret; | ||
1190 | 1121 | ||
1191 | if (unlikely(sdev->scsi_dh_data && sdev->scsi_dh_data->scsi_dh | 1122 | if (unlikely(sdev->scsi_dh_data && sdev->scsi_dh_data->scsi_dh |
1192 | && sdev->scsi_dh_data->scsi_dh->prep_fn)) { | 1123 | && sdev->scsi_dh_data->scsi_dh->prep_fn)) { |
1193 | ret = sdev->scsi_dh_data->scsi_dh->prep_fn(sdev, req); | 1124 | int ret = sdev->scsi_dh_data->scsi_dh->prep_fn(sdev, req); |
1194 | if (ret != BLKPREP_OK) | 1125 | if (ret != BLKPREP_OK) |
1195 | return ret; | 1126 | return ret; |
1196 | } | 1127 | } |
@@ -1200,16 +1131,13 @@ int scsi_setup_fs_cmnd(struct scsi_device *sdev, struct request *req) | |||
1200 | */ | 1131 | */ |
1201 | BUG_ON(!req->nr_phys_segments); | 1132 | BUG_ON(!req->nr_phys_segments); |
1202 | 1133 | ||
1203 | cmd = scsi_get_cmd_from_req(sdev, req); | ||
1204 | if (unlikely(!cmd)) | ||
1205 | return BLKPREP_DEFER; | ||
1206 | |||
1207 | memset(cmd->cmnd, 0, BLK_MAX_CDB); | 1134 | memset(cmd->cmnd, 0, BLK_MAX_CDB); |
1208 | return scsi_init_io(cmd, GFP_ATOMIC); | 1135 | return scsi_init_io(cmd, GFP_ATOMIC); |
1209 | } | 1136 | } |
1210 | EXPORT_SYMBOL(scsi_setup_fs_cmnd); | 1137 | EXPORT_SYMBOL(scsi_setup_fs_cmnd); |
1211 | 1138 | ||
1212 | int scsi_prep_state_check(struct scsi_device *sdev, struct request *req) | 1139 | static int |
1140 | scsi_prep_state_check(struct scsi_device *sdev, struct request *req) | ||
1213 | { | 1141 | { |
1214 | int ret = BLKPREP_OK; | 1142 | int ret = BLKPREP_OK; |
1215 | 1143 | ||
@@ -1261,9 +1189,9 @@ int scsi_prep_state_check(struct scsi_device *sdev, struct request *req) | |||
1261 | } | 1189 | } |
1262 | return ret; | 1190 | return ret; |
1263 | } | 1191 | } |
1264 | EXPORT_SYMBOL(scsi_prep_state_check); | ||
1265 | 1192 | ||
1266 | int scsi_prep_return(struct request_queue *q, struct request *req, int ret) | 1193 | static int |
1194 | scsi_prep_return(struct request_queue *q, struct request *req, int ret) | ||
1267 | { | 1195 | { |
1268 | struct scsi_device *sdev = q->queuedata; | 1196 | struct scsi_device *sdev = q->queuedata; |
1269 | 1197 | ||
@@ -1294,18 +1222,44 @@ int scsi_prep_return(struct request_queue *q, struct request *req, int ret) | |||
1294 | 1222 | ||
1295 | return ret; | 1223 | return ret; |
1296 | } | 1224 | } |
1297 | EXPORT_SYMBOL(scsi_prep_return); | ||
1298 | 1225 | ||
1299 | int scsi_prep_fn(struct request_queue *q, struct request *req) | 1226 | static int scsi_prep_fn(struct request_queue *q, struct request *req) |
1300 | { | 1227 | { |
1301 | struct scsi_device *sdev = q->queuedata; | 1228 | struct scsi_device *sdev = q->queuedata; |
1302 | int ret = BLKPREP_KILL; | 1229 | struct scsi_cmnd *cmd; |
1230 | int ret; | ||
1303 | 1231 | ||
1304 | if (req->cmd_type == REQ_TYPE_BLOCK_PC) | 1232 | ret = scsi_prep_state_check(sdev, req); |
1233 | if (ret != BLKPREP_OK) | ||
1234 | goto out; | ||
1235 | |||
1236 | cmd = scsi_get_cmd_from_req(sdev, req); | ||
1237 | if (unlikely(!cmd)) { | ||
1238 | ret = BLKPREP_DEFER; | ||
1239 | goto out; | ||
1240 | } | ||
1241 | |||
1242 | if (req->cmd_type == REQ_TYPE_FS) | ||
1243 | ret = scsi_cmd_to_driver(cmd)->init_command(cmd); | ||
1244 | else if (req->cmd_type == REQ_TYPE_BLOCK_PC) | ||
1305 | ret = scsi_setup_blk_pc_cmnd(sdev, req); | 1245 | ret = scsi_setup_blk_pc_cmnd(sdev, req); |
1246 | else | ||
1247 | ret = BLKPREP_KILL; | ||
1248 | |||
1249 | out: | ||
1306 | return scsi_prep_return(q, req, ret); | 1250 | return scsi_prep_return(q, req, ret); |
1307 | } | 1251 | } |
1308 | EXPORT_SYMBOL(scsi_prep_fn); | 1252 | |
1253 | static void scsi_unprep_fn(struct request_queue *q, struct request *req) | ||
1254 | { | ||
1255 | if (req->cmd_type == REQ_TYPE_FS) { | ||
1256 | struct scsi_cmnd *cmd = req->special; | ||
1257 | struct scsi_driver *drv = scsi_cmd_to_driver(cmd); | ||
1258 | |||
1259 | if (drv->uninit_command) | ||
1260 | drv->uninit_command(cmd); | ||
1261 | } | ||
1262 | } | ||
1309 | 1263 | ||
1310 | /* | 1264 | /* |
1311 | * scsi_dev_queue_ready: if we can send requests to sdev, return 1 else | 1265 | * scsi_dev_queue_ready: if we can send requests to sdev, return 1 else |
@@ -1726,6 +1680,7 @@ struct request_queue *scsi_alloc_queue(struct scsi_device *sdev) | |||
1726 | return NULL; | 1680 | return NULL; |
1727 | 1681 | ||
1728 | blk_queue_prep_rq(q, scsi_prep_fn); | 1682 | blk_queue_prep_rq(q, scsi_prep_fn); |
1683 | blk_queue_unprep_rq(q, scsi_unprep_fn); | ||
1729 | blk_queue_softirq_done(q, scsi_softirq_done); | 1684 | blk_queue_softirq_done(q, scsi_softirq_done); |
1730 | blk_queue_rq_timed_out(q, scsi_times_out); | 1685 | blk_queue_rq_timed_out(q, scsi_times_out); |
1731 | blk_queue_lld_busy(q, scsi_lld_busy); | 1686 | blk_queue_lld_busy(q, scsi_lld_busy); |
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index efcbcd182863..321faf603035 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c | |||
@@ -109,6 +109,8 @@ static int sd_suspend_system(struct device *); | |||
109 | static int sd_suspend_runtime(struct device *); | 109 | static int sd_suspend_runtime(struct device *); |
110 | static int sd_resume(struct device *); | 110 | static int sd_resume(struct device *); |
111 | static void sd_rescan(struct device *); | 111 | static void sd_rescan(struct device *); |
112 | static int sd_init_command(struct scsi_cmnd *SCpnt); | ||
113 | static void sd_uninit_command(struct scsi_cmnd *SCpnt); | ||
112 | static int sd_done(struct scsi_cmnd *); | 114 | static int sd_done(struct scsi_cmnd *); |
113 | static int sd_eh_action(struct scsi_cmnd *, int); | 115 | static int sd_eh_action(struct scsi_cmnd *, int); |
114 | static void sd_read_capacity(struct scsi_disk *sdkp, unsigned char *buffer); | 116 | static void sd_read_capacity(struct scsi_disk *sdkp, unsigned char *buffer); |
@@ -503,6 +505,8 @@ static struct scsi_driver sd_template = { | |||
503 | .pm = &sd_pm_ops, | 505 | .pm = &sd_pm_ops, |
504 | }, | 506 | }, |
505 | .rescan = sd_rescan, | 507 | .rescan = sd_rescan, |
508 | .init_command = sd_init_command, | ||
509 | .uninit_command = sd_uninit_command, | ||
506 | .done = sd_done, | 510 | .done = sd_done, |
507 | .eh_action = sd_eh_action, | 511 | .eh_action = sd_eh_action, |
508 | }; | 512 | }; |
@@ -838,9 +842,9 @@ static int scsi_setup_flush_cmnd(struct scsi_device *sdp, struct request *rq) | |||
838 | return scsi_setup_blk_pc_cmnd(sdp, rq); | 842 | return scsi_setup_blk_pc_cmnd(sdp, rq); |
839 | } | 843 | } |
840 | 844 | ||
841 | static void sd_unprep_fn(struct request_queue *q, struct request *rq) | 845 | static void sd_uninit_command(struct scsi_cmnd *SCpnt) |
842 | { | 846 | { |
843 | struct scsi_cmnd *SCpnt = rq->special; | 847 | struct request *rq = SCpnt->request; |
844 | 848 | ||
845 | if (rq->cmd_flags & REQ_DISCARD) { | 849 | if (rq->cmd_flags & REQ_DISCARD) { |
846 | free_page((unsigned long)rq->buffer); | 850 | free_page((unsigned long)rq->buffer); |
@@ -853,18 +857,10 @@ static void sd_unprep_fn(struct request_queue *q, struct request *rq) | |||
853 | } | 857 | } |
854 | } | 858 | } |
855 | 859 | ||
856 | /** | 860 | static int sd_init_command(struct scsi_cmnd *SCpnt) |
857 | * sd_prep_fn - build a scsi (read or write) command from | ||
858 | * information in the request structure. | ||
859 | * @SCpnt: pointer to mid-level's per scsi command structure that | ||
860 | * contains request and into which the scsi command is written | ||
861 | * | ||
862 | * Returns 1 if successful and 0 if error (or cannot be done now). | ||
863 | **/ | ||
864 | static int sd_prep_fn(struct request_queue *q, struct request *rq) | ||
865 | { | 861 | { |
866 | struct scsi_cmnd *SCpnt; | 862 | struct request *rq = SCpnt->request; |
867 | struct scsi_device *sdp = q->queuedata; | 863 | struct scsi_device *sdp = SCpnt->device; |
868 | struct gendisk *disk = rq->rq_disk; | 864 | struct gendisk *disk = rq->rq_disk; |
869 | struct scsi_disk *sdkp; | 865 | struct scsi_disk *sdkp; |
870 | sector_t block = blk_rq_pos(rq); | 866 | sector_t block = blk_rq_pos(rq); |
@@ -886,12 +882,6 @@ static int sd_prep_fn(struct request_queue *q, struct request *rq) | |||
886 | } else if (rq->cmd_flags & REQ_FLUSH) { | 882 | } else if (rq->cmd_flags & REQ_FLUSH) { |
887 | ret = scsi_setup_flush_cmnd(sdp, rq); | 883 | ret = scsi_setup_flush_cmnd(sdp, rq); |
888 | goto out; | 884 | goto out; |
889 | } else if (rq->cmd_type == REQ_TYPE_BLOCK_PC) { | ||
890 | ret = scsi_setup_blk_pc_cmnd(sdp, rq); | ||
891 | goto out; | ||
892 | } else if (rq->cmd_type != REQ_TYPE_FS) { | ||
893 | ret = BLKPREP_KILL; | ||
894 | goto out; | ||
895 | } | 885 | } |
896 | ret = scsi_setup_fs_cmnd(sdp, rq); | 886 | ret = scsi_setup_fs_cmnd(sdp, rq); |
897 | if (ret != BLKPREP_OK) | 887 | if (ret != BLKPREP_OK) |
@@ -903,11 +893,10 @@ static int sd_prep_fn(struct request_queue *q, struct request *rq) | |||
903 | * is used for a killable error condition */ | 893 | * is used for a killable error condition */ |
904 | ret = BLKPREP_KILL; | 894 | ret = BLKPREP_KILL; |
905 | 895 | ||
906 | SCSI_LOG_HLQUEUE(1, scmd_printk(KERN_INFO, SCpnt, | 896 | SCSI_LOG_HLQUEUE(1, |
907 | "sd_prep_fn: block=%llu, " | 897 | scmd_printk(KERN_INFO, SCpnt, |
908 | "count=%d\n", | 898 | "%s: block=%llu, count=%d\n", |
909 | (unsigned long long)block, | 899 | __func__, (unsigned long long)block, this_count)); |
910 | this_count)); | ||
911 | 900 | ||
912 | if (!sdp || !scsi_device_online(sdp) || | 901 | if (!sdp || !scsi_device_online(sdp) || |
913 | block + blk_rq_sectors(rq) > get_capacity(disk)) { | 902 | block + blk_rq_sectors(rq) > get_capacity(disk)) { |
@@ -1127,7 +1116,7 @@ static int sd_prep_fn(struct request_queue *q, struct request *rq) | |||
1127 | */ | 1116 | */ |
1128 | ret = BLKPREP_OK; | 1117 | ret = BLKPREP_OK; |
1129 | out: | 1118 | out: |
1130 | return scsi_prep_return(q, rq, ret); | 1119 | return ret; |
1131 | } | 1120 | } |
1132 | 1121 | ||
1133 | /** | 1122 | /** |
@@ -1689,12 +1678,12 @@ static int sd_done(struct scsi_cmnd *SCpnt) | |||
1689 | sshdr.ascq)); | 1678 | sshdr.ascq)); |
1690 | } | 1679 | } |
1691 | #endif | 1680 | #endif |
1681 | sdkp->medium_access_timed_out = 0; | ||
1682 | |||
1692 | if (driver_byte(result) != DRIVER_SENSE && | 1683 | if (driver_byte(result) != DRIVER_SENSE && |
1693 | (!sense_valid || sense_deferred)) | 1684 | (!sense_valid || sense_deferred)) |
1694 | goto out; | 1685 | goto out; |
1695 | 1686 | ||
1696 | sdkp->medium_access_timed_out = 0; | ||
1697 | |||
1698 | switch (sshdr.sense_key) { | 1687 | switch (sshdr.sense_key) { |
1699 | case HARDWARE_ERROR: | 1688 | case HARDWARE_ERROR: |
1700 | case MEDIUM_ERROR: | 1689 | case MEDIUM_ERROR: |
@@ -2878,9 +2867,6 @@ static void sd_probe_async(void *data, async_cookie_t cookie) | |||
2878 | 2867 | ||
2879 | sd_revalidate_disk(gd); | 2868 | sd_revalidate_disk(gd); |
2880 | 2869 | ||
2881 | blk_queue_prep_rq(sdp->request_queue, sd_prep_fn); | ||
2882 | blk_queue_unprep_rq(sdp->request_queue, sd_unprep_fn); | ||
2883 | |||
2884 | gd->driverfs_dev = &sdp->sdev_gendev; | 2870 | gd->driverfs_dev = &sdp->sdev_gendev; |
2885 | gd->flags = GENHD_FL_EXT_DEVT; | 2871 | gd->flags = GENHD_FL_EXT_DEVT; |
2886 | if (sdp->removable) { | 2872 | if (sdp->removable) { |
@@ -3028,8 +3014,6 @@ static int sd_remove(struct device *dev) | |||
3028 | 3014 | ||
3029 | async_synchronize_full_domain(&scsi_sd_pm_domain); | 3015 | async_synchronize_full_domain(&scsi_sd_pm_domain); |
3030 | async_synchronize_full_domain(&scsi_sd_probe_domain); | 3016 | async_synchronize_full_domain(&scsi_sd_probe_domain); |
3031 | blk_queue_prep_rq(sdkp->device->request_queue, scsi_prep_fn); | ||
3032 | blk_queue_unprep_rq(sdkp->device->request_queue, NULL); | ||
3033 | device_del(&sdkp->dev); | 3017 | device_del(&sdkp->dev); |
3034 | del_gendisk(sdkp->disk); | 3018 | del_gendisk(sdkp->disk); |
3035 | sd_shutdown(dev); | 3019 | sd_shutdown(dev); |
diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c index 40d85929aefe..93cbd36c990b 100644 --- a/drivers/scsi/sr.c +++ b/drivers/scsi/sr.c | |||
@@ -79,6 +79,7 @@ MODULE_ALIAS_SCSI_DEVICE(TYPE_WORM); | |||
79 | static DEFINE_MUTEX(sr_mutex); | 79 | static DEFINE_MUTEX(sr_mutex); |
80 | static int sr_probe(struct device *); | 80 | static int sr_probe(struct device *); |
81 | static int sr_remove(struct device *); | 81 | static int sr_remove(struct device *); |
82 | static int sr_init_command(struct scsi_cmnd *SCpnt); | ||
82 | static int sr_done(struct scsi_cmnd *); | 83 | static int sr_done(struct scsi_cmnd *); |
83 | static int sr_runtime_suspend(struct device *dev); | 84 | static int sr_runtime_suspend(struct device *dev); |
84 | 85 | ||
@@ -94,6 +95,7 @@ static struct scsi_driver sr_template = { | |||
94 | .remove = sr_remove, | 95 | .remove = sr_remove, |
95 | .pm = &sr_pm_ops, | 96 | .pm = &sr_pm_ops, |
96 | }, | 97 | }, |
98 | .init_command = sr_init_command, | ||
97 | .done = sr_done, | 99 | .done = sr_done, |
98 | }; | 100 | }; |
99 | 101 | ||
@@ -378,21 +380,14 @@ static int sr_done(struct scsi_cmnd *SCpnt) | |||
378 | return good_bytes; | 380 | return good_bytes; |
379 | } | 381 | } |
380 | 382 | ||
381 | static int sr_prep_fn(struct request_queue *q, struct request *rq) | 383 | static int sr_init_command(struct scsi_cmnd *SCpnt) |
382 | { | 384 | { |
383 | int block = 0, this_count, s_size; | 385 | int block = 0, this_count, s_size; |
384 | struct scsi_cd *cd; | 386 | struct scsi_cd *cd; |
385 | struct scsi_cmnd *SCpnt; | 387 | struct request *rq = SCpnt->request; |
386 | struct scsi_device *sdp = q->queuedata; | 388 | struct scsi_device *sdp = SCpnt->device; |
387 | int ret; | 389 | int ret; |
388 | 390 | ||
389 | if (rq->cmd_type == REQ_TYPE_BLOCK_PC) { | ||
390 | ret = scsi_setup_blk_pc_cmnd(sdp, rq); | ||
391 | goto out; | ||
392 | } else if (rq->cmd_type != REQ_TYPE_FS) { | ||
393 | ret = BLKPREP_KILL; | ||
394 | goto out; | ||
395 | } | ||
396 | ret = scsi_setup_fs_cmnd(sdp, rq); | 391 | ret = scsi_setup_fs_cmnd(sdp, rq); |
397 | if (ret != BLKPREP_OK) | 392 | if (ret != BLKPREP_OK) |
398 | goto out; | 393 | goto out; |
@@ -517,7 +512,7 @@ static int sr_prep_fn(struct request_queue *q, struct request *rq) | |||
517 | */ | 512 | */ |
518 | ret = BLKPREP_OK; | 513 | ret = BLKPREP_OK; |
519 | out: | 514 | out: |
520 | return scsi_prep_return(q, rq, ret); | 515 | return ret; |
521 | } | 516 | } |
522 | 517 | ||
523 | static int sr_block_open(struct block_device *bdev, fmode_t mode) | 518 | static int sr_block_open(struct block_device *bdev, fmode_t mode) |
@@ -718,7 +713,6 @@ static int sr_probe(struct device *dev) | |||
718 | 713 | ||
719 | /* FIXME: need to handle a get_capabilities failure properly ?? */ | 714 | /* FIXME: need to handle a get_capabilities failure properly ?? */ |
720 | get_capabilities(cd); | 715 | get_capabilities(cd); |
721 | blk_queue_prep_rq(sdev->request_queue, sr_prep_fn); | ||
722 | sr_vendor_init(cd); | 716 | sr_vendor_init(cd); |
723 | 717 | ||
724 | disk->driverfs_dev = &sdev->sdev_gendev; | 718 | disk->driverfs_dev = &sdev->sdev_gendev; |
@@ -993,7 +987,6 @@ static int sr_remove(struct device *dev) | |||
993 | 987 | ||
994 | scsi_autopm_get_device(cd->device); | 988 | scsi_autopm_get_device(cd->device); |
995 | 989 | ||
996 | blk_queue_prep_rq(cd->device->request_queue, scsi_prep_fn); | ||
997 | del_gendisk(cd->disk); | 990 | del_gendisk(cd->disk); |
998 | 991 | ||
999 | mutex_lock(&sr_ref_mutex); | 992 | mutex_lock(&sr_ref_mutex); |
diff --git a/include/scsi/osd_protocol.h b/include/scsi/osd_protocol.h index 25ac6283b9c7..a2594afe05c7 100644 --- a/include/scsi/osd_protocol.h +++ b/include/scsi/osd_protocol.h | |||
@@ -263,16 +263,16 @@ static inline struct osd_cdb_head *osd_cdb_head(struct osd_cdb *ocdb) | |||
263 | * Ex name = FORMAT_OSD we have OSD_ACT_FORMAT_OSD && OSDv1_ACT_FORMAT_OSD | 263 | * Ex name = FORMAT_OSD we have OSD_ACT_FORMAT_OSD && OSDv1_ACT_FORMAT_OSD |
264 | */ | 264 | */ |
265 | #define OSD_ACT___(Name, Num) \ | 265 | #define OSD_ACT___(Name, Num) \ |
266 | OSD_ACT_##Name = __constant_cpu_to_be16(0x8880 + Num), \ | 266 | OSD_ACT_##Name = cpu_to_be16(0x8880 + Num), \ |
267 | OSDv1_ACT_##Name = __constant_cpu_to_be16(0x8800 + Num), | 267 | OSDv1_ACT_##Name = cpu_to_be16(0x8800 + Num), |
268 | 268 | ||
269 | /* V2 only actions */ | 269 | /* V2 only actions */ |
270 | #define OSD_ACT_V2(Name, Num) \ | 270 | #define OSD_ACT_V2(Name, Num) \ |
271 | OSD_ACT_##Name = __constant_cpu_to_be16(0x8880 + Num), | 271 | OSD_ACT_##Name = cpu_to_be16(0x8880 + Num), |
272 | 272 | ||
273 | #define OSD_ACT_V1_V2(Name, Num1, Num2) \ | 273 | #define OSD_ACT_V1_V2(Name, Num1, Num2) \ |
274 | OSD_ACT_##Name = __constant_cpu_to_be16(Num2), \ | 274 | OSD_ACT_##Name = cpu_to_be16(Num2), \ |
275 | OSDv1_ACT_##Name = __constant_cpu_to_be16(Num1), | 275 | OSDv1_ACT_##Name = cpu_to_be16(Num1), |
276 | 276 | ||
277 | enum osd_service_actions { | 277 | enum osd_service_actions { |
278 | OSD_ACT_V2(OBJECT_STRUCTURE_CHECK, 0x00) | 278 | OSD_ACT_V2(OBJECT_STRUCTURE_CHECK, 0x00) |
diff --git a/include/scsi/scsi_driver.h b/include/scsi/scsi_driver.h index 20fdfc2526ad..36c4114ed9bc 100644 --- a/include/scsi/scsi_driver.h +++ b/include/scsi/scsi_driver.h | |||
@@ -4,17 +4,17 @@ | |||
4 | #include <linux/device.h> | 4 | #include <linux/device.h> |
5 | 5 | ||
6 | struct module; | 6 | struct module; |
7 | struct request; | ||
7 | struct scsi_cmnd; | 8 | struct scsi_cmnd; |
8 | struct scsi_device; | 9 | struct scsi_device; |
9 | struct request; | ||
10 | struct request_queue; | ||
11 | |||
12 | 10 | ||
13 | struct scsi_driver { | 11 | struct scsi_driver { |
14 | struct module *owner; | 12 | struct module *owner; |
15 | struct device_driver gendrv; | 13 | struct device_driver gendrv; |
16 | 14 | ||
17 | void (*rescan)(struct device *); | 15 | void (*rescan)(struct device *); |
16 | int (*init_command)(struct scsi_cmnd *); | ||
17 | void (*uninit_command)(struct scsi_cmnd *); | ||
18 | int (*done)(struct scsi_cmnd *); | 18 | int (*done)(struct scsi_cmnd *); |
19 | int (*eh_action)(struct scsi_cmnd *, int); | 19 | int (*eh_action)(struct scsi_cmnd *, int); |
20 | }; | 20 | }; |
@@ -31,8 +31,5 @@ extern int scsi_register_interface(struct class_interface *); | |||
31 | 31 | ||
32 | int scsi_setup_blk_pc_cmnd(struct scsi_device *sdev, struct request *req); | 32 | int scsi_setup_blk_pc_cmnd(struct scsi_device *sdev, struct request *req); |
33 | int scsi_setup_fs_cmnd(struct scsi_device *sdev, struct request *req); | 33 | int scsi_setup_fs_cmnd(struct scsi_device *sdev, struct request *req); |
34 | int scsi_prep_state_check(struct scsi_device *sdev, struct request *req); | ||
35 | int scsi_prep_return(struct request_queue *q, struct request *req, int ret); | ||
36 | int scsi_prep_fn(struct request_queue *, struct request *); | ||
37 | 34 | ||
38 | #endif /* _SCSI_SCSI_DRIVER_H */ | 35 | #endif /* _SCSI_SCSI_DRIVER_H */ |