mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
for-4.21/block-20181221
-----BEGIN PGP SIGNATURE-----
iQJEBAABCAAuFiEEwPw5LcreJtl1+l5K99NY+ylx4KYFAlwb7R8QHGF4Ym9lQGtl
cm5lbC5kawAKCRD301j7KXHgpjiID/97oDjMhNT7rwpuMbHw855h62j1hEN/m+N3
FI0uxivYoYZLD+eJRnMcBwHlKjrCX8iJQAcv9ffI3ThtFW7dnZT3atUacaZVR/Dt
IrxdymdBP3qsmuaId5NYBug7rJ+AiqFJKjEvCcSPu5X397J4I3SEbzhfvYLJ/aZX
16o0HJlVVIrcbmq1IP4HwiIIOaKXvPaw04L4z4fpeynRSWG7EAi8NLSnhlR4Rxbb
BTiMkCTsjRCFdyO6da4fvNQKWmPGPa3bJkYy3qR99cvJCeIbQjRyCloQlWNJRRgi
3eJpCHVxqFmN0/+DNTJVQEEr4H8o0AVucrLVct1Jc4pessenkpoUniP8vELqwlng
Z2VHLkhTfCEmvFlk82grrYdNvGATRsrbswt/PlP4T7rBfr1IpDk8kXDWF59EL2dy
ly35Sk3wJGHBl8qa+vEPXOAnaWdqJXuVGpwB4ifOIatOls8mOxwfZjiRc7x05/fC
1O4rR2IfLwRqwoYHs0AJ+h6ohOSn1mkGezl2Tch1VSFcJUOHmuYvraTaUi6hblpA
SslaAoEhO39hRBL0HsvsMeqVWM9uzqvFkLDCfNPdiA81H1258CIbo4vF8z6czCIS
eeXnTJxVhPVbZgb3a1a93SPwM6KIDZFoIijyd+NqjpU94thlnhYD0QEcKJIKH7os
2p4aHs6ktw==
=TRdW
-----END PGP SIGNATURE-----
Merge tag 'for-4.21/block-20181221' of git://git.kernel.dk/linux-block
Pull block updates from Jens Axboe:
"This is the main pull request for block/storage for 4.21.
Larger than usual, it was a busy round with lots of goodies queued up.
Most notable is the removal of the old IO stack, which has been a long
time coming. No new features for a while, everything coming in this
week has all been fixes for things that were previously merged.
This contains:
- Use atomic counters instead of semaphores for mtip32xx (Arnd)
- Cleanup of the mtip32xx request setup (Christoph)
- Fix for circular locking dependency in loop (Jan, Tetsuo)
- bcache (Coly, Guoju, Shenghui)
* Optimizations for writeback caching
* Various fixes and improvements
- nvme (Chaitanya, Christoph, Sagi, Jay, me, Keith)
* host and target support for NVMe over TCP
* Error log page support
* Support for separate read/write/poll queues
* Much improved polling
* discard OOM fallback
* Tracepoint improvements
- lightnvm (Hans, Hua, Igor, Matias, Javier)
* Igor added packed metadata to pblk. Now drives without metadata
per LBA can be used as well.
* Fix from Geert on uninitialized value on chunk metadata reads.
* Fixes from Hans and Javier to pblk recovery and write path.
* Fix from Hua Su to fix a race condition in the pblk recovery
code.
* Scan optimization added to pblk recovery from Zhoujie.
* Small geometry cleanup from me.
- Conversion of the last few drivers that used the legacy path to
blk-mq (me)
- Removal of legacy IO path in SCSI (me, Christoph)
- Removal of legacy IO stack and schedulers (me)
- Support for much better polling, now without interrupts at all.
blk-mq adds support for multiple queue maps, which enables us to
have a map per type. This in turn enables nvme to have separate
completion queues for polling, which can then be interrupt-less.
Also means we're ready for async polled IO, which is hopefully
coming in the next release.
- Killing of (now) unused block exports (Christoph)
- Unification of the blk-rq-qos and blk-wbt wait handling (Josef)
- Support for zoned testing with null_blk (Masato)
- sx8 conversion to per-host tag sets (Christoph)
- IO priority improvements (Damien)
- mq-deadline zoned fix (Damien)
- Ref count blkcg series (Dennis)
- Lots of blk-mq improvements and speedups (me)
- sbitmap scalability improvements (me)
- Make core inflight IO accounting per-cpu (Mikulas)
- Export timeout setting in sysfs (Weiping)
- Cleanup the direct issue path (Jianchao)
- Export blk-wbt internals in block debugfs for easier debugging
(Ming)
- Lots of other fixes and improvements"
* tag 'for-4.21/block-20181221' of git://git.kernel.dk/linux-block: (364 commits)
kyber: use sbitmap add_wait_queue/list_del wait helpers
sbitmap: add helpers for add/del wait queue handling
block: save irq state in blkg_lookup_create()
dm: don't reuse bio for flushes
nvme-pci: trace SQ status on completions
nvme-rdma: implement polling queue map
nvme-fabrics: allow user to pass in nr_poll_queues
nvme-fabrics: allow nvmf_connect_io_queue to poll
nvme-core: optionally poll sync commands
block: make request_to_qc_t public
nvme-tcp: fix spelling mistake "attepmpt" -> "attempt"
nvme-tcp: fix endianess annotations
nvmet-tcp: fix endianess annotations
nvme-pci: refactor nvme_poll_irqdisable to make sparse happy
nvme-pci: only set nr_maps to 2 if poll queues are supported
nvmet: use a macro for default error location
nvmet: fix comparison of a u16 with -1
blk-mq: enable IO poll if .nr_queues of type poll > 0
blk-mq: change blk_mq_queue_busy() to blk_mq_queue_inflight()
blk-mq: skip zero-queue maps in blk_mq_map_swqueue
...
This commit is contained in:
commit
0e9da3fbf7
246 changed files with 10545 additions and 14446 deletions
|
|
@ -50,18 +50,6 @@ config SCSI_NETLINK
|
|||
default n
|
||||
depends on NET
|
||||
|
||||
config SCSI_MQ_DEFAULT
|
||||
bool "SCSI: use blk-mq I/O path by default"
|
||||
default y
|
||||
depends on SCSI
|
||||
---help---
|
||||
This option enables the blk-mq based I/O path for SCSI devices by
|
||||
default. With this option the scsi_mod.use_blk_mq module/boot
|
||||
option defaults to Y, without it to N, but it can still be
|
||||
overridden either way.
|
||||
|
||||
If unsure say Y.
|
||||
|
||||
config SCSI_PROC_FS
|
||||
bool "legacy /proc/scsi/ support"
|
||||
depends on SCSI && PROC_FS
|
||||
|
|
|
|||
|
|
@ -1906,7 +1906,6 @@ static int bnx2i_queue_scsi_cmd_resp(struct iscsi_session *session,
|
|||
struct iscsi_task *task;
|
||||
struct scsi_cmnd *sc;
|
||||
int rc = 0;
|
||||
int cpu;
|
||||
|
||||
spin_lock(&session->back_lock);
|
||||
task = iscsi_itt_to_task(bnx2i_conn->cls_conn->dd_data,
|
||||
|
|
@ -1917,14 +1916,9 @@ static int bnx2i_queue_scsi_cmd_resp(struct iscsi_session *session,
|
|||
}
|
||||
sc = task->sc;
|
||||
|
||||
if (!blk_rq_cpu_valid(sc->request))
|
||||
cpu = smp_processor_id();
|
||||
else
|
||||
cpu = sc->request->cpu;
|
||||
|
||||
spin_unlock(&session->back_lock);
|
||||
|
||||
p = &per_cpu(bnx2i_percpu, cpu);
|
||||
p = &per_cpu(bnx2i_percpu, blk_mq_rq_cpu(sc->request));
|
||||
spin_lock(&p->p_work_lock);
|
||||
if (unlikely(!p->iothread)) {
|
||||
rc = -EINVAL;
|
||||
|
|
|
|||
|
|
@ -1780,16 +1780,10 @@ csio_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmnd)
|
|||
int nsge = 0;
|
||||
int rv = SCSI_MLQUEUE_HOST_BUSY, nr;
|
||||
int retval;
|
||||
int cpu;
|
||||
struct csio_scsi_qset *sqset;
|
||||
struct fc_rport *rport = starget_to_rport(scsi_target(cmnd->device));
|
||||
|
||||
if (!blk_rq_cpu_valid(cmnd->request))
|
||||
cpu = smp_processor_id();
|
||||
else
|
||||
cpu = cmnd->request->cpu;
|
||||
|
||||
sqset = &hw->sqset[ln->portid][cpu];
|
||||
sqset = &hw->sqset[ln->portid][blk_mq_rq_cpu(cmnd->request)];
|
||||
|
||||
nr = fc_remote_port_chkready(rport);
|
||||
if (nr) {
|
||||
|
|
|
|||
|
|
@ -3088,12 +3088,6 @@ static ssize_t hwq_mode_store(struct device *dev,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if ((mode == HWQ_MODE_TAG) && !shost_use_blk_mq(shost)) {
|
||||
dev_info(cfgdev, "SCSI-MQ is not enabled, use a different "
|
||||
"HWQ steering mode.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
afu->hwq_mode = mode;
|
||||
|
||||
return count;
|
||||
|
|
|
|||
|
|
@ -1071,28 +1071,29 @@ static void alua_check(struct scsi_device *sdev, bool force)
|
|||
* Fail I/O to all paths not in state
|
||||
* active/optimized or active/non-optimized.
|
||||
*/
|
||||
static int alua_prep_fn(struct scsi_device *sdev, struct request *req)
|
||||
static blk_status_t alua_prep_fn(struct scsi_device *sdev, struct request *req)
|
||||
{
|
||||
struct alua_dh_data *h = sdev->handler_data;
|
||||
struct alua_port_group *pg;
|
||||
unsigned char state = SCSI_ACCESS_STATE_OPTIMAL;
|
||||
int ret = BLKPREP_OK;
|
||||
|
||||
rcu_read_lock();
|
||||
pg = rcu_dereference(h->pg);
|
||||
if (pg)
|
||||
state = pg->state;
|
||||
rcu_read_unlock();
|
||||
if (state == SCSI_ACCESS_STATE_TRANSITIONING)
|
||||
ret = BLKPREP_DEFER;
|
||||
else if (state != SCSI_ACCESS_STATE_OPTIMAL &&
|
||||
state != SCSI_ACCESS_STATE_ACTIVE &&
|
||||
state != SCSI_ACCESS_STATE_LBA) {
|
||||
ret = BLKPREP_KILL;
|
||||
req->rq_flags |= RQF_QUIET;
|
||||
}
|
||||
return ret;
|
||||
|
||||
switch (state) {
|
||||
case SCSI_ACCESS_STATE_OPTIMAL:
|
||||
case SCSI_ACCESS_STATE_ACTIVE:
|
||||
case SCSI_ACCESS_STATE_LBA:
|
||||
return BLK_STS_OK;
|
||||
case SCSI_ACCESS_STATE_TRANSITIONING:
|
||||
return BLK_STS_RESOURCE;
|
||||
default:
|
||||
req->rq_flags |= RQF_QUIET;
|
||||
return BLK_STS_IOERR;
|
||||
}
|
||||
}
|
||||
|
||||
static void alua_rescan(struct scsi_device *sdev)
|
||||
|
|
|
|||
|
|
@ -341,17 +341,17 @@ static int clariion_check_sense(struct scsi_device *sdev,
|
|||
return SCSI_RETURN_NOT_HANDLED;
|
||||
}
|
||||
|
||||
static int clariion_prep_fn(struct scsi_device *sdev, struct request *req)
|
||||
static blk_status_t clariion_prep_fn(struct scsi_device *sdev,
|
||||
struct request *req)
|
||||
{
|
||||
struct clariion_dh_data *h = sdev->handler_data;
|
||||
int ret = BLKPREP_OK;
|
||||
|
||||
if (h->lun_state != CLARIION_LUN_OWNED) {
|
||||
ret = BLKPREP_KILL;
|
||||
req->rq_flags |= RQF_QUIET;
|
||||
return BLK_STS_IOERR;
|
||||
}
|
||||
return ret;
|
||||
|
||||
return BLK_STS_OK;
|
||||
}
|
||||
|
||||
static int clariion_std_inquiry(struct scsi_device *sdev,
|
||||
|
|
|
|||
|
|
@ -172,17 +172,16 @@ retry:
|
|||
return rc;
|
||||
}
|
||||
|
||||
static int hp_sw_prep_fn(struct scsi_device *sdev, struct request *req)
|
||||
static blk_status_t hp_sw_prep_fn(struct scsi_device *sdev, struct request *req)
|
||||
{
|
||||
struct hp_sw_dh_data *h = sdev->handler_data;
|
||||
int ret = BLKPREP_OK;
|
||||
|
||||
if (h->path_state != HP_SW_PATH_ACTIVE) {
|
||||
ret = BLKPREP_KILL;
|
||||
req->rq_flags |= RQF_QUIET;
|
||||
return BLK_STS_IOERR;
|
||||
}
|
||||
return ret;
|
||||
|
||||
return BLK_STS_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -642,17 +642,16 @@ done:
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int rdac_prep_fn(struct scsi_device *sdev, struct request *req)
|
||||
static blk_status_t rdac_prep_fn(struct scsi_device *sdev, struct request *req)
|
||||
{
|
||||
struct rdac_dh_data *h = sdev->handler_data;
|
||||
int ret = BLKPREP_OK;
|
||||
|
||||
if (h->state != RDAC_STATE_ACTIVE) {
|
||||
ret = BLKPREP_KILL;
|
||||
req->rq_flags |= RQF_QUIET;
|
||||
return BLK_STS_IOERR;
|
||||
}
|
||||
return ret;
|
||||
|
||||
return BLK_STS_OK;
|
||||
}
|
||||
|
||||
static int rdac_check_sense(struct scsi_device *sdev,
|
||||
|
|
|
|||
|
|
@ -2274,7 +2274,7 @@ fnic_scsi_host_start_tag(struct fnic *fnic, struct scsi_cmnd *sc)
|
|||
return SCSI_NO_TAG;
|
||||
|
||||
sc->tag = sc->request->tag = dummy->tag;
|
||||
sc->request->special = sc;
|
||||
sc->host_scribble = (unsigned char *)dummy;
|
||||
|
||||
return dummy->tag;
|
||||
}
|
||||
|
|
@ -2286,7 +2286,7 @@ fnic_scsi_host_start_tag(struct fnic *fnic, struct scsi_cmnd *sc)
|
|||
static inline void
|
||||
fnic_scsi_host_end_tag(struct fnic *fnic, struct scsi_cmnd *sc)
|
||||
{
|
||||
struct request *dummy = sc->request->special;
|
||||
struct request *dummy = (struct request *)sc->host_scribble;
|
||||
|
||||
blk_mq_free_request(dummy);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -222,18 +222,9 @@ int scsi_add_host_with_dma(struct Scsi_Host *shost, struct device *dev,
|
|||
if (error)
|
||||
goto fail;
|
||||
|
||||
if (shost_use_blk_mq(shost)) {
|
||||
error = scsi_mq_setup_tags(shost);
|
||||
if (error)
|
||||
goto fail;
|
||||
} else {
|
||||
shost->bqt = blk_init_tags(shost->can_queue,
|
||||
shost->hostt->tag_alloc_policy);
|
||||
if (!shost->bqt) {
|
||||
error = -ENOMEM;
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
error = scsi_mq_setup_tags(shost);
|
||||
if (error)
|
||||
goto fail;
|
||||
|
||||
if (!shost->shost_gendev.parent)
|
||||
shost->shost_gendev.parent = dev ? dev : &platform_bus;
|
||||
|
|
@ -309,8 +300,7 @@ int scsi_add_host_with_dma(struct Scsi_Host *shost, struct device *dev,
|
|||
pm_runtime_disable(&shost->shost_gendev);
|
||||
pm_runtime_set_suspended(&shost->shost_gendev);
|
||||
pm_runtime_put_noidle(&shost->shost_gendev);
|
||||
if (shost_use_blk_mq(shost))
|
||||
scsi_mq_destroy_tags(shost);
|
||||
scsi_mq_destroy_tags(shost);
|
||||
fail:
|
||||
return error;
|
||||
}
|
||||
|
|
@ -344,13 +334,8 @@ static void scsi_host_dev_release(struct device *dev)
|
|||
kfree(dev_name(&shost->shost_dev));
|
||||
}
|
||||
|
||||
if (shost_use_blk_mq(shost)) {
|
||||
if (shost->tag_set.tags)
|
||||
scsi_mq_destroy_tags(shost);
|
||||
} else {
|
||||
if (shost->bqt)
|
||||
blk_free_tags(shost->bqt);
|
||||
}
|
||||
if (shost->tag_set.tags)
|
||||
scsi_mq_destroy_tags(shost);
|
||||
|
||||
kfree(shost->shost_data);
|
||||
|
||||
|
|
@ -472,8 +457,6 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize)
|
|||
else
|
||||
shost->dma_boundary = 0xffffffff;
|
||||
|
||||
shost->use_blk_mq = scsi_use_blk_mq || shost->hostt->force_blk_mq;
|
||||
|
||||
device_initialize(&shost->shost_gendev);
|
||||
dev_set_name(&shost->shost_gendev, "host%d", shost->host_no);
|
||||
shost->shost_gendev.bus = &scsi_bus_type;
|
||||
|
|
|
|||
|
|
@ -601,12 +601,7 @@ void sas_ata_task_abort(struct sas_task *task)
|
|||
|
||||
/* Bounce SCSI-initiated commands to the SCSI EH */
|
||||
if (qc->scsicmd) {
|
||||
struct request_queue *q = qc->scsicmd->device->request_queue;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(q->queue_lock, flags);
|
||||
blk_abort_request(qc->scsicmd->request);
|
||||
spin_unlock_irqrestore(q->queue_lock, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -930,16 +930,10 @@ void sas_task_abort(struct sas_task *task)
|
|||
return;
|
||||
}
|
||||
|
||||
if (dev_is_sata(task->dev)) {
|
||||
if (dev_is_sata(task->dev))
|
||||
sas_ata_task_abort(task);
|
||||
} else {
|
||||
struct request_queue *q = sc->device->request_queue;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(q->queue_lock, flags);
|
||||
else
|
||||
blk_abort_request(sc->request);
|
||||
spin_unlock_irqrestore(q->queue_lock, flags);
|
||||
}
|
||||
}
|
||||
|
||||
void sas_target_destroy(struct scsi_target *starget)
|
||||
|
|
|
|||
|
|
@ -3914,7 +3914,7 @@ int lpfc_sli4_scmd_to_wqidx_distr(struct lpfc_hba *phba,
|
|||
uint32_t tag;
|
||||
uint16_t hwq;
|
||||
|
||||
if (cmnd && shost_use_blk_mq(cmnd->device->host)) {
|
||||
if (cmnd) {
|
||||
tag = blk_mq_unique_tag(cmnd->request);
|
||||
hwq = blk_mq_unique_tag_to_hwq(tag);
|
||||
|
||||
|
|
|
|||
|
|
@ -506,11 +506,11 @@ static void osd_request_async_done(struct request *req, blk_status_t error)
|
|||
|
||||
_set_error_resid(or, req, error);
|
||||
if (req->next_rq) {
|
||||
__blk_put_request(req->q, req->next_rq);
|
||||
blk_put_request(req->next_rq);
|
||||
req->next_rq = NULL;
|
||||
}
|
||||
|
||||
__blk_put_request(req->q, req);
|
||||
blk_put_request(req);
|
||||
or->request = NULL;
|
||||
or->in.req = NULL;
|
||||
or->out.req = NULL;
|
||||
|
|
|
|||
|
|
@ -341,7 +341,7 @@ static void osst_end_async(struct request *req, blk_status_t status)
|
|||
blk_rq_unmap_user(SRpnt->bio);
|
||||
}
|
||||
|
||||
__blk_put_request(req->q, req);
|
||||
blk_put_request(req);
|
||||
}
|
||||
|
||||
/* osst_request memory management */
|
||||
|
|
|
|||
|
|
@ -644,8 +644,7 @@ static struct qedi_ctx *qedi_host_alloc(struct pci_dev *pdev)
|
|||
qedi->max_active_conns = ISCSI_MAX_SESS_PER_HBA;
|
||||
qedi->max_sqes = QEDI_SQ_SIZE;
|
||||
|
||||
if (shost_use_blk_mq(shost))
|
||||
shost->nr_hw_queues = MIN_NUM_CPUS_MSIX(qedi);
|
||||
shost->nr_hw_queues = MIN_NUM_CPUS_MSIX(qedi);
|
||||
|
||||
pci_set_drvdata(pdev, qedi);
|
||||
|
||||
|
|
|
|||
|
|
@ -272,17 +272,6 @@ static void qla_nvme_fcp_abort(struct nvme_fc_local_port *lport,
|
|||
schedule_work(&priv->abort_work);
|
||||
}
|
||||
|
||||
static void qla_nvme_poll(struct nvme_fc_local_port *lport, void *hw_queue_handle)
|
||||
{
|
||||
struct qla_qpair *qpair = hw_queue_handle;
|
||||
unsigned long flags;
|
||||
struct scsi_qla_host *vha = lport->private;
|
||||
|
||||
spin_lock_irqsave(&qpair->qp_lock, flags);
|
||||
qla24xx_process_response_queue(vha, qpair->rsp);
|
||||
spin_unlock_irqrestore(&qpair->qp_lock, flags);
|
||||
}
|
||||
|
||||
static inline int qla2x00_start_nvme_mq(srb_t *sp)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
|
@ -578,7 +567,6 @@ static struct nvme_fc_port_template qla_nvme_fc_transport = {
|
|||
.ls_abort = qla_nvme_ls_abort,
|
||||
.fcp_io = qla_nvme_post_cmd,
|
||||
.fcp_abort = qla_nvme_fcp_abort,
|
||||
.poll_queue = qla_nvme_poll,
|
||||
.max_hw_queues = 8,
|
||||
.max_sgl_segments = 128,
|
||||
.max_dif_sgl_segments = 64,
|
||||
|
|
|
|||
|
|
@ -857,13 +857,9 @@ qla2xxx_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
|
|||
}
|
||||
|
||||
if (ha->mqenable) {
|
||||
if (shost_use_blk_mq(vha->host)) {
|
||||
tag = blk_mq_unique_tag(cmd->request);
|
||||
hwq = blk_mq_unique_tag_to_hwq(tag);
|
||||
qpair = ha->queue_pair_map[hwq];
|
||||
} else if (vha->vp_idx && vha->qpair) {
|
||||
qpair = vha->qpair;
|
||||
}
|
||||
tag = blk_mq_unique_tag(cmd->request);
|
||||
hwq = blk_mq_unique_tag_to_hwq(tag);
|
||||
qpair = ha->queue_pair_map[hwq];
|
||||
|
||||
if (qpair)
|
||||
return qla2xxx_mqueuecommand(host, cmd, qpair);
|
||||
|
|
@ -1464,7 +1460,7 @@ __qla2xxx_eh_generic_reset(char *name, enum nexus_wait_type type,
|
|||
goto eh_reset_failed;
|
||||
}
|
||||
err = 2;
|
||||
if (do_reset(fcport, cmd->device->lun, cmd->request->cpu + 1)
|
||||
if (do_reset(fcport, cmd->device->lun, blk_mq_rq_cpu(cmd->request) + 1)
|
||||
!= QLA_SUCCESS) {
|
||||
ql_log(ql_log_warn, vha, 0x800c,
|
||||
"do_reset failed for cmd=%p.\n", cmd);
|
||||
|
|
@ -3159,7 +3155,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
goto probe_failed;
|
||||
}
|
||||
|
||||
if (ha->mqenable && shost_use_blk_mq(host)) {
|
||||
if (ha->mqenable) {
|
||||
/* number of hardware queues supported by blk/scsi-mq*/
|
||||
host->nr_hw_queues = ha->max_qpairs;
|
||||
|
||||
|
|
@ -3271,25 +3267,17 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
base_vha->mgmt_svr_loop_id, host->sg_tablesize);
|
||||
|
||||
if (ha->mqenable) {
|
||||
bool mq = false;
|
||||
bool startit = false;
|
||||
|
||||
if (QLA_TGT_MODE_ENABLED()) {
|
||||
mq = true;
|
||||
if (QLA_TGT_MODE_ENABLED())
|
||||
startit = false;
|
||||
}
|
||||
|
||||
if ((ql2x_ini_mode == QLA2XXX_INI_MODE_ENABLED) &&
|
||||
shost_use_blk_mq(host)) {
|
||||
mq = true;
|
||||
if (ql2x_ini_mode == QLA2XXX_INI_MODE_ENABLED)
|
||||
startit = true;
|
||||
}
|
||||
|
||||
if (mq) {
|
||||
/* Create start of day qpairs for Block MQ */
|
||||
for (i = 0; i < ha->max_qpairs; i++)
|
||||
qla2xxx_create_qpair(base_vha, 5, 0, startit);
|
||||
}
|
||||
/* Create start of day qpairs for Block MQ */
|
||||
for (i = 0; i < ha->max_qpairs; i++)
|
||||
qla2xxx_create_qpair(base_vha, 5, 0, startit);
|
||||
}
|
||||
|
||||
if (ha->flags.running_gold_fw)
|
||||
|
|
@ -6952,11 +6940,12 @@ static int qla2xxx_map_queues(struct Scsi_Host *shost)
|
|||
{
|
||||
int rc;
|
||||
scsi_qla_host_t *vha = (scsi_qla_host_t *)shost->hostdata;
|
||||
struct blk_mq_queue_map *qmap = &shost->tag_set.map[0];
|
||||
|
||||
if (USER_CTRL_IRQ(vha->hw))
|
||||
rc = blk_mq_map_queues(&shost->tag_set);
|
||||
rc = blk_mq_map_queues(qmap);
|
||||
else
|
||||
rc = blk_mq_pci_map_queues(&shost->tag_set, vha->hw->pdev, 0);
|
||||
rc = blk_mq_pci_map_queues(qmap, vha->hw->pdev, 0);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -780,11 +780,8 @@ MODULE_LICENSE("GPL");
|
|||
module_param(scsi_logging_level, int, S_IRUGO|S_IWUSR);
|
||||
MODULE_PARM_DESC(scsi_logging_level, "a bit mask of logging levels");
|
||||
|
||||
#ifdef CONFIG_SCSI_MQ_DEFAULT
|
||||
/* This should go away in the future, it doesn't do anything anymore */
|
||||
bool scsi_use_blk_mq = true;
|
||||
#else
|
||||
bool scsi_use_blk_mq = false;
|
||||
#endif
|
||||
module_param_named(use_blk_mq, scsi_use_blk_mq, bool, S_IWUSR | S_IRUGO);
|
||||
|
||||
static int __init init_scsi(void)
|
||||
|
|
|
|||
|
|
@ -5881,8 +5881,7 @@ static int sdebug_driver_probe(struct device *dev)
|
|||
}
|
||||
/* Decide whether to tell scsi subsystem that we want mq */
|
||||
/* Following should give the same answer for each host */
|
||||
if (shost_use_blk_mq(hpnt))
|
||||
hpnt->nr_hw_queues = submit_queues;
|
||||
hpnt->nr_hw_queues = submit_queues;
|
||||
|
||||
sdbg_host->shost = hpnt;
|
||||
*((struct sdebug_host_info **)hpnt->hostdata) = sdbg_host;
|
||||
|
|
|
|||
|
|
@ -297,19 +297,19 @@ enum blk_eh_timer_return scsi_times_out(struct request *req)
|
|||
|
||||
if (rtn == BLK_EH_DONE) {
|
||||
/*
|
||||
* For blk-mq, we must set the request state to complete now
|
||||
* before sending the request to the scsi error handler. This
|
||||
* will prevent a use-after-free in the event the LLD manages
|
||||
* to complete the request before the error handler finishes
|
||||
* processing this timed out request.
|
||||
* Set the command to complete first in order to prevent a real
|
||||
* completion from releasing the command while error handling
|
||||
* is using it. If the command was already completed, then the
|
||||
* lower level driver beat the timeout handler, and it is safe
|
||||
* to return without escalating error recovery.
|
||||
*
|
||||
* If the request was already completed, then the LLD beat the
|
||||
* time out handler from transferring the request to the scsi
|
||||
* error handler. In that case we can return immediately as no
|
||||
* further action is required.
|
||||
* If timeout handling lost the race to a real completion, the
|
||||
* block layer may ignore that due to a fake timeout injection,
|
||||
* so return RESET_TIMER to allow error handling another shot
|
||||
* at this command.
|
||||
*/
|
||||
if (req->q->mq_ops && !blk_mq_mark_complete(req))
|
||||
return rtn;
|
||||
if (test_and_set_bit(SCMD_STATE_COMPLETE, &scmd->state))
|
||||
return BLK_EH_RESET_TIMER;
|
||||
if (scsi_abort_command(scmd) != SUCCESS) {
|
||||
set_host_byte(scmd, DID_TIME_OUT);
|
||||
scsi_eh_scmd_add(scmd);
|
||||
|
|
@ -1932,7 +1932,7 @@ maybe_retry:
|
|||
|
||||
static void eh_lock_door_done(struct request *req, blk_status_t status)
|
||||
{
|
||||
__blk_put_request(req->q, req);
|
||||
blk_put_request(req);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -92,7 +92,6 @@ extern void scsi_queue_insert(struct scsi_cmnd *cmd, int reason);
|
|||
extern void scsi_io_completion(struct scsi_cmnd *, unsigned int);
|
||||
extern void scsi_run_host_queues(struct Scsi_Host *shost);
|
||||
extern void scsi_requeue_run_queue(struct work_struct *work);
|
||||
extern struct request_queue *scsi_old_alloc_queue(struct scsi_device *sdev);
|
||||
extern struct request_queue *scsi_mq_alloc_queue(struct scsi_device *sdev);
|
||||
extern void scsi_start_queue(struct scsi_device *sdev);
|
||||
extern int scsi_mq_setup_tags(struct Scsi_Host *shost);
|
||||
|
|
|
|||
|
|
@ -266,10 +266,7 @@ static struct scsi_device *scsi_alloc_sdev(struct scsi_target *starget,
|
|||
*/
|
||||
sdev->borken = 1;
|
||||
|
||||
if (shost_use_blk_mq(shost))
|
||||
sdev->request_queue = scsi_mq_alloc_queue(sdev);
|
||||
else
|
||||
sdev->request_queue = scsi_old_alloc_queue(sdev);
|
||||
sdev->request_queue = scsi_mq_alloc_queue(sdev);
|
||||
if (!sdev->request_queue) {
|
||||
/* release fn is set up in scsi_sysfs_device_initialise, so
|
||||
* have to free and put manually here */
|
||||
|
|
@ -280,11 +277,6 @@ static struct scsi_device *scsi_alloc_sdev(struct scsi_target *starget,
|
|||
WARN_ON_ONCE(!blk_get_queue(sdev->request_queue));
|
||||
sdev->request_queue->queuedata = sdev;
|
||||
|
||||
if (!shost_use_blk_mq(sdev->host)) {
|
||||
blk_queue_init_tags(sdev->request_queue,
|
||||
sdev->host->cmd_per_lun, shost->bqt,
|
||||
shost->hostt->tag_alloc_policy);
|
||||
}
|
||||
scsi_change_queue_depth(sdev, sdev->host->cmd_per_lun ?
|
||||
sdev->host->cmd_per_lun : 1);
|
||||
|
||||
|
|
|
|||
|
|
@ -367,7 +367,6 @@ store_shost_eh_deadline(struct device *dev, struct device_attribute *attr,
|
|||
|
||||
static DEVICE_ATTR(eh_deadline, S_IRUGO | S_IWUSR, show_shost_eh_deadline, store_shost_eh_deadline);
|
||||
|
||||
shost_rd_attr(use_blk_mq, "%d\n");
|
||||
shost_rd_attr(unique_id, "%u\n");
|
||||
shost_rd_attr(cmd_per_lun, "%hd\n");
|
||||
shost_rd_attr(can_queue, "%hd\n");
|
||||
|
|
@ -386,6 +385,13 @@ show_host_busy(struct device *dev, struct device_attribute *attr, char *buf)
|
|||
}
|
||||
static DEVICE_ATTR(host_busy, S_IRUGO, show_host_busy, NULL);
|
||||
|
||||
static ssize_t
|
||||
show_use_blk_mq(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
return sprintf(buf, "1\n");
|
||||
}
|
||||
static DEVICE_ATTR(use_blk_mq, S_IRUGO, show_use_blk_mq, NULL);
|
||||
|
||||
static struct attribute *scsi_sysfs_shost_attrs[] = {
|
||||
&dev_attr_use_blk_mq.attr,
|
||||
&dev_attr_unique_id.attr,
|
||||
|
|
|
|||
|
|
@ -3592,7 +3592,7 @@ fc_bsg_job_timeout(struct request *req)
|
|||
|
||||
/* the blk_end_sync_io() doesn't check the error */
|
||||
if (inflight)
|
||||
__blk_complete_request(req);
|
||||
blk_mq_end_request(req, BLK_STS_IOERR);
|
||||
return BLK_EH_DONE;
|
||||
}
|
||||
|
||||
|
|
@ -3684,14 +3684,9 @@ static void
|
|||
fc_bsg_goose_queue(struct fc_rport *rport)
|
||||
{
|
||||
struct request_queue *q = rport->rqst_q;
|
||||
unsigned long flags;
|
||||
|
||||
if (!q)
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(q->queue_lock, flags);
|
||||
blk_run_queue_async(q);
|
||||
spin_unlock_irqrestore(q->queue_lock, flags);
|
||||
if (q)
|
||||
blk_mq_run_hw_queues(q, true);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -3759,6 +3754,37 @@ static int fc_bsg_dispatch(struct bsg_job *job)
|
|||
return fc_bsg_host_dispatch(shost, job);
|
||||
}
|
||||
|
||||
static blk_status_t fc_bsg_rport_prep(struct fc_rport *rport)
|
||||
{
|
||||
if (rport->port_state == FC_PORTSTATE_BLOCKED &&
|
||||
!(rport->flags & FC_RPORT_FAST_FAIL_TIMEDOUT))
|
||||
return BLK_STS_RESOURCE;
|
||||
|
||||
if (rport->port_state != FC_PORTSTATE_ONLINE)
|
||||
return BLK_STS_IOERR;
|
||||
|
||||
return BLK_STS_OK;
|
||||
}
|
||||
|
||||
|
||||
static int fc_bsg_dispatch_prep(struct bsg_job *job)
|
||||
{
|
||||
struct fc_rport *rport = fc_bsg_to_rport(job);
|
||||
blk_status_t ret;
|
||||
|
||||
ret = fc_bsg_rport_prep(rport);
|
||||
switch (ret) {
|
||||
case BLK_STS_OK:
|
||||
break;
|
||||
case BLK_STS_RESOURCE:
|
||||
return -EAGAIN;
|
||||
default:
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
return fc_bsg_dispatch(job);
|
||||
}
|
||||
|
||||
/**
|
||||
* fc_bsg_hostadd - Create and add the bsg hooks so we can receive requests
|
||||
* @shost: shost for fc_host
|
||||
|
|
@ -3780,7 +3806,8 @@ fc_bsg_hostadd(struct Scsi_Host *shost, struct fc_host_attrs *fc_host)
|
|||
snprintf(bsg_name, sizeof(bsg_name),
|
||||
"fc_host%d", shost->host_no);
|
||||
|
||||
q = bsg_setup_queue(dev, bsg_name, fc_bsg_dispatch, i->f->dd_bsg_size);
|
||||
q = bsg_setup_queue(dev, bsg_name, fc_bsg_dispatch, fc_bsg_job_timeout,
|
||||
i->f->dd_bsg_size);
|
||||
if (IS_ERR(q)) {
|
||||
dev_err(dev,
|
||||
"fc_host%d: bsg interface failed to initialize - setup queue\n",
|
||||
|
|
@ -3788,26 +3815,11 @@ fc_bsg_hostadd(struct Scsi_Host *shost, struct fc_host_attrs *fc_host)
|
|||
return PTR_ERR(q);
|
||||
}
|
||||
__scsi_init_queue(shost, q);
|
||||
blk_queue_rq_timed_out(q, fc_bsg_job_timeout);
|
||||
blk_queue_rq_timeout(q, FC_DEFAULT_BSG_TIMEOUT);
|
||||
fc_host->rqst_q = q;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int fc_bsg_rport_prep(struct request_queue *q, struct request *req)
|
||||
{
|
||||
struct fc_rport *rport = dev_to_rport(q->queuedata);
|
||||
|
||||
if (rport->port_state == FC_PORTSTATE_BLOCKED &&
|
||||
!(rport->flags & FC_RPORT_FAST_FAIL_TIMEDOUT))
|
||||
return BLKPREP_DEFER;
|
||||
|
||||
if (rport->port_state != FC_PORTSTATE_ONLINE)
|
||||
return BLKPREP_KILL;
|
||||
|
||||
return BLKPREP_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* fc_bsg_rportadd - Create and add the bsg hooks so we can receive requests
|
||||
* @shost: shost that rport is attached to
|
||||
|
|
@ -3825,15 +3837,13 @@ fc_bsg_rportadd(struct Scsi_Host *shost, struct fc_rport *rport)
|
|||
if (!i->f->bsg_request)
|
||||
return -ENOTSUPP;
|
||||
|
||||
q = bsg_setup_queue(dev, dev_name(dev), fc_bsg_dispatch,
|
||||
i->f->dd_bsg_size);
|
||||
q = bsg_setup_queue(dev, dev_name(dev), fc_bsg_dispatch_prep,
|
||||
fc_bsg_job_timeout, i->f->dd_bsg_size);
|
||||
if (IS_ERR(q)) {
|
||||
dev_err(dev, "failed to setup bsg queue\n");
|
||||
return PTR_ERR(q);
|
||||
}
|
||||
__scsi_init_queue(shost, q);
|
||||
blk_queue_prep_rq(q, fc_bsg_rport_prep);
|
||||
blk_queue_rq_timed_out(q, fc_bsg_job_timeout);
|
||||
blk_queue_rq_timeout(q, BLK_DEFAULT_SG_TIMEOUT);
|
||||
rport->rqst_q = q;
|
||||
return 0;
|
||||
|
|
@ -3852,10 +3862,7 @@ fc_bsg_rportadd(struct Scsi_Host *shost, struct fc_rport *rport)
|
|||
static void
|
||||
fc_bsg_remove(struct request_queue *q)
|
||||
{
|
||||
if (q) {
|
||||
bsg_unregister_queue(q);
|
||||
blk_cleanup_queue(q);
|
||||
}
|
||||
bsg_remove_queue(q);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1542,7 +1542,7 @@ iscsi_bsg_host_add(struct Scsi_Host *shost, struct iscsi_cls_host *ihost)
|
|||
return -ENOTSUPP;
|
||||
|
||||
snprintf(bsg_name, sizeof(bsg_name), "iscsi_host%d", shost->host_no);
|
||||
q = bsg_setup_queue(dev, bsg_name, iscsi_bsg_host_dispatch, 0);
|
||||
q = bsg_setup_queue(dev, bsg_name, iscsi_bsg_host_dispatch, NULL, 0);
|
||||
if (IS_ERR(q)) {
|
||||
shost_printk(KERN_ERR, shost, "bsg interface failed to "
|
||||
"initialize - no request queue\n");
|
||||
|
|
@ -1576,10 +1576,7 @@ static int iscsi_remove_host(struct transport_container *tc,
|
|||
struct Scsi_Host *shost = dev_to_shost(dev);
|
||||
struct iscsi_cls_host *ihost = shost->shost_data;
|
||||
|
||||
if (ihost->bsg_q) {
|
||||
bsg_unregister_queue(ihost->bsg_q);
|
||||
blk_cleanup_queue(ihost->bsg_q);
|
||||
}
|
||||
bsg_remove_queue(ihost->bsg_q);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -198,7 +198,7 @@ static int sas_bsg_initialize(struct Scsi_Host *shost, struct sas_rphy *rphy)
|
|||
|
||||
if (rphy) {
|
||||
q = bsg_setup_queue(&rphy->dev, dev_name(&rphy->dev),
|
||||
sas_smp_dispatch, 0);
|
||||
sas_smp_dispatch, NULL, 0);
|
||||
if (IS_ERR(q))
|
||||
return PTR_ERR(q);
|
||||
rphy->q = q;
|
||||
|
|
@ -207,7 +207,7 @@ static int sas_bsg_initialize(struct Scsi_Host *shost, struct sas_rphy *rphy)
|
|||
|
||||
snprintf(name, sizeof(name), "sas_host%d", shost->host_no);
|
||||
q = bsg_setup_queue(&shost->shost_gendev, name,
|
||||
sas_smp_dispatch, 0);
|
||||
sas_smp_dispatch, NULL, 0);
|
||||
if (IS_ERR(q))
|
||||
return PTR_ERR(q);
|
||||
to_sas_host_attrs(shost)->q = q;
|
||||
|
|
@ -246,11 +246,7 @@ static int sas_host_remove(struct transport_container *tc, struct device *dev,
|
|||
struct Scsi_Host *shost = dev_to_shost(dev);
|
||||
struct request_queue *q = to_sas_host_attrs(shost)->q;
|
||||
|
||||
if (q) {
|
||||
bsg_unregister_queue(q);
|
||||
blk_cleanup_queue(q);
|
||||
}
|
||||
|
||||
bsg_remove_queue(q);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -114,7 +114,7 @@ static int sd_suspend_system(struct device *);
|
|||
static int sd_suspend_runtime(struct device *);
|
||||
static int sd_resume(struct device *);
|
||||
static void sd_rescan(struct device *);
|
||||
static int sd_init_command(struct scsi_cmnd *SCpnt);
|
||||
static blk_status_t sd_init_command(struct scsi_cmnd *SCpnt);
|
||||
static void sd_uninit_command(struct scsi_cmnd *SCpnt);
|
||||
static int sd_done(struct scsi_cmnd *);
|
||||
static void sd_eh_reset(struct scsi_cmnd *);
|
||||
|
|
@ -751,7 +751,7 @@ static void sd_config_discard(struct scsi_disk *sdkp, unsigned int mode)
|
|||
blk_queue_flag_set(QUEUE_FLAG_DISCARD, q);
|
||||
}
|
||||
|
||||
static int sd_setup_unmap_cmnd(struct scsi_cmnd *cmd)
|
||||
static blk_status_t sd_setup_unmap_cmnd(struct scsi_cmnd *cmd)
|
||||
{
|
||||
struct scsi_device *sdp = cmd->device;
|
||||
struct request *rq = cmd->request;
|
||||
|
|
@ -762,7 +762,7 @@ static int sd_setup_unmap_cmnd(struct scsi_cmnd *cmd)
|
|||
|
||||
rq->special_vec.bv_page = mempool_alloc(sd_page_pool, GFP_ATOMIC);
|
||||
if (!rq->special_vec.bv_page)
|
||||
return BLKPREP_DEFER;
|
||||
return BLK_STS_RESOURCE;
|
||||
clear_highpage(rq->special_vec.bv_page);
|
||||
rq->special_vec.bv_offset = 0;
|
||||
rq->special_vec.bv_len = data_len;
|
||||
|
|
@ -786,7 +786,8 @@ static int sd_setup_unmap_cmnd(struct scsi_cmnd *cmd)
|
|||
return scsi_init_io(cmd);
|
||||
}
|
||||
|
||||
static int sd_setup_write_same16_cmnd(struct scsi_cmnd *cmd, bool unmap)
|
||||
static blk_status_t sd_setup_write_same16_cmnd(struct scsi_cmnd *cmd,
|
||||
bool unmap)
|
||||
{
|
||||
struct scsi_device *sdp = cmd->device;
|
||||
struct request *rq = cmd->request;
|
||||
|
|
@ -796,7 +797,7 @@ static int sd_setup_write_same16_cmnd(struct scsi_cmnd *cmd, bool unmap)
|
|||
|
||||
rq->special_vec.bv_page = mempool_alloc(sd_page_pool, GFP_ATOMIC);
|
||||
if (!rq->special_vec.bv_page)
|
||||
return BLKPREP_DEFER;
|
||||
return BLK_STS_RESOURCE;
|
||||
clear_highpage(rq->special_vec.bv_page);
|
||||
rq->special_vec.bv_offset = 0;
|
||||
rq->special_vec.bv_len = data_len;
|
||||
|
|
@ -817,7 +818,8 @@ static int sd_setup_write_same16_cmnd(struct scsi_cmnd *cmd, bool unmap)
|
|||
return scsi_init_io(cmd);
|
||||
}
|
||||
|
||||
static int sd_setup_write_same10_cmnd(struct scsi_cmnd *cmd, bool unmap)
|
||||
static blk_status_t sd_setup_write_same10_cmnd(struct scsi_cmnd *cmd,
|
||||
bool unmap)
|
||||
{
|
||||
struct scsi_device *sdp = cmd->device;
|
||||
struct request *rq = cmd->request;
|
||||
|
|
@ -827,7 +829,7 @@ static int sd_setup_write_same10_cmnd(struct scsi_cmnd *cmd, bool unmap)
|
|||
|
||||
rq->special_vec.bv_page = mempool_alloc(sd_page_pool, GFP_ATOMIC);
|
||||
if (!rq->special_vec.bv_page)
|
||||
return BLKPREP_DEFER;
|
||||
return BLK_STS_RESOURCE;
|
||||
clear_highpage(rq->special_vec.bv_page);
|
||||
rq->special_vec.bv_offset = 0;
|
||||
rq->special_vec.bv_len = data_len;
|
||||
|
|
@ -848,7 +850,7 @@ static int sd_setup_write_same10_cmnd(struct scsi_cmnd *cmd, bool unmap)
|
|||
return scsi_init_io(cmd);
|
||||
}
|
||||
|
||||
static int sd_setup_write_zeroes_cmnd(struct scsi_cmnd *cmd)
|
||||
static blk_status_t sd_setup_write_zeroes_cmnd(struct scsi_cmnd *cmd)
|
||||
{
|
||||
struct request *rq = cmd->request;
|
||||
struct scsi_device *sdp = cmd->device;
|
||||
|
|
@ -866,7 +868,7 @@ static int sd_setup_write_zeroes_cmnd(struct scsi_cmnd *cmd)
|
|||
}
|
||||
|
||||
if (sdp->no_write_same)
|
||||
return BLKPREP_INVALID;
|
||||
return BLK_STS_TARGET;
|
||||
|
||||
if (sdkp->ws16 || sector > 0xffffffff || nr_sectors > 0xffff)
|
||||
return sd_setup_write_same16_cmnd(cmd, false);
|
||||
|
|
@ -943,7 +945,7 @@ out:
|
|||
* Will set up either WRITE SAME(10) or WRITE SAME(16) depending on
|
||||
* the preference indicated by the target device.
|
||||
**/
|
||||
static int sd_setup_write_same_cmnd(struct scsi_cmnd *cmd)
|
||||
static blk_status_t sd_setup_write_same_cmnd(struct scsi_cmnd *cmd)
|
||||
{
|
||||
struct request *rq = cmd->request;
|
||||
struct scsi_device *sdp = cmd->device;
|
||||
|
|
@ -952,10 +954,10 @@ static int sd_setup_write_same_cmnd(struct scsi_cmnd *cmd)
|
|||
sector_t sector = blk_rq_pos(rq);
|
||||
unsigned int nr_sectors = blk_rq_sectors(rq);
|
||||
unsigned int nr_bytes = blk_rq_bytes(rq);
|
||||
int ret;
|
||||
blk_status_t ret;
|
||||
|
||||
if (sdkp->device->no_write_same)
|
||||
return BLKPREP_INVALID;
|
||||
return BLK_STS_TARGET;
|
||||
|
||||
BUG_ON(bio_offset(bio) || bio_iovec(bio).bv_len != sdp->sector_size);
|
||||
|
||||
|
|
@ -996,7 +998,7 @@ static int sd_setup_write_same_cmnd(struct scsi_cmnd *cmd)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int sd_setup_flush_cmnd(struct scsi_cmnd *cmd)
|
||||
static blk_status_t sd_setup_flush_cmnd(struct scsi_cmnd *cmd)
|
||||
{
|
||||
struct request *rq = cmd->request;
|
||||
|
||||
|
|
@ -1009,10 +1011,10 @@ static int sd_setup_flush_cmnd(struct scsi_cmnd *cmd)
|
|||
cmd->allowed = SD_MAX_RETRIES;
|
||||
|
||||
rq->timeout = rq->q->rq_timeout * SD_FLUSH_TIMEOUT_MULTIPLIER;
|
||||
return BLKPREP_OK;
|
||||
return BLK_STS_OK;
|
||||
}
|
||||
|
||||
static int sd_setup_read_write_cmnd(struct scsi_cmnd *SCpnt)
|
||||
static blk_status_t sd_setup_read_write_cmnd(struct scsi_cmnd *SCpnt)
|
||||
{
|
||||
struct request *rq = SCpnt->request;
|
||||
struct scsi_device *sdp = SCpnt->device;
|
||||
|
|
@ -1022,18 +1024,14 @@ static int sd_setup_read_write_cmnd(struct scsi_cmnd *SCpnt)
|
|||
sector_t threshold;
|
||||
unsigned int this_count = blk_rq_sectors(rq);
|
||||
unsigned int dif, dix;
|
||||
int ret;
|
||||
unsigned char protect;
|
||||
blk_status_t ret;
|
||||
|
||||
ret = scsi_init_io(SCpnt);
|
||||
if (ret != BLKPREP_OK)
|
||||
if (ret != BLK_STS_OK)
|
||||
return ret;
|
||||
WARN_ON_ONCE(SCpnt != rq->special);
|
||||
|
||||
/* from here on until we're complete, any goto out
|
||||
* is used for a killable error condition */
|
||||
ret = BLKPREP_KILL;
|
||||
|
||||
SCSI_LOG_HLQUEUE(1,
|
||||
scmd_printk(KERN_INFO, SCpnt,
|
||||
"%s: block=%llu, count=%d\n",
|
||||
|
|
@ -1046,7 +1044,7 @@ static int sd_setup_read_write_cmnd(struct scsi_cmnd *SCpnt)
|
|||
blk_rq_sectors(rq)));
|
||||
SCSI_LOG_HLQUEUE(2, scmd_printk(KERN_INFO, SCpnt,
|
||||
"Retry with 0x%p\n", SCpnt));
|
||||
goto out;
|
||||
return BLK_STS_IOERR;
|
||||
}
|
||||
|
||||
if (sdp->changed) {
|
||||
|
|
@ -1055,7 +1053,7 @@ static int sd_setup_read_write_cmnd(struct scsi_cmnd *SCpnt)
|
|||
* the changed bit has been reset
|
||||
*/
|
||||
/* printk("SCSI disk has been changed or is not present. Prohibiting further I/O.\n"); */
|
||||
goto out;
|
||||
return BLK_STS_IOERR;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -1093,31 +1091,28 @@ static int sd_setup_read_write_cmnd(struct scsi_cmnd *SCpnt)
|
|||
if ((block & 1) || (blk_rq_sectors(rq) & 1)) {
|
||||
scmd_printk(KERN_ERR, SCpnt,
|
||||
"Bad block number requested\n");
|
||||
goto out;
|
||||
} else {
|
||||
block = block >> 1;
|
||||
this_count = this_count >> 1;
|
||||
return BLK_STS_IOERR;
|
||||
}
|
||||
block = block >> 1;
|
||||
this_count = this_count >> 1;
|
||||
}
|
||||
if (sdp->sector_size == 2048) {
|
||||
if ((block & 3) || (blk_rq_sectors(rq) & 3)) {
|
||||
scmd_printk(KERN_ERR, SCpnt,
|
||||
"Bad block number requested\n");
|
||||
goto out;
|
||||
} else {
|
||||
block = block >> 2;
|
||||
this_count = this_count >> 2;
|
||||
return BLK_STS_IOERR;
|
||||
}
|
||||
block = block >> 2;
|
||||
this_count = this_count >> 2;
|
||||
}
|
||||
if (sdp->sector_size == 4096) {
|
||||
if ((block & 7) || (blk_rq_sectors(rq) & 7)) {
|
||||
scmd_printk(KERN_ERR, SCpnt,
|
||||
"Bad block number requested\n");
|
||||
goto out;
|
||||
} else {
|
||||
block = block >> 3;
|
||||
this_count = this_count >> 3;
|
||||
return BLK_STS_IOERR;
|
||||
}
|
||||
block = block >> 3;
|
||||
this_count = this_count >> 3;
|
||||
}
|
||||
if (rq_data_dir(rq) == WRITE) {
|
||||
SCpnt->cmnd[0] = WRITE_6;
|
||||
|
|
@ -1129,7 +1124,7 @@ static int sd_setup_read_write_cmnd(struct scsi_cmnd *SCpnt)
|
|||
SCpnt->cmnd[0] = READ_6;
|
||||
} else {
|
||||
scmd_printk(KERN_ERR, SCpnt, "Unknown command %d\n", req_op(rq));
|
||||
goto out;
|
||||
return BLK_STS_IOERR;
|
||||
}
|
||||
|
||||
SCSI_LOG_HLQUEUE(2, scmd_printk(KERN_INFO, SCpnt,
|
||||
|
|
@ -1149,10 +1144,8 @@ static int sd_setup_read_write_cmnd(struct scsi_cmnd *SCpnt)
|
|||
if (protect && sdkp->protection_type == T10_PI_TYPE2_PROTECTION) {
|
||||
SCpnt->cmnd = mempool_alloc(sd_cdb_pool, GFP_ATOMIC);
|
||||
|
||||
if (unlikely(SCpnt->cmnd == NULL)) {
|
||||
ret = BLKPREP_DEFER;
|
||||
goto out;
|
||||
}
|
||||
if (unlikely(!SCpnt->cmnd))
|
||||
return BLK_STS_RESOURCE;
|
||||
|
||||
SCpnt->cmd_len = SD_EXT_CDB_SIZE;
|
||||
memset(SCpnt->cmnd, 0, SCpnt->cmd_len);
|
||||
|
|
@ -1220,7 +1213,7 @@ static int sd_setup_read_write_cmnd(struct scsi_cmnd *SCpnt)
|
|||
*/
|
||||
scmd_printk(KERN_ERR, SCpnt,
|
||||
"FUA write on READ/WRITE(6) drive\n");
|
||||
goto out;
|
||||
return BLK_STS_IOERR;
|
||||
}
|
||||
|
||||
SCpnt->cmnd[1] |= (unsigned char) ((block >> 16) & 0x1f);
|
||||
|
|
@ -1244,12 +1237,10 @@ static int sd_setup_read_write_cmnd(struct scsi_cmnd *SCpnt)
|
|||
* This indicates that the command is ready from our end to be
|
||||
* queued.
|
||||
*/
|
||||
ret = BLKPREP_OK;
|
||||
out:
|
||||
return ret;
|
||||
return BLK_STS_OK;
|
||||
}
|
||||
|
||||
static int sd_init_command(struct scsi_cmnd *cmd)
|
||||
static blk_status_t sd_init_command(struct scsi_cmnd *cmd)
|
||||
{
|
||||
struct request *rq = cmd->request;
|
||||
|
||||
|
|
@ -1265,7 +1256,7 @@ static int sd_init_command(struct scsi_cmnd *cmd)
|
|||
case SD_LBP_ZERO:
|
||||
return sd_setup_write_same10_cmnd(cmd, false);
|
||||
default:
|
||||
return BLKPREP_INVALID;
|
||||
return BLK_STS_TARGET;
|
||||
}
|
||||
case REQ_OP_WRITE_ZEROES:
|
||||
return sd_setup_write_zeroes_cmnd(cmd);
|
||||
|
|
@ -1280,7 +1271,7 @@ static int sd_init_command(struct scsi_cmnd *cmd)
|
|||
return sd_zbc_setup_reset_cmnd(cmd);
|
||||
default:
|
||||
WARN_ON_ONCE(1);
|
||||
return BLKPREP_KILL;
|
||||
return BLK_STS_NOTSUPP;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -271,7 +271,7 @@ static inline int sd_is_zoned(struct scsi_disk *sdkp)
|
|||
|
||||
extern int sd_zbc_read_zones(struct scsi_disk *sdkp, unsigned char *buffer);
|
||||
extern void sd_zbc_print_zones(struct scsi_disk *sdkp);
|
||||
extern int sd_zbc_setup_reset_cmnd(struct scsi_cmnd *cmd);
|
||||
extern blk_status_t sd_zbc_setup_reset_cmnd(struct scsi_cmnd *cmd);
|
||||
extern void sd_zbc_complete(struct scsi_cmnd *cmd, unsigned int good_bytes,
|
||||
struct scsi_sense_hdr *sshdr);
|
||||
extern int sd_zbc_report_zones(struct gendisk *disk, sector_t sector,
|
||||
|
|
@ -288,9 +288,9 @@ static inline int sd_zbc_read_zones(struct scsi_disk *sdkp,
|
|||
|
||||
static inline void sd_zbc_print_zones(struct scsi_disk *sdkp) {}
|
||||
|
||||
static inline int sd_zbc_setup_reset_cmnd(struct scsi_cmnd *cmd)
|
||||
static inline blk_status_t sd_zbc_setup_reset_cmnd(struct scsi_cmnd *cmd)
|
||||
{
|
||||
return BLKPREP_INVALID;
|
||||
return BLK_STS_TARGET;
|
||||
}
|
||||
|
||||
static inline void sd_zbc_complete(struct scsi_cmnd *cmd,
|
||||
|
|
|
|||
|
|
@ -185,7 +185,7 @@ static inline sector_t sd_zbc_zone_sectors(struct scsi_disk *sdkp)
|
|||
*
|
||||
* Called from sd_init_command() for a REQ_OP_ZONE_RESET request.
|
||||
*/
|
||||
int sd_zbc_setup_reset_cmnd(struct scsi_cmnd *cmd)
|
||||
blk_status_t sd_zbc_setup_reset_cmnd(struct scsi_cmnd *cmd)
|
||||
{
|
||||
struct request *rq = cmd->request;
|
||||
struct scsi_disk *sdkp = scsi_disk(rq->rq_disk);
|
||||
|
|
@ -194,14 +194,14 @@ int sd_zbc_setup_reset_cmnd(struct scsi_cmnd *cmd)
|
|||
|
||||
if (!sd_is_zoned(sdkp))
|
||||
/* Not a zoned device */
|
||||
return BLKPREP_KILL;
|
||||
return BLK_STS_IOERR;
|
||||
|
||||
if (sdkp->device->changed)
|
||||
return BLKPREP_KILL;
|
||||
return BLK_STS_IOERR;
|
||||
|
||||
if (sector & (sd_zbc_zone_sectors(sdkp) - 1))
|
||||
/* Unaligned request */
|
||||
return BLKPREP_KILL;
|
||||
return BLK_STS_IOERR;
|
||||
|
||||
cmd->cmd_len = 16;
|
||||
memset(cmd->cmnd, 0, cmd->cmd_len);
|
||||
|
|
@ -214,7 +214,7 @@ int sd_zbc_setup_reset_cmnd(struct scsi_cmnd *cmd)
|
|||
cmd->transfersize = 0;
|
||||
cmd->allowed = 0;
|
||||
|
||||
return BLKPREP_OK;
|
||||
return BLK_STS_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -1390,7 +1390,7 @@ sg_rq_end_io(struct request *rq, blk_status_t status)
|
|||
*/
|
||||
srp->rq = NULL;
|
||||
scsi_req_free_cmd(scsi_req(rq));
|
||||
__blk_put_request(rq->q, rq);
|
||||
blk_put_request(rq);
|
||||
|
||||
write_lock_irqsave(&sfp->rq_list_lock, iflags);
|
||||
if (unlikely(srp->orphan)) {
|
||||
|
|
|
|||
|
|
@ -5319,7 +5319,8 @@ static int pqi_map_queues(struct Scsi_Host *shost)
|
|||
{
|
||||
struct pqi_ctrl_info *ctrl_info = shost_to_hba(shost);
|
||||
|
||||
return blk_mq_pci_map_queues(&shost->tag_set, ctrl_info->pci_dev, 0);
|
||||
return blk_mq_pci_map_queues(&shost->tag_set.map[0],
|
||||
ctrl_info->pci_dev, 0);
|
||||
}
|
||||
|
||||
static int pqi_getpciinfo_ioctl(struct pqi_ctrl_info *ctrl_info,
|
||||
|
|
|
|||
|
|
@ -80,7 +80,7 @@ MODULE_ALIAS_SCSI_DEVICE(TYPE_WORM);
|
|||
static DEFINE_MUTEX(sr_mutex);
|
||||
static int sr_probe(struct device *);
|
||||
static int sr_remove(struct device *);
|
||||
static int sr_init_command(struct scsi_cmnd *SCpnt);
|
||||
static blk_status_t sr_init_command(struct scsi_cmnd *SCpnt);
|
||||
static int sr_done(struct scsi_cmnd *);
|
||||
static int sr_runtime_suspend(struct device *dev);
|
||||
|
||||
|
|
@ -384,22 +384,22 @@ static int sr_done(struct scsi_cmnd *SCpnt)
|
|||
return good_bytes;
|
||||
}
|
||||
|
||||
static int sr_init_command(struct scsi_cmnd *SCpnt)
|
||||
static blk_status_t sr_init_command(struct scsi_cmnd *SCpnt)
|
||||
{
|
||||
int block = 0, this_count, s_size;
|
||||
struct scsi_cd *cd;
|
||||
struct request *rq = SCpnt->request;
|
||||
int ret;
|
||||
blk_status_t ret;
|
||||
|
||||
ret = scsi_init_io(SCpnt);
|
||||
if (ret != BLKPREP_OK)
|
||||
if (ret != BLK_STS_OK)
|
||||
goto out;
|
||||
WARN_ON_ONCE(SCpnt != rq->special);
|
||||
cd = scsi_cd(rq->rq_disk);
|
||||
|
||||
/* from here on until we're complete, any goto out
|
||||
* is used for a killable error condition */
|
||||
ret = BLKPREP_KILL;
|
||||
ret = BLK_STS_IOERR;
|
||||
|
||||
SCSI_LOG_HLQUEUE(1, scmd_printk(KERN_INFO, SCpnt,
|
||||
"Doing sr request, block = %d\n", block));
|
||||
|
|
@ -516,7 +516,7 @@ static int sr_init_command(struct scsi_cmnd *SCpnt)
|
|||
* This indicates that the command is ready from our end to be
|
||||
* queued.
|
||||
*/
|
||||
ret = BLKPREP_OK;
|
||||
ret = BLK_STS_OK;
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -530,7 +530,7 @@ static void st_scsi_execute_end(struct request *req, blk_status_t status)
|
|||
complete(SRpnt->waiting);
|
||||
|
||||
blk_rq_unmap_user(tmp);
|
||||
__blk_put_request(req->q, req);
|
||||
blk_put_request(req);
|
||||
}
|
||||
|
||||
static int st_scsi_execute(struct st_request *SRpnt, const unsigned char *cmd,
|
||||
|
|
|
|||
|
|
@ -157,7 +157,7 @@ void ufs_bsg_remove(struct ufs_hba *hba)
|
|||
if (!hba->bsg_queue)
|
||||
return;
|
||||
|
||||
bsg_unregister_queue(hba->bsg_queue);
|
||||
bsg_remove_queue(hba->bsg_queue);
|
||||
|
||||
device_del(bsg_dev);
|
||||
put_device(bsg_dev);
|
||||
|
|
@ -193,7 +193,7 @@ int ufs_bsg_probe(struct ufs_hba *hba)
|
|||
if (ret)
|
||||
goto out;
|
||||
|
||||
q = bsg_setup_queue(bsg_dev, dev_name(bsg_dev), ufs_bsg_request, 0);
|
||||
q = bsg_setup_queue(bsg_dev, dev_name(bsg_dev), ufs_bsg_request, NULL, 0);
|
||||
if (IS_ERR(q)) {
|
||||
ret = PTR_ERR(q);
|
||||
goto out;
|
||||
|
|
|
|||
|
|
@ -719,8 +719,9 @@ static void virtscsi_target_destroy(struct scsi_target *starget)
|
|||
static int virtscsi_map_queues(struct Scsi_Host *shost)
|
||||
{
|
||||
struct virtio_scsi *vscsi = shost_priv(shost);
|
||||
struct blk_mq_queue_map *qmap = &shost->tag_set.map[0];
|
||||
|
||||
return blk_mq_virtio_map_queues(&shost->tag_set, vscsi->vdev, 2);
|
||||
return blk_mq_virtio_map_queues(qmap, vscsi->vdev, 2);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
Loading…
Reference in a new issue