diff options
Diffstat (limited to 'drivers/scsi/scsi_lib.c')
| -rw-r--r-- | drivers/scsi/scsi_lib.c | 313 |
1 files changed, 166 insertions, 147 deletions
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 743f67ed7640..ee35a62bb7a2 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
| @@ -995,25 +995,14 @@ static int scsi_init_io(struct scsi_cmnd *cmd) | |||
| 995 | int count; | 995 | int count; |
| 996 | 996 | ||
| 997 | /* | 997 | /* |
| 998 | * if this is a rq->data based REQ_BLOCK_PC, setup for a non-sg xfer | 998 | * We used to not use scatter-gather for single segment request, |
| 999 | */ | ||
| 1000 | if (blk_pc_request(req) && !req->bio) { | ||
| 1001 | cmd->request_bufflen = req->data_len; | ||
| 1002 | cmd->request_buffer = req->data; | ||
| 1003 | req->buffer = req->data; | ||
| 1004 | cmd->use_sg = 0; | ||
| 1005 | return 0; | ||
| 1006 | } | ||
| 1007 | |||
| 1008 | /* | ||
| 1009 | * we used to not use scatter-gather for single segment request, | ||
| 1010 | * but now we do (it makes highmem I/O easier to support without | 999 | * but now we do (it makes highmem I/O easier to support without |
| 1011 | * kmapping pages) | 1000 | * kmapping pages) |
| 1012 | */ | 1001 | */ |
| 1013 | cmd->use_sg = req->nr_phys_segments; | 1002 | cmd->use_sg = req->nr_phys_segments; |
| 1014 | 1003 | ||
| 1015 | /* | 1004 | /* |
| 1016 | * if sg table allocation fails, requeue request later. | 1005 | * If sg table allocation fails, requeue request later. |
| 1017 | */ | 1006 | */ |
| 1018 | sgpnt = scsi_alloc_sgtable(cmd, GFP_ATOMIC); | 1007 | sgpnt = scsi_alloc_sgtable(cmd, GFP_ATOMIC); |
| 1019 | if (unlikely(!sgpnt)) { | 1008 | if (unlikely(!sgpnt)) { |
| @@ -1021,24 +1010,21 @@ static int scsi_init_io(struct scsi_cmnd *cmd) | |||
| 1021 | return BLKPREP_DEFER; | 1010 | return BLKPREP_DEFER; |
| 1022 | } | 1011 | } |
| 1023 | 1012 | ||
| 1013 | req->buffer = NULL; | ||
| 1024 | cmd->request_buffer = (char *) sgpnt; | 1014 | cmd->request_buffer = (char *) sgpnt; |
| 1025 | cmd->request_bufflen = req->nr_sectors << 9; | ||
| 1026 | if (blk_pc_request(req)) | 1015 | if (blk_pc_request(req)) |
| 1027 | cmd->request_bufflen = req->data_len; | 1016 | cmd->request_bufflen = req->data_len; |
| 1028 | req->buffer = NULL; | 1017 | else |
| 1018 | cmd->request_bufflen = req->nr_sectors << 9; | ||
| 1029 | 1019 | ||
| 1030 | /* | 1020 | /* |
| 1031 | * Next, walk the list, and fill in the addresses and sizes of | 1021 | * Next, walk the list, and fill in the addresses and sizes of |
| 1032 | * each segment. | 1022 | * each segment. |
| 1033 | */ | 1023 | */ |
| 1034 | count = blk_rq_map_sg(req->q, req, cmd->request_buffer); | 1024 | count = blk_rq_map_sg(req->q, req, cmd->request_buffer); |
| 1035 | |||
| 1036 | /* | ||
| 1037 | * mapped well, send it off | ||
| 1038 | */ | ||
| 1039 | if (likely(count <= cmd->use_sg)) { | 1025 | if (likely(count <= cmd->use_sg)) { |
| 1040 | cmd->use_sg = count; | 1026 | cmd->use_sg = count; |
| 1041 | return 0; | 1027 | return BLKPREP_OK; |
| 1042 | } | 1028 | } |
| 1043 | 1029 | ||
| 1044 | printk(KERN_ERR "Incorrect number of segments after building list\n"); | 1030 | printk(KERN_ERR "Incorrect number of segments after building list\n"); |
| @@ -1068,6 +1054,27 @@ static int scsi_issue_flush_fn(request_queue_t *q, struct gendisk *disk, | |||
| 1068 | return -EOPNOTSUPP; | 1054 | return -EOPNOTSUPP; |
| 1069 | } | 1055 | } |
| 1070 | 1056 | ||
| 1057 | static struct scsi_cmnd *scsi_get_cmd_from_req(struct scsi_device *sdev, | ||
| 1058 | struct request *req) | ||
| 1059 | { | ||
| 1060 | struct scsi_cmnd *cmd; | ||
| 1061 | |||
| 1062 | if (!req->special) { | ||
| 1063 | cmd = scsi_get_command(sdev, GFP_ATOMIC); | ||
| 1064 | if (unlikely(!cmd)) | ||
| 1065 | return NULL; | ||
| 1066 | req->special = cmd; | ||
| 1067 | } else { | ||
| 1068 | cmd = req->special; | ||
| 1069 | } | ||
| 1070 | |||
| 1071 | /* pull a tag out of the request if we have one */ | ||
| 1072 | cmd->tag = req->tag; | ||
| 1073 | cmd->request = req; | ||
| 1074 | |||
| 1075 | return cmd; | ||
| 1076 | } | ||
| 1077 | |||
| 1071 | static void scsi_blk_pc_done(struct scsi_cmnd *cmd) | 1078 | static void scsi_blk_pc_done(struct scsi_cmnd *cmd) |
| 1072 | { | 1079 | { |
| 1073 | BUG_ON(!blk_pc_request(cmd->request)); | 1080 | BUG_ON(!blk_pc_request(cmd->request)); |
| @@ -1080,9 +1087,37 @@ static void scsi_blk_pc_done(struct scsi_cmnd *cmd) | |||
| 1080 | scsi_io_completion(cmd, cmd->request_bufflen); | 1087 | scsi_io_completion(cmd, cmd->request_bufflen); |
| 1081 | } | 1088 | } |
| 1082 | 1089 | ||
| 1083 | static void scsi_setup_blk_pc_cmnd(struct scsi_cmnd *cmd) | 1090 | static int scsi_setup_blk_pc_cmnd(struct scsi_device *sdev, struct request *req) |
| 1084 | { | 1091 | { |
| 1085 | struct request *req = cmd->request; | 1092 | struct scsi_cmnd *cmd; |
| 1093 | |||
| 1094 | cmd = scsi_get_cmd_from_req(sdev, req); | ||
| 1095 | if (unlikely(!cmd)) | ||
| 1096 | return BLKPREP_DEFER; | ||
| 1097 | |||
| 1098 | /* | ||
| 1099 | * BLOCK_PC requests may transfer data, in which case they must | ||
| 1100 | * a bio attached to them. Or they might contain a SCSI command | ||
| 1101 | * that does not transfer data, in which case they may optionally | ||
| 1102 | * submit a request without an attached bio. | ||
| 1103 | */ | ||
| 1104 | if (req->bio) { | ||
| 1105 | int ret; | ||
| 1106 | |||
| 1107 | BUG_ON(!req->nr_phys_segments); | ||
| 1108 | |||
| 1109 | ret = scsi_init_io(cmd); | ||
| 1110 | if (unlikely(ret)) | ||
| 1111 | return ret; | ||
| 1112 | } else { | ||
| 1113 | BUG_ON(req->data_len); | ||
| 1114 | BUG_ON(req->data); | ||
| 1115 | |||
| 1116 | cmd->request_bufflen = 0; | ||
| 1117 | cmd->request_buffer = NULL; | ||
| 1118 | cmd->use_sg = 0; | ||
| 1119 | req->buffer = NULL; | ||
| 1120 | } | ||
| 1086 | 1121 | ||
| 1087 | BUG_ON(sizeof(req->cmd) > sizeof(cmd->cmnd)); | 1122 | BUG_ON(sizeof(req->cmd) > sizeof(cmd->cmnd)); |
| 1088 | memcpy(cmd->cmnd, req->cmd, sizeof(cmd->cmnd)); | 1123 | memcpy(cmd->cmnd, req->cmd, sizeof(cmd->cmnd)); |
| @@ -1098,154 +1133,138 @@ static void scsi_setup_blk_pc_cmnd(struct scsi_cmnd *cmd) | |||
| 1098 | cmd->allowed = req->retries; | 1133 | cmd->allowed = req->retries; |
| 1099 | cmd->timeout_per_command = req->timeout; | 1134 | cmd->timeout_per_command = req->timeout; |
| 1100 | cmd->done = scsi_blk_pc_done; | 1135 | cmd->done = scsi_blk_pc_done; |
| 1136 | return BLKPREP_OK; | ||
| 1101 | } | 1137 | } |
| 1102 | 1138 | ||
| 1103 | static int scsi_prep_fn(struct request_queue *q, struct request *req) | 1139 | /* |
| 1140 | * Setup a REQ_TYPE_FS command. These are simple read/write request | ||
| 1141 | * from filesystems that still need to be translated to SCSI CDBs from | ||
| 1142 | * the ULD. | ||
| 1143 | */ | ||
| 1144 | static int scsi_setup_fs_cmnd(struct scsi_device *sdev, struct request *req) | ||
| 1104 | { | 1145 | { |
| 1105 | struct scsi_device *sdev = q->queuedata; | ||
| 1106 | struct scsi_cmnd *cmd; | 1146 | struct scsi_cmnd *cmd; |
| 1107 | int specials_only = 0; | 1147 | struct scsi_driver *drv; |
| 1148 | int ret; | ||
| 1108 | 1149 | ||
| 1109 | /* | 1150 | /* |
| 1110 | * Just check to see if the device is online. If it isn't, we | 1151 | * Filesystem requests must transfer data. |
| 1111 | * refuse to process any commands. The device must be brought | ||
| 1112 | * online before trying any recovery commands | ||
| 1113 | */ | 1152 | */ |
| 1114 | if (unlikely(!scsi_device_online(sdev))) { | 1153 | BUG_ON(!req->nr_phys_segments); |
| 1115 | sdev_printk(KERN_ERR, sdev, | 1154 | |
| 1116 | "rejecting I/O to offline device\n"); | 1155 | cmd = scsi_get_cmd_from_req(sdev, req); |
| 1117 | goto kill; | 1156 | if (unlikely(!cmd)) |
| 1118 | } | 1157 | return BLKPREP_DEFER; |
| 1119 | if (unlikely(sdev->sdev_state != SDEV_RUNNING)) { | 1158 | |
| 1120 | /* OK, we're not in a running state don't prep | 1159 | ret = scsi_init_io(cmd); |
| 1121 | * user commands */ | 1160 | if (unlikely(ret)) |
| 1122 | if (sdev->sdev_state == SDEV_DEL) { | 1161 | return ret; |
| 1123 | /* Device is fully deleted, no commands | 1162 | |
| 1124 | * at all allowed down */ | 1163 | /* |
| 1125 | sdev_printk(KERN_ERR, sdev, | 1164 | * Initialize the actual SCSI command for this request. |
| 1126 | "rejecting I/O to dead device\n"); | 1165 | */ |
| 1127 | goto kill; | 1166 | drv = *(struct scsi_driver **)req->rq_disk->private_data; |
| 1128 | } | 1167 | if (unlikely(!drv->init_command(cmd))) { |
| 1129 | /* OK, we only allow special commands (i.e. not | 1168 | scsi_release_buffers(cmd); |
| 1130 | * user initiated ones */ | 1169 | scsi_put_command(cmd); |
| 1131 | specials_only = sdev->sdev_state; | 1170 | return BLKPREP_KILL; |
| 1132 | } | 1171 | } |
| 1133 | 1172 | ||
| 1173 | return BLKPREP_OK; | ||
| 1174 | } | ||
| 1175 | |||
| 1176 | static int scsi_prep_fn(struct request_queue *q, struct request *req) | ||
| 1177 | { | ||
| 1178 | struct scsi_device *sdev = q->queuedata; | ||
| 1179 | int ret = BLKPREP_OK; | ||
| 1180 | |||
| 1134 | /* | 1181 | /* |
| 1135 | * Find the actual device driver associated with this command. | 1182 | * If the device is not in running state we will reject some |
| 1136 | * The SPECIAL requests are things like character device or | 1183 | * or all commands. |
| 1137 | * ioctls, which did not originate from ll_rw_blk. Note that | ||
| 1138 | * the special field is also used to indicate the cmd for | ||
| 1139 | * the remainder of a partially fulfilled request that can | ||
| 1140 | * come up when there is a medium error. We have to treat | ||
| 1141 | * these two cases differently. We differentiate by looking | ||
| 1142 | * at request->cmd, as this tells us the real story. | ||
| 1143 | */ | 1184 | */ |
| 1144 | if (blk_special_request(req) && req->special) | 1185 | if (unlikely(sdev->sdev_state != SDEV_RUNNING)) { |
| 1145 | cmd = req->special; | 1186 | switch (sdev->sdev_state) { |
| 1146 | else if (blk_pc_request(req) || blk_fs_request(req)) { | 1187 | case SDEV_OFFLINE: |
| 1147 | if (unlikely(specials_only) && !(req->cmd_flags & REQ_PREEMPT)){ | 1188 | /* |
| 1148 | if (specials_only == SDEV_QUIESCE || | 1189 | * If the device is offline we refuse to process any |
| 1149 | specials_only == SDEV_BLOCK) | 1190 | * commands. The device must be brought online |
| 1150 | goto defer; | 1191 | * before trying any recovery commands. |
| 1151 | 1192 | */ | |
| 1152 | sdev_printk(KERN_ERR, sdev, | 1193 | sdev_printk(KERN_ERR, sdev, |
| 1153 | "rejecting I/O to device being removed\n"); | 1194 | "rejecting I/O to offline device\n"); |
| 1154 | goto kill; | 1195 | ret = BLKPREP_KILL; |
| 1196 | break; | ||
| 1197 | case SDEV_DEL: | ||
| 1198 | /* | ||
| 1199 | * If the device is fully deleted, we refuse to | ||
| 1200 | * process any commands as well. | ||
| 1201 | */ | ||
| 1202 | sdev_printk(KERN_ERR, sdev, | ||
| 1203 | "rejecting I/O to dead device\n"); | ||
| 1204 | ret = BLKPREP_KILL; | ||
| 1205 | break; | ||
| 1206 | case SDEV_QUIESCE: | ||
| 1207 | case SDEV_BLOCK: | ||
| 1208 | /* | ||
| 1209 | * If the devices is blocked we defer normal commands. | ||
| 1210 | */ | ||
| 1211 | if (!(req->cmd_flags & REQ_PREEMPT)) | ||
| 1212 | ret = BLKPREP_DEFER; | ||
| 1213 | break; | ||
| 1214 | default: | ||
| 1215 | /* | ||
| 1216 | * For any other not fully online state we only allow | ||
| 1217 | * special commands. In particular any user initiated | ||
| 1218 | * command is not allowed. | ||
| 1219 | */ | ||
| 1220 | if (!(req->cmd_flags & REQ_PREEMPT)) | ||
| 1221 | ret = BLKPREP_KILL; | ||
| 1222 | break; | ||
| 1155 | } | 1223 | } |
| 1156 | 1224 | ||
| 1157 | /* | 1225 | if (ret != BLKPREP_OK) |
| 1158 | * Now try and find a command block that we can use. | 1226 | goto out; |
| 1159 | */ | ||
| 1160 | if (!req->special) { | ||
| 1161 | cmd = scsi_get_command(sdev, GFP_ATOMIC); | ||
| 1162 | if (unlikely(!cmd)) | ||
| 1163 | goto defer; | ||
| 1164 | } else | ||
| 1165 | cmd = req->special; | ||
| 1166 | |||
| 1167 | /* pull a tag out of the request if we have one */ | ||
| 1168 | cmd->tag = req->tag; | ||
| 1169 | } else { | ||
| 1170 | blk_dump_rq_flags(req, "SCSI bad req"); | ||
| 1171 | goto kill; | ||
| 1172 | } | 1227 | } |
| 1173 | |||
| 1174 | /* note the overloading of req->special. When the tag | ||
| 1175 | * is active it always means cmd. If the tag goes | ||
| 1176 | * back for re-queueing, it may be reset */ | ||
| 1177 | req->special = cmd; | ||
| 1178 | cmd->request = req; | ||
| 1179 | |||
| 1180 | /* | ||
| 1181 | * FIXME: drop the lock here because the functions below | ||
| 1182 | * expect to be called without the queue lock held. Also, | ||
| 1183 | * previously, we dequeued the request before dropping the | ||
| 1184 | * lock. We hope REQ_STARTED prevents anything untoward from | ||
| 1185 | * happening now. | ||
| 1186 | */ | ||
| 1187 | if (blk_fs_request(req) || blk_pc_request(req)) { | ||
| 1188 | int ret; | ||
| 1189 | 1228 | ||
| 1229 | switch (req->cmd_type) { | ||
| 1230 | case REQ_TYPE_BLOCK_PC: | ||
| 1231 | ret = scsi_setup_blk_pc_cmnd(sdev, req); | ||
| 1232 | break; | ||
| 1233 | case REQ_TYPE_FS: | ||
| 1234 | ret = scsi_setup_fs_cmnd(sdev, req); | ||
| 1235 | break; | ||
| 1236 | default: | ||
| 1190 | /* | 1237 | /* |
| 1191 | * This will do a couple of things: | 1238 | * All other command types are not supported. |
| 1192 | * 1) Fill in the actual SCSI command. | ||
| 1193 | * 2) Fill in any other upper-level specific fields | ||
| 1194 | * (timeout). | ||
| 1195 | * | 1239 | * |
| 1196 | * If this returns 0, it means that the request failed | 1240 | * Note that these days the SCSI subsystem does not use |
| 1197 | * (reading past end of disk, reading offline device, | 1241 | * REQ_TYPE_SPECIAL requests anymore. These are only used |
| 1198 | * etc). This won't actually talk to the device, but | 1242 | * (directly or via blk_insert_request) by non-SCSI drivers. |
| 1199 | * some kinds of consistency checking may cause the | ||
| 1200 | * request to be rejected immediately. | ||
| 1201 | */ | 1243 | */ |
| 1244 | blk_dump_rq_flags(req, "SCSI bad req"); | ||
| 1245 | ret = BLKPREP_KILL; | ||
| 1246 | break; | ||
| 1247 | } | ||
| 1202 | 1248 | ||
| 1203 | /* | 1249 | out: |
| 1204 | * This sets up the scatter-gather table (allocating if | 1250 | switch (ret) { |
| 1205 | * required). | 1251 | case BLKPREP_KILL: |
| 1206 | */ | 1252 | req->errors = DID_NO_CONNECT << 16; |
| 1207 | ret = scsi_init_io(cmd); | 1253 | break; |
| 1208 | switch(ret) { | 1254 | case BLKPREP_DEFER: |
| 1209 | /* For BLKPREP_KILL/DEFER the cmd was released */ | ||
| 1210 | case BLKPREP_KILL: | ||
| 1211 | goto kill; | ||
| 1212 | case BLKPREP_DEFER: | ||
| 1213 | goto defer; | ||
| 1214 | } | ||
| 1215 | |||
| 1216 | /* | 1255 | /* |
| 1217 | * Initialize the actual SCSI command for this request. | 1256 | * If we defer, the elv_next_request() returns NULL, but the |
| 1257 | * queue must be restarted, so we plug here if no returning | ||
| 1258 | * command will automatically do that. | ||
| 1218 | */ | 1259 | */ |
| 1219 | if (blk_pc_request(req)) { | 1260 | if (sdev->device_busy == 0) |
| 1220 | scsi_setup_blk_pc_cmnd(cmd); | 1261 | blk_plug_device(q); |
| 1221 | } else if (req->rq_disk) { | 1262 | break; |
| 1222 | struct scsi_driver *drv; | 1263 | default: |
| 1223 | 1264 | req->cmd_flags |= REQ_DONTPREP; | |
| 1224 | drv = *(struct scsi_driver **)req->rq_disk->private_data; | ||
| 1225 | if (unlikely(!drv->init_command(cmd))) { | ||
| 1226 | scsi_release_buffers(cmd); | ||
| 1227 | scsi_put_command(cmd); | ||
| 1228 | goto kill; | ||
| 1229 | } | ||
| 1230 | } | ||
| 1231 | } | 1265 | } |
| 1232 | 1266 | ||
| 1233 | /* | 1267 | return ret; |
| 1234 | * The request is now prepped, no need to come back here | ||
| 1235 | */ | ||
| 1236 | req->cmd_flags |= REQ_DONTPREP; | ||
| 1237 | return BLKPREP_OK; | ||
| 1238 | |||
| 1239 | defer: | ||
| 1240 | /* If we defer, the elv_next_request() returns NULL, but the | ||
| 1241 | * queue must be restarted, so we plug here if no returning | ||
| 1242 | * command will automatically do that. */ | ||
| 1243 | if (sdev->device_busy == 0) | ||
| 1244 | blk_plug_device(q); | ||
| 1245 | return BLKPREP_DEFER; | ||
| 1246 | kill: | ||
| 1247 | req->errors = DID_NO_CONNECT << 16; | ||
| 1248 | return BLKPREP_KILL; | ||
| 1249 | } | 1268 | } |
| 1250 | 1269 | ||
| 1251 | /* | 1270 | /* |
