// SPDX-License-Identifier: GPL-2.0-only /* * Copyright (C) 1999 Eric Youngdale * Copyright (C) 2014 Christoph Hellwig * * SCSI queueing library. * Initial versions: Eric Youngdale (eric@andante.org). * Based upon conversations with large numbers * of people at Linux Expo.
*/
/* * Set the appropriate busy bit for the device/host. * * If the host/device isn't busy, assume that something actually * completed, and that we should be able to queue a command now. * * Note that the prior mid-layer assumption that any host could * always queue at least one command is now broken. The mid-layer * will implement a user specifiable stall (see * scsi_host.max_host_blocked and scsi_device.max_device_blocked) * if a command is requeued with no other commands outstanding * either for the device or for the host.
*/ switch (reason) { case SCSI_MLQUEUE_HOST_BUSY:
atomic_set(&host->host_blocked, host->max_host_blocked); break; case SCSI_MLQUEUE_DEVICE_BUSY: case SCSI_MLQUEUE_EH_RETRY:
atomic_set(&device->device_blocked,
device->max_device_blocked); break; case SCSI_MLQUEUE_TARGET_BUSY:
atomic_set(&starget->target_blocked,
starget->max_target_blocked); break;
}
}
blk_mq_requeue_request(rq, false); if (!scsi_host_in_recovery(cmd->device->host))
blk_mq_delay_kick_requeue_list(rq->q, msecs);
}
/** * __scsi_queue_insert - private queue insertion * @cmd: The SCSI command being requeued * @reason: The reason for the requeue * @unbusy: Whether the queue should be unbusied * * This is a private queue insertion. The public interface * scsi_queue_insert() always assumes the queue should be unbusied * because it's always called before the completion. This function is * for a requeue after completion, which should only occur in this * file.
*/ staticvoid __scsi_queue_insert(struct scsi_cmnd *cmd, int reason, bool unbusy)
{ struct scsi_device *device = cmd->device;
SCSI_LOG_MLQUEUE(1, scmd_printk(KERN_INFO, cmd, "Inserting command %p into mlqueue\n", cmd));
scsi_set_blocked(cmd, reason);
/* * Decrement the counters, since these commands are no longer * active on the host/device.
*/ if (unbusy)
scsi_device_unbusy(device, cmd);
/* * Requeue this command. It will go before all other commands * that are already in the queue. Schedule requeue work under * lock such that the kblockd_schedule_work() call happens * before blk_mq_destroy_queue() finishes.
*/
cmd->result = 0;
/** * scsi_queue_insert - Reinsert a command in the queue. * @cmd: command that we are adding to queue. * @reason: why we are inserting command to queue. * * We do this for one of two cases. Either the host is busy and it cannot accept * any more commands for the time being, or the device returned QUEUE_FULL and * can accept no more commands. * * Context: This could be called either from an interrupt context or a normal * process context.
*/ void scsi_queue_insert(struct scsi_cmnd *cmd, int reason)
{
__scsi_queue_insert(cmd, reason, true);
}
/** * scsi_failures_reset_retries - reset all failures to zero * @failures: &struct scsi_failures with specific failure modes set
*/ void scsi_failures_reset_retries(struct scsi_failures *failures)
{ struct scsi_failure *failure;
maybe_retry: if (failure->allowed) { if (failure->allowed == SCMD_FAILURE_NO_LIMIT ||
++failure->retries <= failure->allowed) return -EAGAIN;
} else { if (failures->total_allowed == SCMD_FAILURE_NO_LIMIT ||
++failures->total_retries <= failures->total_allowed) return -EAGAIN;
}
return 0;
}
/** * scsi_execute_cmd - insert request and wait for the result * @sdev: scsi_device * @cmd: scsi command * @opf: block layer request cmd_flags * @buffer: data buffer * @bufflen: len of buffer * @timeout: request timeout in HZ * @ml_retries: number of times SCSI midlayer will retry request * @args: Optional args. See struct definition for field descriptions * * Returns the scsi_cmnd result field if a command was executed, or a negative * Linux error code if we didn't get that far.
*/ int scsi_execute_cmd(struct scsi_device *sdev, constunsignedchar *cmd,
blk_opf_t opf, void *buffer, unsignedint bufflen, int timeout, int ml_retries, conststruct scsi_exec_args *args)
{ staticconststruct scsi_exec_args default_args; struct request *req; struct scsi_cmnd *scmd; int ret;
/* * head injection *required* here otherwise quiesce won't work
*/
blk_execute_rq(req, true);
if (scsi_check_passthrough(scmd, args->failures) == -EAGAIN) {
blk_mq_free_request(req); goto retry;
}
/* * Some devices (USB mass-storage in particular) may transfer * garbage data together with a residue indicating that the data * is invalid. Prevent the garbage from being misinterpreted * and prevent security leaks by zeroing out the excess data.
*/ if (unlikely(scmd->resid_len > 0 && scmd->resid_len <= bufflen))
memset(buffer + bufflen - scmd->resid_len, 0, scmd->resid_len);
if (args->resid)
*args->resid = scmd->resid_len; if (args->sense)
memcpy(args->sense, scmd->sense_buffer, SCSI_SENSE_BUFFERSIZE); if (args->sshdr)
scsi_normalize_sense(scmd->sense_buffer, scmd->sense_len,
args->sshdr);
ret = scmd->result;
out:
blk_mq_free_request(req);
return ret;
}
EXPORT_SYMBOL(scsi_execute_cmd);
/* * Wake up the error handler if necessary. Avoid as follows that the error * handler is not woken up if host in-flight requests number == * shost->host_failed: use call_rcu() in scsi_eh_scmd_add() in combination * with an RCU read lock in this function to ensure that this function in * its entirety either finishes before scsi_eh_scmd_add() increases the * host_failed counter or that it notices the shost state change made by * scsi_eh_scmd_add().
*/ staticvoid scsi_dec_host_busy(struct Scsi_Host *shost, struct scsi_cmnd *cmd)
{ unsignedlong flags;
rcu_read_lock();
__clear_bit(SCMD_STATE_INFLIGHT, &cmd->state); if (unlikely(scsi_host_in_recovery(shost))) { unsignedint busy = scsi_host_busy(shost);
/* * Kick the queue of SCSI device @sdev if @sdev != current_sdev. Called with * interrupts disabled.
*/ staticvoid scsi_kick_sdev_queue(struct scsi_device *sdev, void *data)
{ struct scsi_device *current_sdev = data;
if (sdev != current_sdev)
blk_mq_run_hw_queues(sdev->request_queue, true);
}
/* * Called for single_lun devices on IO completion. Clear starget_sdev_user, * and call blk_run_queue for all the scsi_devices on the target - * including current_sdev first. * * Called with *no* scsi locks held.
*/ staticvoid scsi_single_lun_run(struct scsi_device *current_sdev)
{ struct Scsi_Host *shost = current_sdev->host; struct scsi_target *starget = scsi_target(current_sdev); unsignedlong flags;
/* * Call blk_run_queue for all LUNs on the target, starting with * current_sdev. We race with others (to set starget_sdev_user), * but in most cases, we will be first. Ideally, each LU on the * target would get some limited time or requests on the target.
*/
blk_mq_run_hw_queues(current_sdev->request_queue,
shost->queuecommand_may_block);
spin_lock_irqsave(shost->host_lock, flags); if (!starget->starget_sdev_user)
__starget_for_each_device(starget, current_sdev,
scsi_kick_sdev_queue);
spin_unlock_irqrestore(shost->host_lock, flags);
}
staticinlinebool scsi_device_is_busy(struct scsi_device *sdev)
{ if (scsi_device_busy(sdev) >= sdev->queue_depth) returntrue; if (atomic_read(&sdev->device_blocked) > 0) returntrue; returnfalse;
}
staticinlinebool scsi_target_is_busy(struct scsi_target *starget)
{ if (starget->can_queue > 0) { if (atomic_read(&starget->target_busy) >= starget->can_queue) returntrue; if (atomic_read(&starget->target_blocked) > 0) returntrue;
} returnfalse;
}
staticinlinebool scsi_host_is_busy(struct Scsi_Host *shost)
{ if (atomic_read(&shost->host_blocked) > 0) returntrue; if (shost->host_self_blocked) returntrue; returnfalse;
}
while (!list_empty(&starved_list)) { struct request_queue *slq;
/* * As long as shost is accepting commands and we have * starved queues, call blk_run_queue. scsi_request_fn * drops the queue_lock and can add us back to the * starved_list. * * host_lock protects the starved_list and starved_entry. * scsi_request_fn must get the host_lock before checking * or modifying starved_list or starved_entry.
*/ if (scsi_host_is_busy(shost)) break;
/* * Once we drop the host lock, a racing scsi_remove_device() * call may remove the sdev from the starved list and destroy * it and the queue. Mitigate by taking a reference to the * queue and never touching the sdev again after we drop the * host lock. Note: if __scsi_remove_device() invokes * blk_mq_destroy_queue() before the queue is run from this * function then blk_run_queue() will return immediately since * blk_mq_destroy_queue() marks the queue with QUEUE_FLAG_DYING.
*/
slq = sdev->request_queue; if (!blk_get_queue(slq)) continue;
spin_unlock_irqrestore(shost->host_lock, flags);
spin_lock_irqsave(shost->host_lock, flags);
} /* put any unprocessed entries back */
list_splice(&starved_list, &shost->starved_list);
spin_unlock_irqrestore(shost->host_lock, flags);
}
/** * scsi_run_queue - Select a proper request queue to serve next. * @q: last request's queue * * The previous command was completely finished, start a new one if possible.
*/ staticvoid scsi_run_queue(struct request_queue *q)
{ struct scsi_device *sdev = q->queuedata;
if (scsi_target(sdev)->single_lun)
scsi_single_lun_run(sdev); if (!list_empty(&sdev->host->starved_list))
scsi_starved_list_run(sdev->host);
/* Note: blk_mq_kick_requeue_list() runs the queue asynchronously. */
blk_mq_kick_requeue_list(q);
}
staticvoid scsi_run_queue_async(struct scsi_device *sdev)
{ if (scsi_host_in_recovery(sdev->host)) return;
if (scsi_target(sdev)->single_lun ||
!list_empty(&sdev->host->starved_list)) {
kblockd_schedule_work(&sdev->requeue_work);
} else { /* * smp_mb() present in sbitmap_queue_clear() or implied in * .end_io is for ordering writing .device_busy in * scsi_device_unbusy() and reading sdev->restarts.
*/ int old = atomic_read(&sdev->restarts);
/* * ->restarts has to be kept as non-zero if new budget * contention occurs. * * No need to run queue when either another re-run * queue wins in updating ->restarts or a new budget * contention occurs.
*/ if (old && atomic_cmpxchg(&sdev->restarts, old, 0) == old)
blk_mq_run_hw_queues(sdev->request_queue, true);
}
}
/* Returns false when no more bytes to process, true if there are more */ staticbool scsi_end_request(struct request *req, blk_status_t error, unsignedint bytes)
{ struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(req); struct scsi_device *sdev = cmd->device; struct request_queue *q = sdev->request_queue;
if (blk_update_request(req, error, bytes)) returntrue;
if (q->limits.features & BLK_FEAT_ADD_RANDOM)
add_disk_randomness(req->q->disk);
/* * Calling rcu_barrier() is not necessary here because the * SCSI error handler guarantees that the function called by * call_rcu() has been called before scsi_end_request() is * called.
*/
destroy_rcu_head(&cmd->rcu);
/* * In the MQ case the command gets freed by __blk_mq_end_request, * so we have to do all cleanup that depends on it earlier. * * We also can't kick the queues from irq context, so we * will have to defer it to a workqueue.
*/
scsi_mq_uninit_cmd(cmd);
/* * queue is still alive, so grab the ref for preventing it * from being cleaned up during running queue.
*/
percpu_ref_get(&q->q_usage_counter);
/** * scsi_result_to_blk_status - translate a SCSI result code into blk_status_t * @result: scsi error code * * Translate a SCSI result code into a blk_status_t value.
*/ static blk_status_t scsi_result_to_blk_status(int result)
{ /* * Check the scsi-ml byte first in case we converted a host or status * byte.
*/ switch (scsi_ml_byte(result)) { case SCSIML_STAT_OK: break; case SCSIML_STAT_RESV_CONFLICT: return BLK_STS_RESV_CONFLICT; case SCSIML_STAT_NOSPC: return BLK_STS_NOSPC; case SCSIML_STAT_MED_ERROR: return BLK_STS_MEDIUM; case SCSIML_STAT_TGT_FAILURE: return BLK_STS_TARGET; case SCSIML_STAT_DL_TIMEOUT: return BLK_STS_DURATION_LIMIT;
}
switch (host_byte(result)) { case DID_OK: if (scsi_status_is_good(result)) return BLK_STS_OK; return BLK_STS_IOERR; case DID_TRANSPORT_FAILFAST: case DID_TRANSPORT_MARGINAL: return BLK_STS_TRANSPORT; default: return BLK_STS_IOERR;
}
}
/** * scsi_rq_err_bytes - determine number of bytes till the next failure boundary * @rq: request to examine * * Description: * A request could be merge of IOs which require different failure * handling. This function determines the number of bytes which * can be failed from the beginning of the request without * crossing into area which need to be retried further. * * Return: * The number of bytes to fail.
*/ staticunsignedint scsi_rq_err_bytes(conststruct request *rq)
{
blk_opf_t ff = rq->cmd_flags & REQ_FAILFAST_MASK; unsignedint bytes = 0; struct bio *bio;
if (!(rq->rq_flags & RQF_MIXED_MERGE)) return blk_rq_bytes(rq);
/* * Currently the only 'mixing' which can happen is between * different fastfail types. We can safely fail portions * which have all the failfast bits that the first one has - * the ones which are at least as eager to fail as the first * one.
*/ for (bio = rq->bio; bio; bio = bio->bi_next) { if ((bio->bi_opf & ff) != ff) break;
bytes += bio->bi_iter.bi_size;
}
/* this could lead to infinite loop */
BUG_ON(blk_rq_bytes(rq) && !bytes); return bytes;
}
/* * When ALUA transition state is returned, reprep the cmd to * use the ALUA handler's transition timeout. Delay the reprep * 1 sec to avoid aggressive retries of the target in that * state.
*/ #define ALUA_TRANSITION_REPREP_DELAY 1000
/* Helper for scsi_io_completion() when special action required. */ staticvoid scsi_io_completion_action(struct scsi_cmnd *cmd, int result)
{ struct request *req = scsi_cmd_to_rq(cmd); int level = 0; enum {ACTION_FAIL, ACTION_REPREP, ACTION_DELAYED_REPREP,
ACTION_RETRY, ACTION_DELAYED_RETRY} action; struct scsi_sense_hdr sshdr; bool sense_valid; bool sense_current = true; /* false implies "deferred sense" */
blk_status_t blk_stat;
sense_valid = scsi_command_normalize_sense(cmd, &sshdr); if (sense_valid)
sense_current = !scsi_sense_is_deferred(&sshdr);
blk_stat = scsi_result_to_blk_status(result);
if (host_byte(result) == DID_RESET) { /* Third party bus reset or reset for error recovery * reasons. Just retry the command and see what * happens.
*/
action = ACTION_RETRY;
} elseif (sense_valid && sense_current) { switch (sshdr.sense_key) { case UNIT_ATTENTION: if (cmd->device->removable) { /* Detected disc change. Set a bit * and quietly refuse further access.
*/
cmd->device->changed = 1;
action = ACTION_FAIL;
} else { /* Must have been a power glitch, or a * bus reset. Could not have been a * media change, so we just retry the * command and see what happens.
*/
action = ACTION_RETRY;
} break; case ILLEGAL_REQUEST: /* If we had an ILLEGAL REQUEST returned, then * we may have performed an unsupported * command. The only thing this should be * would be a ten byte read where only a six * byte read was supported. Also, on a system * where READ CAPACITY failed, we may have * read past the end of the disk.
*/ if ((cmd->device->use_10_for_rw &&
sshdr.asc == 0x20 && sshdr.ascq == 0x00) &&
(cmd->cmnd[0] == READ_10 ||
cmd->cmnd[0] == WRITE_10)) { /* This will issue a new 6-byte command. */
cmd->device->use_10_for_rw = 0;
action = ACTION_REPREP;
} elseif (sshdr.asc == 0x10) /* DIX */ {
action = ACTION_FAIL;
blk_stat = BLK_STS_PROTECTION; /* INVALID COMMAND OPCODE or INVALID FIELD IN CDB */
} elseif (sshdr.asc == 0x20 || sshdr.asc == 0x24) {
action = ACTION_FAIL;
blk_stat = BLK_STS_TARGET;
} else
action = ACTION_FAIL; break; case ABORTED_COMMAND:
action = ACTION_FAIL; if (sshdr.asc == 0x10) /* DIF */
blk_stat = BLK_STS_PROTECTION; break; case NOT_READY: /* If the device is in the process of becoming * ready, or has a temporary blockage, retry.
*/ if (sshdr.asc == 0x04) { switch (sshdr.ascq) { case 0x01: /* becoming ready */ case 0x04: /* format in progress */ case 0x05: /* rebuild in progress */ case 0x06: /* recalculation in progress */ case 0x07: /* operation in progress */ case 0x08: /* Long write in progress */ case 0x09: /* self test in progress */ case 0x11: /* notify (enable spinup) required */ case 0x14: /* space allocation in progress */ case 0x1a: /* start stop unit in progress */ case 0x1b: /* sanitize in progress */ case 0x1d: /* configuration in progress */
action = ACTION_DELAYED_RETRY; break; case 0x0a: /* ALUA state transition */
action = ACTION_DELAYED_REPREP; break; /* * Depopulation might take many hours, * thus it is not worthwhile to retry.
*/ case 0x24: /* depopulation in progress */ case 0x25: /* depopulation restore in progress */
fallthrough; default:
action = ACTION_FAIL; break;
}
} else
action = ACTION_FAIL; break; case VOLUME_OVERFLOW: /* See SSC3rXX or current. */
action = ACTION_FAIL; break; case DATA_PROTECT:
action = ACTION_FAIL; if ((sshdr.asc == 0x0C && sshdr.ascq == 0x12) ||
(sshdr.asc == 0x55 &&
(sshdr.ascq == 0x0E || sshdr.ascq == 0x0F))) { /* Insufficient zone resources */
blk_stat = BLK_STS_ZONE_OPEN_RESOURCE;
} break; case COMPLETED:
fallthrough; default:
action = ACTION_FAIL; break;
}
} else
action = ACTION_FAIL;
if (action != ACTION_FAIL && scsi_cmd_runtime_exceeced(cmd))
action = ACTION_FAIL;
switch (action) { case ACTION_FAIL: /* Give up and fail the remainder of the request */ if (!(req->rq_flags & RQF_QUIET)) { static DEFINE_RATELIMIT_STATE(_rs,
DEFAULT_RATELIMIT_INTERVAL,
DEFAULT_RATELIMIT_BURST);
if (unlikely(scsi_logging_level))
level =
SCSI_LOG_LEVEL(SCSI_LOG_MLCOMPLETE_SHIFT,
SCSI_LOG_MLCOMPLETE_BITS);
/* * if logging is enabled the failure will be printed * in scsi_log_completion(), so avoid duplicate messages
*/ if (!level && __ratelimit(&_rs)) {
scsi_print_result(cmd, NULL, FAILED); if (sense_valid)
scsi_print_sense(cmd);
scsi_print_command(cmd);
}
} if (!scsi_end_request(req, blk_stat, scsi_rq_err_bytes(req))) return;
fallthrough; case ACTION_REPREP:
scsi_mq_requeue_cmd(cmd, 0); break; case ACTION_DELAYED_REPREP:
scsi_mq_requeue_cmd(cmd, ALUA_TRANSITION_REPREP_DELAY); break; case ACTION_RETRY: /* Retry the same command immediately */
__scsi_queue_insert(cmd, SCSI_MLQUEUE_EH_RETRY, false); break; case ACTION_DELAYED_RETRY: /* Retry the same command after a delay */
__scsi_queue_insert(cmd, SCSI_MLQUEUE_DEVICE_BUSY, false); break;
}
}
/* * Helper for scsi_io_completion() when cmd->result is non-zero. Returns a * new result that may suppress further error checking. Also modifies * *blk_statp in some cases.
*/ staticint scsi_io_completion_nz_result(struct scsi_cmnd *cmd, int result,
blk_status_t *blk_statp)
{ bool sense_valid; bool sense_current = true; /* false implies "deferred sense" */ struct request *req = scsi_cmd_to_rq(cmd); struct scsi_sense_hdr sshdr;
sense_valid = scsi_command_normalize_sense(cmd, &sshdr); if (sense_valid)
sense_current = !scsi_sense_is_deferred(&sshdr);
if (blk_rq_is_passthrough(req)) { if (sense_valid) { /* * SG_IO wants current and deferred errors
*/
cmd->sense_len = min(8 + cmd->sense_buffer[7],
SCSI_SENSE_BUFFERSIZE);
} if (sense_current)
*blk_statp = scsi_result_to_blk_status(result);
} elseif (blk_rq_bytes(req) == 0 && sense_current) { /* * Flush commands do not transfers any data, and thus cannot use * good_bytes != blk_rq_bytes(req) as the signal for an error. * This sets *blk_statp explicitly for the problem case.
*/
*blk_statp = scsi_result_to_blk_status(result);
} /* * Recovered errors need reporting, but they're always treated as * success, so fiddle the result code here. For passthrough requests * we already took a copy of the original into sreq->result which * is what gets returned to the user
*/ if (sense_valid && (sshdr.sense_key == RECOVERED_ERROR)) { bool do_print = true; /* * if ATA PASS-THROUGH INFORMATION AVAILABLE [0x0, 0x1d] * skip print since caller wants ATA registers. Only occurs * on SCSI ATA PASS_THROUGH commands when CK_COND=1
*/ if ((sshdr.asc == 0x0) && (sshdr.ascq == 0x1d))
do_print = false; elseif (req->rq_flags & RQF_QUIET)
do_print = false; if (do_print)
scsi_print_sense(cmd);
result = 0; /* for passthrough, *blk_statp may be set */
*blk_statp = BLK_STS_OK;
} /* * Another corner case: the SCSI status byte is non-zero but 'good'. * Example: PRE-FETCH command returns SAM_STAT_CONDITION_MET when * it is able to fit nominated LBs in its cache (and SAM_STAT_GOOD * if it can't fit). Treat SAM_STAT_CONDITION_MET and the related * intermediate statuses (both obsolete in SAM-4) as good.
*/ if ((result & 0xff) && scsi_status_is_good(result)) {
result = 0;
*blk_statp = BLK_STS_OK;
} return result;
}
/** * scsi_io_completion - Completion processing for SCSI commands. * @cmd: command that is finished. * @good_bytes: number of processed bytes. * * We will finish off the specified number of sectors. If we are done, the * command block will be released and the queue function will be goosed. If we * are not done then we have to figure out what to do next: * * a) We can call scsi_mq_requeue_cmd(). The request will be * unprepared and put back on the queue. Then a new command will * be created for it. This should be used if we made forward * progress, or if we want to switch from READ(10) to READ(6) for * example. * * b) We can call scsi_io_completion_action(). The request will be * put back on the queue and retried using the same command as * before, possibly after a delay. * * c) We can call scsi_end_request() with blk_stat other than * BLK_STS_OK, to fail the remainder of the request.
*/ void scsi_io_completion(struct scsi_cmnd *cmd, unsignedint good_bytes)
{ int result = cmd->result; struct request *req = scsi_cmd_to_rq(cmd);
blk_status_t blk_stat = BLK_STS_OK;
if (unlikely(result)) /* a nz result may or may not be an error */
result = scsi_io_completion_nz_result(cmd, result, &blk_stat);
/* * Next deal with any sectors which we were able to correctly * handle.
*/
SCSI_LOG_HLCOMPLETE(1, scmd_printk(KERN_INFO, cmd, "%u sectors total, %d bytes done.\n",
blk_rq_sectors(req), good_bytes));
/* * Failed, zero length commands always need to drop down * to retry code. Fast path should return in this block.
*/ if (likely(blk_rq_bytes(req) > 0 || blk_stat == BLK_STS_OK)) { if (likely(!scsi_end_request(req, blk_stat, good_bytes))) return; /* no bytes remaining */
}
/* Kill remainder if no retries. */ if (unlikely(blk_stat && scsi_noretry_cmd(cmd))) { if (scsi_end_request(req, blk_stat, blk_rq_bytes(req)))
WARN_ONCE(true, "Bytes remaining after failed, no-retry command"); return;
}
/* * If there had been no error, but we have leftover bytes in the * request just queue the command up again.
*/ if (likely(result == 0))
scsi_mq_requeue_cmd(cmd, 0); else
scsi_io_completion_action(cmd, result);
}
/** * scsi_alloc_sgtables - Allocate and initialize data and integrity scatterlists * @cmd: SCSI command data structure to initialize. * * Initializes @cmd->sdb and also @cmd->prot_sdb if data integrity is enabled * for @cmd. * * Returns: * * BLK_STS_OK - on success * * BLK_STS_RESOURCE - if the failure is retryable * * BLK_STS_IOERR - if the failure is fatal
*/
blk_status_t scsi_alloc_sgtables(struct scsi_cmnd *cmd)
{ struct scsi_device *sdev = cmd->device; struct request *rq = scsi_cmd_to_rq(cmd); unsignedshort nr_segs = blk_rq_nr_phys_segments(rq); struct scatterlist *last_sg = NULL;
blk_status_t ret; bool need_drain = scsi_cmd_needs_dma_drain(sdev, rq); int count;
if (WARN_ON_ONCE(!nr_segs)) return BLK_STS_IOERR;
/* * Make sure there is space for the drain. The driver must adjust * max_hw_segments to be prepared for this.
*/ if (need_drain)
nr_segs++;
/* * If sg table allocation fails, requeue request later.
*/ if (unlikely(sg_alloc_table_chained(&cmd->sdb.table, nr_segs,
cmd->sdb.table.sgl, SCSI_INLINE_SG_CNT))) return BLK_STS_RESOURCE;
/* * Next, walk the list, and fill in the addresses and sizes of * each segment.
*/
count = __blk_rq_map_sg(rq, cmd->sdb.table.sgl, &last_sg);
if (blk_integrity_rq(rq)) { struct scsi_data_buffer *prot_sdb = cmd->prot_sdb;
if (WARN_ON_ONCE(!prot_sdb)) { /* * This can happen if someone (e.g. multipath) * queues a command to a device on an adapter * that does not support DIX.
*/
ret = BLK_STS_IOERR; goto out_free_sgtables;
}
if (sg_alloc_table_chained(&prot_sdb->table,
rq->nr_integrity_segments,
prot_sdb->table.sgl,
SCSI_INLINE_PROT_SG_CNT)) {
ret = BLK_STS_RESOURCE; goto out_free_sgtables;
}
/** * scsi_initialize_rq - initialize struct scsi_cmnd partially * @rq: Request associated with the SCSI command to be initialized. * * This function initializes the members of struct scsi_cmnd that must be * initialized before request processing starts and that won't be * reinitialized if a SCSI command is requeued.
*/ staticvoid scsi_initialize_rq(struct request *rq)
{ struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(rq);
/* * Only called when the request isn't completed by SCSI, and not freed by * SCSI
*/ staticvoid scsi_cleanup_rq(struct request *rq)
{ struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(rq);
/* Called before a request is prepared. See also scsi_mq_prep_fn(). */ void scsi_init_command(struct scsi_device *dev, struct scsi_cmnd *cmd)
{ struct request *rq = scsi_cmd_to_rq(cmd);
/* * Passthrough requests may transfer data, in which case they must * a bio attached to them. Or they might contain a SCSI command * that does not transfer data, in which case they may optionally * submit a request without an attached bio.
*/ if (req->bio) {
blk_status_t ret = scsi_alloc_sgtables(cmd); if (unlikely(ret != BLK_STS_OK)) return ret;
} else {
BUG_ON(blk_rq_bytes(req));
static blk_status_t
scsi_device_state_check(struct scsi_device *sdev, struct request *req)
{ switch (sdev->sdev_state) { case SDEV_CREATED: return BLK_STS_OK; case SDEV_OFFLINE: case SDEV_TRANSPORT_OFFLINE: /* * If the device is offline we refuse to process any * commands. The device must be brought online * before trying any recovery commands.
*/ if (!sdev->offline_already) {
sdev->offline_already = true;
sdev_printk(KERN_ERR, sdev, "rejecting I/O to offline device\n");
} return BLK_STS_IOERR; case SDEV_DEL: /* * If the device is fully deleted, we refuse to * process any commands as well.
*/
sdev_printk(KERN_ERR, sdev, "rejecting I/O to dead device\n"); return BLK_STS_IOERR; case SDEV_BLOCK: case SDEV_CREATED_BLOCK: return BLK_STS_RESOURCE; case SDEV_QUIESCE: /* * If the device is blocked we only accept power management * commands.
*/ if (req && WARN_ON_ONCE(!(req->rq_flags & RQF_PM))) return BLK_STS_RESOURCE; return BLK_STS_OK; default: /* * For any other not fully online state we only allow * power management commands.
*/ if (req && !(req->rq_flags & RQF_PM)) return BLK_STS_OFFLINE; return BLK_STS_OK;
}
}
/* * scsi_dev_queue_ready: if we can send requests to sdev, assign one token * and return the token else return -1.
*/ staticinlineint scsi_dev_queue_ready(struct request_queue *q, struct scsi_device *sdev)
{ int token;
token = sbitmap_get(&sdev->budget_map); if (token < 0) return -1;
if (!atomic_read(&sdev->device_blocked)) return token;
/* * Only unblock if no other commands are pending and * if device_blocked has decreased to zero
*/ if (scsi_device_busy(sdev) > 1 ||
atomic_dec_return(&sdev->device_blocked) > 0) {
sbitmap_put(&sdev->budget_map, token); return -1;
}
SCSI_LOG_MLQUEUE(3, sdev_printk(KERN_INFO, sdev, "unblocking device at zero depth\n"));
return token;
}
/* * scsi_target_queue_ready: checks if there we can send commands to target * @sdev: scsi device on starget to check.
*/ staticinlineint scsi_target_queue_ready(struct Scsi_Host *shost, struct scsi_device *sdev)
{ struct scsi_target *starget = scsi_target(sdev); unsignedint busy;
if (starget->single_lun) {
spin_lock_irq(shost->host_lock); if (starget->starget_sdev_user &&
starget->starget_sdev_user != sdev) {
spin_unlock_irq(shost->host_lock); return 0;
}
starget->starget_sdev_user = sdev;
spin_unlock_irq(shost->host_lock);
}
if (starget->can_queue <= 0) return 1;
busy = atomic_inc_return(&starget->target_busy) - 1; if (atomic_read(&starget->target_blocked) > 0) { if (busy) goto starved;
/* * unblock after target_blocked iterates to zero
*/ if (atomic_dec_return(&starget->target_blocked) > 0) goto out_dec;
SCSI_LOG_MLQUEUE(3, starget_printk(KERN_INFO, starget, "unblocking target at zero depth\n"));
}
/* * scsi_host_queue_ready: if we can send requests to shost, return 1 else * return 0. We must end up running the queue again whenever 0 is * returned, else IO can hang.
*/ staticinlineint scsi_host_queue_ready(struct request_queue *q, struct Scsi_Host *shost, struct scsi_device *sdev, struct scsi_cmnd *cmd)
{ if (atomic_read(&shost->host_blocked) > 0) { if (scsi_host_busy(shost) > 0) goto starved;
/* * unblock after host_blocked iterates to zero
*/ if (atomic_dec_return(&shost->host_blocked) > 0) goto out_dec;
SCSI_LOG_MLQUEUE(3,
shost_printk(KERN_INFO, shost, "unblocking host at zero depth\n"));
}
if (shost->host_self_blocked) goto starved;
/* We're OK to process the command, so we can't be starved */ if (!list_empty(&sdev->starved_entry)) {
spin_lock_irq(shost->host_lock); if (!list_empty(&sdev->starved_entry))
list_del_init(&sdev->starved_entry);
spin_unlock_irq(shost->host_lock);
}
/* * Busy state exporting function for request stacking drivers. * * For efficiency, no lock is taken to check the busy state of * shost/starget/sdev, since the returned value is not guaranteed and * may be changed after request stacking drivers call the function, * regardless of taking lock or not. * * When scsi can't dispatch I/Os anymore and needs to kill I/Os scsi * needs to return 'not busy'. Otherwise, request stacking drivers * may hold requests forever.
*/ staticbool scsi_mq_lld_busy(struct request_queue *q)
{ struct scsi_device *sdev = q->queuedata; struct Scsi_Host *shost;
if (blk_queue_dying(q)) returnfalse;
shost = sdev->host;
/* * Ignore host/starget busy state. * Since block layer does not have a concept of fairness across * multiple queues, congestion of host/starget needs to be handled * in SCSI layer.
*/ if (scsi_host_in_recovery(shost) || scsi_device_is_busy(sdev)) returntrue;
returnfalse;
}
/* * Block layer request completion callback. May be called from interrupt * context.
*/ staticvoid scsi_complete(struct request *rq)
{ struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(rq); enum scsi_disposition disposition;
INIT_LIST_HEAD(&cmd->eh_entry);
atomic_inc(&cmd->device->iodone_cnt); if (cmd->result)
atomic_inc(&cmd->device->ioerr_cnt);
switch (disposition) { case SUCCESS:
scsi_finish_command(cmd); break; case NEEDS_RETRY:
scsi_queue_insert(cmd, SCSI_MLQUEUE_EH_RETRY); break; case ADD_TO_MLQUEUE:
scsi_queue_insert(cmd, SCSI_MLQUEUE_DEVICE_BUSY); break; default:
scsi_eh_scmd_add(cmd); break;
}
}
/** * scsi_dispatch_cmd - Dispatch a command to the low-level driver. * @cmd: command block we are dispatching. * * Return: nonzero return request was rejected and device's queue needs to be * plugged.
*/ staticint scsi_dispatch_cmd(struct scsi_cmnd *cmd)
{ struct Scsi_Host *host = cmd->device->host; int rtn = 0;
atomic_inc(&cmd->device->iorequest_cnt);
/* check if the device is still usable */ if (unlikely(cmd->device->sdev_state == SDEV_DEL)) { /* in SDEV_DEL we error all commands. DID_NO_CONNECT * returns an immediate error upwards, and signals
* that the device is no longer present */
cmd->result = DID_NO_CONNECT << 16; goto done;
}
/* Check to see if the scsi lld made this device blocked. */ if (unlikely(scsi_device_blocked(cmd->device))) { /* * in blocked state, the command is just put back on * the device queue. The suspend state has already * blocked the queue so future requests should not * occur until the device transitions out of the * suspend state.
*/
SCSI_LOG_MLQUEUE(3, scmd_printk(KERN_INFO, cmd, "queuecommand : device blocked\n"));
atomic_dec(&cmd->device->iorequest_cnt); return SCSI_MLQUEUE_DEVICE_BUSY;
}
/* Store the LUN value in cmnd, if needed. */ if (cmd->device->lun_in_cdb)
cmd->cmnd[1] = (cmd->cmnd[1] & 0x1f) |
(cmd->device->lun << 5 & 0xe0);
scsi_log_send(cmd);
/* * Before we queue this command, check if the command * length exceeds what the host adapter can handle.
*/ if (cmd->cmd_len > cmd->device->host->max_cmd_len) {
SCSI_LOG_MLQUEUE(3, scmd_printk(KERN_INFO, cmd, "queuecommand : command too long. " "cdb_size=%d host->max_cmd_len=%d\n",
cmd->cmd_len, cmd->device->host->max_cmd_len));
cmd->result = (DID_ABORT << 16); goto done;
}
/* * Special handling for passthrough commands, which don't go to the ULP * at all:
*/ if (blk_rq_is_passthrough(req)) return scsi_setup_scsi_cmnd(sdev, req);
if (sdev->handler && sdev->handler->prep_fn) {
blk_status_t ret = sdev->handler->prep_fn(sdev, req);
if (ret != BLK_STS_OK) return ret;
}
/* Usually overridden by the ULP */
cmd->allowed = 0;
memset(cmd->cmnd, 0, sizeof(cmd->cmnd)); return scsi_cmd_to_driver(cmd)->init_command(cmd);
}
switch (cmd->submitter) { case SUBMITTED_BY_BLOCK_LAYER: break; case SUBMITTED_BY_SCSI_ERROR_HANDLER: return scsi_eh_done(cmd); case SUBMITTED_BY_SCSI_RESET_IOCTL: return;
}
if (unlikely(blk_should_fake_timeout(scsi_cmd_to_rq(cmd)->q))) return; if (unlikely(test_and_set_bit(SCMD_STATE_COMPLETE, &cmd->state))) return;
trace_scsi_dispatch_cmd_done(cmd);
if (complete_directly)
blk_mq_complete_request_direct(req, scsi_complete); else
blk_mq_complete_request(req);
}
/* * When to reinvoke queueing after a resource shortage. It's 3 msecs to * not change behaviour from the previous unplug mechanism, experimentation * may prove this needs changing.
*/ #define SCSI_QUEUE_DELAY 3
/* * Orders atomic_inc(&sdev->restarts) and atomic_read(&sdev->device_busy). * .restarts must be incremented before .device_busy is read because the * code in scsi_run_queue_async() depends on the order of these operations.
*/
smp_mb__after_atomic();
/* * If all in-flight requests originated from this LUN are completed * before reading .device_busy, sdev->device_busy will be observed as * zero, then blk_mq_delay_run_hw_queues() will dispatch this request * soon. Otherwise, completion of one of these requests will observe * the .restarts flag, and the request queue will be run for handling * this request, see scsi_end_request().
*/ if (unlikely(scsi_device_busy(sdev) == 0 &&
!scsi_device_blocked(sdev)))
blk_mq_delay_run_hw_queues(sdev->request_queue, SCSI_QUEUE_DELAY); return -1;
}
/* * If the device is not in running state we will reject some or all * commands.
*/ if (unlikely(sdev->sdev_state != SDEV_RUNNING)) {
ret = scsi_device_state_check(sdev, req); if (ret != BLK_STS_OK) goto out_put_budget;
}
ret = BLK_STS_RESOURCE; if (!scsi_target_queue_ready(shost, sdev)) goto out_put_budget; if (unlikely(scsi_host_in_recovery(shost))) { if (cmd->flags & SCMD_FAIL_IF_RECOVERING)
ret = BLK_STS_OFFLINE; goto out_dec_target_busy;
} if (!scsi_host_queue_ready(q, shost, sdev, cmd)) goto out_dec_target_busy;
/* * Only clear the driver-private command data if the LLD does not supply * a function to initialize that data.
*/ if (shost->hostt->cmd_size && !shost->hostt->init_cmd_priv)
memset(scsi_cmd_priv(cmd), 0, shost->hostt->cmd_size);
if (!(req->rq_flags & RQF_DONTPREP)) {
ret = scsi_prepare_cmd(req); if (ret != BLK_STS_OK) goto out_dec_host_busy;
req->rq_flags |= RQF_DONTPREP;
} else {
clear_bit(SCMD_STATE_COMPLETE, &cmd->state);
}
cmd->flags &= SCMD_PRESERVED_FLAGS; if (sdev->simple_tags)
cmd->flags |= SCMD_TAGGED; if (bd->last)
cmd->flags |= SCMD_LAST;
blk_mq_start_request(req);
reason = scsi_dispatch_cmd(cmd); if (reason) {
scsi_set_blocked(cmd, reason);
ret = BLK_STS_RESOURCE; goto out_dec_host_busy;
}
return BLK_STS_OK;
out_dec_host_busy:
scsi_dec_host_busy(shost, cmd);
out_dec_target_busy: if (scsi_target(sdev)->can_queue > 0)
atomic_dec(&scsi_target(sdev)->target_busy);
out_put_budget:
scsi_mq_put_budget(q, cmd->budget_token);
cmd->budget_token = -1; switch (ret) { case BLK_STS_OK: break; case BLK_STS_RESOURCE: if (scsi_device_blocked(sdev))
ret = BLK_STS_DEV_RESOURCE; break; case BLK_STS_AGAIN:
cmd->result = DID_BUS_BUSY << 16; if (req->rq_flags & RQF_DONTPREP)
scsi_mq_uninit_cmd(cmd); break; default: if (unlikely(!scsi_device_online(sdev)))
cmd->result = DID_NO_CONNECT << 16; else
cmd->result = DID_ERROR << 16; /* * Make sure to release all allocated resources when * we hit an error, as we will never see this command * again.
*/ if (req->rq_flags & RQF_DONTPREP)
scsi_mq_uninit_cmd(cmd);
scsi_run_queue_async(sdev); break;
} return ret;
}
/* * Propagate the DMA formation properties to the dma-mapping layer as * a courtesy service to the LLDDs. This needs to check that the buses * actually support the DMA API first, though.
*/ if (dev->dma_parms) {
dma_set_seg_boundary(dev, shost->dma_boundary);
dma_set_max_seg_size(dev, shost->max_segment_size);
}
}
EXPORT_SYMBOL_GPL(scsi_init_limits);
/** * scsi_device_from_queue - return sdev associated with a request_queue * @q: The request queue to return the sdev from * * Return the sdev associated with a request queue or NULL if the * request_queue does not reference a SCSI device.
*/ struct scsi_device *scsi_device_from_queue(struct request_queue *q)
{ struct scsi_device *sdev = NULL;
if (q->mq_ops == &scsi_mq_ops_no_commit ||
q->mq_ops == &scsi_mq_ops)
sdev = q->queuedata; if (!sdev || !get_device(&sdev->sdev_gendev))
sdev = NULL;
return sdev;
} /* * pktcdvd should have been integrated into the SCSI layers, but for historical * reasons like the old IDE driver it isn't. This export allows it to safely * probe if a given device is a SCSI one and only attach to that.
*/ #ifdef CONFIG_CDROM_PKTCDVD_MODULE
EXPORT_SYMBOL_GPL(scsi_device_from_queue); #endif
/** * scsi_block_requests - Utility function used by low-level drivers to prevent * further commands from being queued to the device. * @shost: host in question * * There is no timer nor any other means by which the requests get unblocked * other than the low-level driver calling scsi_unblock_requests().
*/ void scsi_block_requests(struct Scsi_Host *shost)
{
shost->host_self_blocked = 1;
}
EXPORT_SYMBOL(scsi_block_requests);
/** * scsi_unblock_requests - Utility function used by low-level drivers to allow * further commands to be queued to the device. * @shost: host in question * * There is no timer nor any other means by which the requests get unblocked * other than the low-level driver calling scsi_unblock_requests(). This is done * as an API function so that changes to the internals of the scsi mid-layer * won't require wholesale changes to drivers that use this feature.
*/ void scsi_unblock_requests(struct Scsi_Host *shost)
{
shost->host_self_blocked = 0;
scsi_run_host_queues(shost);
}
EXPORT_SYMBOL(scsi_unblock_requests);
/** * scsi_mode_select - issue a mode select * @sdev: SCSI device to be queried * @pf: Page format bit (1 == standard, 0 == vendor specific) * @sp: Save page bit (0 == don't save, 1 == save) * @buffer: request buffer (may not be smaller than eight bytes) * @len: length of request buffer. * @timeout: command timeout * @retries: number of retries before failing * @data: returns a structure abstracting the mode header data * @sshdr: place to put sense data (or NULL if no sense to be collected). * must be SCSI_SENSE_BUFFERSIZE big. * * Returns zero if successful; negative error number or scsi * status on error *
*/ int scsi_mode_select(struct scsi_device *sdev, int pf, int sp, unsignedchar *buffer, int len, int timeout, int retries, struct scsi_mode_data *data, struct scsi_sense_hdr *sshdr)
{ unsignedchar cmd[10]; unsignedchar *real_buffer; conststruct scsi_exec_args exec_args = {
.sshdr = sshdr,
}; int ret;
/* * Use MODE SELECT(10) if the device asked for it or if the mode page * and the mode select header cannot fit within the maximumm 255 bytes * of the MODE SELECT(6) command.
*/ if (sdev->use_10_for_ms ||
len + 4 > 255 ||
data->block_descriptor_length > 255) { if (len > 65535 - 8) return -EINVAL;
real_buffer = kmalloc(8 + len, GFP_KERNEL); if (!real_buffer) return -ENOMEM;
memcpy(real_buffer + 8, buffer, len);
len += 8;
real_buffer[0] = 0;
real_buffer[1] = 0;
real_buffer[2] = data->medium_type;
real_buffer[3] = data->device_specific;
real_buffer[4] = data->longlba ? 0x01 : 0;
real_buffer[5] = 0;
put_unaligned_be16(data->block_descriptor_length,
&real_buffer[6]);
/** * scsi_mode_sense - issue a mode sense, falling back from 10 to six bytes if necessary. * @sdev: SCSI device to be queried * @dbd: set to prevent mode sense from returning block descriptors * @modepage: mode page being requested * @subpage: sub-page of the mode page being requested * @buffer: request buffer (may not be smaller than eight bytes) * @len: length of request buffer. * @timeout: command timeout * @retries: number of retries before failing * @data: returns a structure abstracting the mode header data * @sshdr: place to put sense data (or NULL if no sense to be collected). * must be SCSI_SENSE_BUFFERSIZE big. * * Returns zero if successful, or a negative error number on failure
*/ int
scsi_mode_sense(struct scsi_device *sdev, int dbd, int modepage, int subpage, unsignedchar *buffer, int len, int timeout, int retries, struct scsi_mode_data *data, struct scsi_sense_hdr *sshdr)
{ unsignedchar cmd[12]; int use_10_for_ms; int header_length; int result; struct scsi_sense_hdr my_sshdr; struct scsi_failure failure_defs[] = {
{
.sense = UNIT_ATTENTION,
.asc = SCMD_FAILURE_ASC_ANY,
.ascq = SCMD_FAILURE_ASCQ_ANY,
.allowed = retries,
.result = SAM_STAT_CHECK_CONDITION,
},
{}
}; struct scsi_failures failures = {
.failure_definitions = failure_defs,
}; conststruct scsi_exec_args exec_args = { /* caller might not be interested in sense, but we need it */
.sshdr = sshdr ? : &my_sshdr,
.failures = &failures,
};
result = scsi_execute_cmd(sdev, cmd, REQ_OP_DRV_IN, buffer, len,
timeout, retries, &exec_args); if (result < 0) return result;
/* This code looks awful: what it's doing is making sure an * ILLEGAL REQUEST sense return identifies the actual command * byte as the problem. MODE_SENSE commands can return
* ILLEGAL REQUEST if the code page isn't supported */
if (!scsi_status_is_good(result)) { if (scsi_sense_valid(sshdr)) { if ((sshdr->sense_key == ILLEGAL_REQUEST) &&
(sshdr->asc == 0x20) && (sshdr->ascq == 0)) { /* * Invalid command operation code: retry using * MODE SENSE(6) if this was a MODE SENSE(10) * request, except if the request mode page is * too large for MODE SENSE single byte * allocation length field.
*/
--> --------------------
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.