bsg: pass in desired timeout handler
This will ease in the conversion to blk-mq, where we can't set a timeout handler after queue init. Cc: Johannes Thumshirn <jthumshirn@suse.de> Cc: linux-scsi@vger.kernel.org Reviewed-by: Hannes Reinecke <hare@suse.com> Tested-by: Benjamin Block <bblock@linux.vnet.ibm.com> Tested-by: Ming Lei <ming.lei@redhat.com> Reviewed-by: Omar Sandoval <osandov@fb.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
Родитель
583d6535cb
Коммит
aae3b069d5
|
@ -304,7 +304,7 @@ static void bsg_exit_rq(struct request_queue *q, struct request *req)
|
||||||
* @dd_job_size: size of LLD data needed for each job
|
* @dd_job_size: size of LLD data needed for each job
|
||||||
*/
|
*/
|
||||||
struct request_queue *bsg_setup_queue(struct device *dev, const char *name,
|
struct request_queue *bsg_setup_queue(struct device *dev, const char *name,
|
||||||
bsg_job_fn *job_fn, int dd_job_size)
|
bsg_job_fn *job_fn, rq_timed_out_fn *timeout, int dd_job_size)
|
||||||
{
|
{
|
||||||
struct request_queue *q;
|
struct request_queue *q;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -327,6 +327,7 @@ struct request_queue *bsg_setup_queue(struct device *dev, const char *name,
|
||||||
blk_queue_flag_set(QUEUE_FLAG_BIDI, q);
|
blk_queue_flag_set(QUEUE_FLAG_BIDI, q);
|
||||||
blk_queue_softirq_done(q, bsg_softirq_done);
|
blk_queue_softirq_done(q, bsg_softirq_done);
|
||||||
blk_queue_rq_timeout(q, BLK_DEFAULT_SG_TIMEOUT);
|
blk_queue_rq_timeout(q, BLK_DEFAULT_SG_TIMEOUT);
|
||||||
|
blk_queue_rq_timed_out(q, timeout);
|
||||||
|
|
||||||
ret = bsg_register_queue(q, dev, name, &bsg_transport_ops);
|
ret = bsg_register_queue(q, dev, name, &bsg_transport_ops);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
|
|
@ -3780,7 +3780,8 @@ fc_bsg_hostadd(struct Scsi_Host *shost, struct fc_host_attrs *fc_host)
|
||||||
snprintf(bsg_name, sizeof(bsg_name),
|
snprintf(bsg_name, sizeof(bsg_name),
|
||||||
"fc_host%d", shost->host_no);
|
"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)) {
|
if (IS_ERR(q)) {
|
||||||
dev_err(dev,
|
dev_err(dev,
|
||||||
"fc_host%d: bsg interface failed to initialize - setup queue\n",
|
"fc_host%d: bsg interface failed to initialize - setup queue\n",
|
||||||
|
@ -3788,7 +3789,6 @@ fc_bsg_hostadd(struct Scsi_Host *shost, struct fc_host_attrs *fc_host)
|
||||||
return PTR_ERR(q);
|
return PTR_ERR(q);
|
||||||
}
|
}
|
||||||
__scsi_init_queue(shost, 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);
|
blk_queue_rq_timeout(q, FC_DEFAULT_BSG_TIMEOUT);
|
||||||
fc_host->rqst_q = q;
|
fc_host->rqst_q = q;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -3826,14 +3826,13 @@ fc_bsg_rportadd(struct Scsi_Host *shost, struct fc_rport *rport)
|
||||||
return -ENOTSUPP;
|
return -ENOTSUPP;
|
||||||
|
|
||||||
q = bsg_setup_queue(dev, dev_name(dev), fc_bsg_dispatch,
|
q = bsg_setup_queue(dev, dev_name(dev), fc_bsg_dispatch,
|
||||||
i->f->dd_bsg_size);
|
fc_bsg_job_timeout, i->f->dd_bsg_size);
|
||||||
if (IS_ERR(q)) {
|
if (IS_ERR(q)) {
|
||||||
dev_err(dev, "failed to setup bsg queue\n");
|
dev_err(dev, "failed to setup bsg queue\n");
|
||||||
return PTR_ERR(q);
|
return PTR_ERR(q);
|
||||||
}
|
}
|
||||||
__scsi_init_queue(shost, q);
|
__scsi_init_queue(shost, q);
|
||||||
blk_queue_prep_rq(q, fc_bsg_rport_prep);
|
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);
|
blk_queue_rq_timeout(q, BLK_DEFAULT_SG_TIMEOUT);
|
||||||
rport->rqst_q = q;
|
rport->rqst_q = q;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -1542,7 +1542,7 @@ iscsi_bsg_host_add(struct Scsi_Host *shost, struct iscsi_cls_host *ihost)
|
||||||
return -ENOTSUPP;
|
return -ENOTSUPP;
|
||||||
|
|
||||||
snprintf(bsg_name, sizeof(bsg_name), "iscsi_host%d", shost->host_no);
|
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)) {
|
if (IS_ERR(q)) {
|
||||||
shost_printk(KERN_ERR, shost, "bsg interface failed to "
|
shost_printk(KERN_ERR, shost, "bsg interface failed to "
|
||||||
"initialize - no request queue\n");
|
"initialize - no request queue\n");
|
||||||
|
|
|
@ -198,7 +198,7 @@ static int sas_bsg_initialize(struct Scsi_Host *shost, struct sas_rphy *rphy)
|
||||||
|
|
||||||
if (rphy) {
|
if (rphy) {
|
||||||
q = bsg_setup_queue(&rphy->dev, dev_name(&rphy->dev),
|
q = bsg_setup_queue(&rphy->dev, dev_name(&rphy->dev),
|
||||||
sas_smp_dispatch, 0);
|
sas_smp_dispatch, NULL, 0);
|
||||||
if (IS_ERR(q))
|
if (IS_ERR(q))
|
||||||
return PTR_ERR(q);
|
return PTR_ERR(q);
|
||||||
rphy->q = 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);
|
snprintf(name, sizeof(name), "sas_host%d", shost->host_no);
|
||||||
q = bsg_setup_queue(&shost->shost_gendev, name,
|
q = bsg_setup_queue(&shost->shost_gendev, name,
|
||||||
sas_smp_dispatch, 0);
|
sas_smp_dispatch, NULL, 0);
|
||||||
if (IS_ERR(q))
|
if (IS_ERR(q))
|
||||||
return PTR_ERR(q);
|
return PTR_ERR(q);
|
||||||
to_sas_host_attrs(shost)->q = q;
|
to_sas_host_attrs(shost)->q = q;
|
||||||
|
|
|
@ -193,7 +193,7 @@ int ufs_bsg_probe(struct ufs_hba *hba)
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out;
|
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)) {
|
if (IS_ERR(q)) {
|
||||||
ret = PTR_ERR(q);
|
ret = PTR_ERR(q);
|
||||||
goto out;
|
goto out;
|
||||||
|
|
|
@ -72,7 +72,7 @@ struct bsg_job {
|
||||||
void bsg_job_done(struct bsg_job *job, int result,
|
void bsg_job_done(struct bsg_job *job, int result,
|
||||||
unsigned int reply_payload_rcv_len);
|
unsigned int reply_payload_rcv_len);
|
||||||
struct request_queue *bsg_setup_queue(struct device *dev, const char *name,
|
struct request_queue *bsg_setup_queue(struct device *dev, const char *name,
|
||||||
bsg_job_fn *job_fn, int dd_job_size);
|
bsg_job_fn *job_fn, rq_timed_out_fn *timeout, int dd_job_size);
|
||||||
void bsg_job_put(struct bsg_job *job);
|
void bsg_job_put(struct bsg_job *job);
|
||||||
int __must_check bsg_job_get(struct bsg_job *job);
|
int __must_check bsg_job_get(struct bsg_job *job);
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче