diff options
| author | Christoph Hellwig <hch@lst.de> | 2014-05-01 10:51:04 -0400 |
|---|---|---|
| committer | Christoph Hellwig <hch@lst.de> | 2014-05-19 06:35:09 -0400 |
| commit | a1b73fc194e73ed33c8b77bf09374cb05b58151b (patch) | |
| tree | 6487feb93c538ca97313408dabdb1f957d6246fe | |
| parent | bc85dc500f9df9b2eec15077e5046672c46adeaa (diff) | |
scsi: reintroduce scsi_driver.init_command
Instead of letting the ULD play games with the prep_fn move back to
the model of a central prep_fn with a callback to the ULD. This
already cleans up and shortens the code by itself, and will be required
to properly support blk-mq in the SCSI midlayer.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Nicholas Bellinger <nab@linux-iscsi.org>
Reviewed-by: Mike Christie <michaelc@cs.wisc.edu>
Reviewed-by: Hannes Reinecke <hare@suse.de>
| -rw-r--r-- | drivers/scsi/scsi_lib.c | 66 | ||||
| -rw-r--r-- | drivers/scsi/sd.c | 44 | ||||
| -rw-r--r-- | drivers/scsi/sr.c | 19 | ||||
| -rw-r--r-- | include/scsi/scsi_driver.h | 9 |
4 files changed, 62 insertions, 76 deletions
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 045822befad9..9f841df6add8 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
| @@ -1073,15 +1073,7 @@ static struct scsi_cmnd *scsi_get_cmd_from_req(struct scsi_device *sdev, | |||
| 1073 | 1073 | ||
| 1074 | 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) |
| 1075 | { | 1075 | { |
| 1076 | struct scsi_cmnd *cmd; | 1076 | struct scsi_cmnd *cmd = req->special; |
| 1077 | int ret = scsi_prep_state_check(sdev, req); | ||
| 1078 | |||
| 1079 | if (ret != BLKPREP_OK) | ||
| 1080 | return ret; | ||
| 1081 | |||
| 1082 | cmd = scsi_get_cmd_from_req(sdev, req); | ||
| 1083 | if (unlikely(!cmd)) | ||
| 1084 | return BLKPREP_DEFER; | ||
| 1085 | 1077 | ||
| 1086 | /* | 1078 | /* |
| 1087 | * BLOCK_PC requests may transfer data, in which case they must | 1079 | * BLOCK_PC requests may transfer data, in which case they must |
| @@ -1125,15 +1117,11 @@ EXPORT_SYMBOL(scsi_setup_blk_pc_cmnd); | |||
| 1125 | */ | 1117 | */ |
| 1126 | 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) |
| 1127 | { | 1119 | { |
| 1128 | struct scsi_cmnd *cmd; | 1120 | struct scsi_cmnd *cmd = req->special; |
| 1129 | int ret = scsi_prep_state_check(sdev, req); | ||
| 1130 | |||
| 1131 | if (ret != BLKPREP_OK) | ||
| 1132 | return ret; | ||
| 1133 | 1121 | ||
| 1134 | 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 |
| 1135 | && sdev->scsi_dh_data->scsi_dh->prep_fn)) { | 1123 | && sdev->scsi_dh_data->scsi_dh->prep_fn)) { |
| 1136 | ret = sdev->scsi_dh_data->scsi_dh->prep_fn(sdev, req); | 1124 | int ret = sdev->scsi_dh_data->scsi_dh->prep_fn(sdev, req); |
| 1137 | if (ret != BLKPREP_OK) | 1125 | if (ret != BLKPREP_OK) |
| 1138 | return ret; | 1126 | return ret; |
| 1139 | } | 1127 | } |
| @@ -1143,16 +1131,13 @@ int scsi_setup_fs_cmnd(struct scsi_device *sdev, struct request *req) | |||
| 1143 | */ | 1131 | */ |
| 1144 | BUG_ON(!req->nr_phys_segments); | 1132 | BUG_ON(!req->nr_phys_segments); |
| 1145 | 1133 | ||
| 1146 | cmd = scsi_get_cmd_from_req(sdev, req); | ||
| 1147 | if (unlikely(!cmd)) | ||
| 1148 | return BLKPREP_DEFER; | ||
| 1149 | |||
| 1150 | memset(cmd->cmnd, 0, BLK_MAX_CDB); | 1134 | memset(cmd->cmnd, 0, BLK_MAX_CDB); |
| 1151 | return scsi_init_io(cmd, GFP_ATOMIC); | 1135 | return scsi_init_io(cmd, GFP_ATOMIC); |
| 1152 | } | 1136 | } |
| 1153 | EXPORT_SYMBOL(scsi_setup_fs_cmnd); | 1137 | EXPORT_SYMBOL(scsi_setup_fs_cmnd); |
| 1154 | 1138 | ||
| 1155 | 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) | ||
| 1156 | { | 1141 | { |
| 1157 | int ret = BLKPREP_OK; | 1142 | int ret = BLKPREP_OK; |
| 1158 | 1143 | ||
| @@ -1204,9 +1189,9 @@ int scsi_prep_state_check(struct scsi_device *sdev, struct request *req) | |||
| 1204 | } | 1189 | } |
| 1205 | return ret; | 1190 | return ret; |
| 1206 | } | 1191 | } |
| 1207 | EXPORT_SYMBOL(scsi_prep_state_check); | ||
| 1208 | 1192 | ||
| 1209 | 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) | ||
| 1210 | { | 1195 | { |
| 1211 | struct scsi_device *sdev = q->queuedata; | 1196 | struct scsi_device *sdev = q->queuedata; |
| 1212 | 1197 | ||
| @@ -1237,18 +1222,44 @@ int scsi_prep_return(struct request_queue *q, struct request *req, int ret) | |||
| 1237 | 1222 | ||
| 1238 | return ret; | 1223 | return ret; |
| 1239 | } | 1224 | } |
| 1240 | EXPORT_SYMBOL(scsi_prep_return); | ||
| 1241 | 1225 | ||
| 1242 | int scsi_prep_fn(struct request_queue *q, struct request *req) | 1226 | static int scsi_prep_fn(struct request_queue *q, struct request *req) |
| 1243 | { | 1227 | { |
| 1244 | struct scsi_device *sdev = q->queuedata; | 1228 | struct scsi_device *sdev = q->queuedata; |
| 1245 | int ret = BLKPREP_KILL; | 1229 | struct scsi_cmnd *cmd; |
| 1230 | int ret; | ||
| 1246 | 1231 | ||
| 1247 | 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) | ||
| 1248 | 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: | ||
| 1249 | return scsi_prep_return(q, req, ret); | 1250 | return scsi_prep_return(q, req, ret); |
| 1250 | } | 1251 | } |
| 1251 | 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 | } | ||
| 1252 | 1263 | ||
| 1253 | /* | 1264 | /* |
| 1254 | * 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 |
| @@ -1669,6 +1680,7 @@ struct request_queue *scsi_alloc_queue(struct scsi_device *sdev) | |||
| 1669 | return NULL; | 1680 | return NULL; |
| 1670 | 1681 | ||
| 1671 | 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); | ||
| 1672 | blk_queue_softirq_done(q, scsi_softirq_done); | 1684 | blk_queue_softirq_done(q, scsi_softirq_done); |
| 1673 | blk_queue_rq_timed_out(q, scsi_times_out); | 1685 | blk_queue_rq_timed_out(q, scsi_times_out); |
| 1674 | 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..aa028d8ae774 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 | /** |
| @@ -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/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 */ |
