Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
Pull SCSI updates from James Bottomley: "This is mostly update of the usual drivers: arcmsr, qla2xxx, lpfc, hisi_sas, target/iscsi and target/core. Additionally Christoph refactored gdth as part of the dma changes. The major mid-layer change this time is the removal of bidi commands and with them the whole of the osd/exofs driver and filesystem. This is a major simplification for block and mq in particular" * tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: (240 commits) scsi: cxgb4i: validate tcp sequence number only if chip version <= T5 scsi: cxgb4i: get pf number from lldi->pf scsi: core: replace GFP_ATOMIC with GFP_KERNEL in scsi_scan.c scsi: mpt3sas: Add missing breaks in switch statements scsi: aacraid: Fix missing break in switch statement scsi: kill command serial number scsi: csiostor: drop serial_number usage scsi: mvumi: use request tag instead of serial_number scsi: dpt_i2o: remove serial number usage scsi: st: osst: Remove negative constant left-shifts scsi: ufs-bsg: Allow reading descriptors scsi: ufs: Allow reading descriptor via raw upiu scsi: ufs-bsg: Change the calling convention for write descriptor scsi: ufs: Remove unused device quirks Revert "scsi: ufs: disable vccq if it's not needed by UFS device" scsi: megaraid_sas: Remove a bunch of set but not used variables scsi: clean obsolete return values of eh_timed_out scsi: sd: Optimal I/O size should be a multiple of physical block size scsi: MAINTAINERS: SCSI initiator and target tweaks scsi: fcoe: make use of fip_mode enum complete ...
此提交包含在:
@@ -316,7 +316,6 @@ EXPORT_SYMBOL(__scsi_execute);
|
||||
*/
|
||||
static void scsi_init_cmd_errh(struct scsi_cmnd *cmd)
|
||||
{
|
||||
cmd->serial_number = 0;
|
||||
scsi_set_resid(cmd, 0);
|
||||
memset(cmd->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
|
||||
if (cmd->cmd_len == 0)
|
||||
@@ -556,15 +555,8 @@ static void scsi_uninit_cmd(struct scsi_cmnd *cmd)
|
||||
|
||||
static void scsi_mq_free_sgtables(struct scsi_cmnd *cmd)
|
||||
{
|
||||
struct scsi_data_buffer *sdb;
|
||||
|
||||
if (cmd->sdb.table.nents)
|
||||
sg_free_table_chained(&cmd->sdb.table, true);
|
||||
if (cmd->request->next_rq) {
|
||||
sdb = cmd->request->next_rq->special;
|
||||
if (sdb)
|
||||
sg_free_table_chained(&sdb->table, true);
|
||||
}
|
||||
if (scsi_prot_sg_count(cmd))
|
||||
sg_free_table_chained(&cmd->prot_sdb->table, true);
|
||||
}
|
||||
@@ -578,7 +570,7 @@ static void scsi_mq_uninit_cmd(struct scsi_cmnd *cmd)
|
||||
|
||||
/* Returns false when no more bytes to process, true if there are more */
|
||||
static bool scsi_end_request(struct request *req, blk_status_t error,
|
||||
unsigned int bytes, unsigned int bidi_bytes)
|
||||
unsigned int bytes)
|
||||
{
|
||||
struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(req);
|
||||
struct scsi_device *sdev = cmd->device;
|
||||
@@ -587,11 +579,6 @@ static bool scsi_end_request(struct request *req, blk_status_t error,
|
||||
if (blk_update_request(req, error, bytes))
|
||||
return true;
|
||||
|
||||
/* Bidi request must be completed as a whole */
|
||||
if (unlikely(bidi_bytes) &&
|
||||
blk_update_request(req->next_rq, error, bidi_bytes))
|
||||
return true;
|
||||
|
||||
if (blk_queue_add_random(q))
|
||||
add_disk_randomness(req->rq_disk);
|
||||
|
||||
@@ -817,7 +804,7 @@ static void scsi_io_completion_action(struct scsi_cmnd *cmd, int result)
|
||||
scsi_print_command(cmd);
|
||||
}
|
||||
}
|
||||
if (!scsi_end_request(req, blk_stat, blk_rq_err_bytes(req), 0))
|
||||
if (!scsi_end_request(req, blk_stat, blk_rq_err_bytes(req)))
|
||||
return;
|
||||
/*FALLTHRU*/
|
||||
case ACTION_REPREP:
|
||||
@@ -951,30 +938,6 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
|
||||
* scsi_result_to_blk_status may have reset the host_byte
|
||||
*/
|
||||
scsi_req(req)->result = cmd->result;
|
||||
scsi_req(req)->resid_len = scsi_get_resid(cmd);
|
||||
|
||||
if (unlikely(scsi_bidi_cmnd(cmd))) {
|
||||
/*
|
||||
* Bidi commands Must be complete as a whole,
|
||||
* both sides at once.
|
||||
*/
|
||||
scsi_req(req->next_rq)->resid_len = scsi_in(cmd)->resid;
|
||||
if (scsi_end_request(req, BLK_STS_OK, blk_rq_bytes(req),
|
||||
blk_rq_bytes(req->next_rq)))
|
||||
WARN_ONCE(true,
|
||||
"Bidi command with remaining bytes");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* no bidi support yet, other than in pass-through */
|
||||
if (unlikely(blk_bidi_rq(req))) {
|
||||
WARN_ONCE(true, "Only support bidi command in passthrough");
|
||||
scmd_printk(KERN_ERR, cmd, "Killing bidi command\n");
|
||||
if (scsi_end_request(req, BLK_STS_IOERR, blk_rq_bytes(req),
|
||||
blk_rq_bytes(req->next_rq)))
|
||||
WARN_ONCE(true, "Bidi command with remaining bytes");
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -991,13 +954,13 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
|
||||
* 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, 0)))
|
||||
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), 0))
|
||||
if (scsi_end_request(req, blk_stat, blk_rq_bytes(req)))
|
||||
WARN_ONCE(true,
|
||||
"Bytes remaining after failed, no-retry command");
|
||||
return;
|
||||
@@ -1059,12 +1022,6 @@ blk_status_t scsi_init_io(struct scsi_cmnd *cmd)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (blk_bidi_rq(rq)) {
|
||||
ret = scsi_init_sgtable(rq->next_rq, rq->next_rq->special);
|
||||
if (ret)
|
||||
goto out_free_sgtables;
|
||||
}
|
||||
|
||||
if (blk_integrity_rq(rq)) {
|
||||
struct scsi_data_buffer *prot_sdb = cmd->prot_sdb;
|
||||
int ivecs, count;
|
||||
@@ -1608,10 +1565,7 @@ static blk_status_t scsi_mq_prep_fn(struct request *req)
|
||||
|
||||
scsi_init_command(sdev, cmd);
|
||||
|
||||
req->special = cmd;
|
||||
|
||||
cmd->request = req;
|
||||
|
||||
cmd->tag = req->tag;
|
||||
cmd->prot_op = SCSI_PROT_NORMAL;
|
||||
|
||||
@@ -1625,17 +1579,6 @@ static blk_status_t scsi_mq_prep_fn(struct request *req)
|
||||
(struct scatterlist *)(cmd->prot_sdb + 1);
|
||||
}
|
||||
|
||||
if (blk_bidi_rq(req)) {
|
||||
struct request *next_rq = req->next_rq;
|
||||
struct scsi_data_buffer *bidi_sdb = blk_mq_rq_to_pdu(next_rq);
|
||||
|
||||
memset(bidi_sdb, 0, sizeof(struct scsi_data_buffer));
|
||||
bidi_sdb->table.sgl =
|
||||
(struct scatterlist *)(bidi_sdb + 1);
|
||||
|
||||
next_rq->special = bidi_sdb;
|
||||
}
|
||||
|
||||
blk_mq_start_request(req);
|
||||
|
||||
return scsi_setup_cmnd(sdev, req);
|
||||
@@ -1713,13 +1656,13 @@ static blk_status_t scsi_queue_rq(struct blk_mq_hw_ctx *hctx,
|
||||
if (!scsi_host_queue_ready(q, shost, sdev))
|
||||
goto out_dec_target_busy;
|
||||
|
||||
clear_bit(SCMD_STATE_COMPLETE, &cmd->state);
|
||||
if (!(req->rq_flags & RQF_DONTPREP)) {
|
||||
ret = scsi_mq_prep_fn(req);
|
||||
if (ret != BLK_STS_OK)
|
||||
goto out_dec_host_busy;
|
||||
req->rq_flags |= RQF_DONTPREP;
|
||||
} else {
|
||||
clear_bit(SCMD_STATE_COMPLETE, &cmd->state);
|
||||
blk_mq_start_request(req);
|
||||
}
|
||||
|
||||
|
新增問題並參考
封鎖使用者