bsg: pass in desired timeout handler
authorJens Axboe <axboe@kernel.dk>
Fri, 26 Oct 2018 17:26:25 +0000 (11:26 -0600)
committerJens Axboe <axboe@kernel.dk>
Wed, 7 Nov 2018 20:42:32 +0000 (13:42 -0700)
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>
block/bsg-lib.c
drivers/scsi/scsi_transport_fc.c
drivers/scsi/scsi_transport_iscsi.c
drivers/scsi/scsi_transport_sas.c
drivers/scsi/ufs/ufs_bsg.c
include/linux/bsg-lib.h

index f3501cdaf1a654ab0cb2c1674304c8a30f5291e3..1da011ec04e67cf797c3e2dd9d2039a6e00d08b4 100644 (file)
@@ -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
  */
 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;
        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_softirq_done(q, bsg_softirq_done);
        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);
        if (ret) {
index 381668fa135dcec97462eaa6877671c52b9f66b8..98aaffb4c715b919f9d8b82903177bb7c6462e70 100644 (file)
@@ -3780,7 +3780,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,7 +3789,6 @@ 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;
@@ -3826,14 +3826,13 @@ fc_bsg_rportadd(struct Scsi_Host *shost, struct fc_rport *rport)
                return -ENOTSUPP;
 
        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)) {
                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;
index 6fd2fe210fc324b2bde0f1a72bd79f2939b3bca9..26b11a775be905dbb61a11a615fc1a3745958187 100644 (file)
@@ -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");
index 0a165b2b3e81152a022c0e7cdfa7fe5d837c57db..cf6d47891d773fd33b8881eca19b58258e4ff3eb 100644 (file)
@@ -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;
index e5f8e54bf6442f708f15ddb2b47eed2dc7adcf6b..dd0e9700a74cc3d01648ca46956ad29508c9491d 100644 (file)
@@ -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;
index 6aeaf64726651916d3ffc0768226917fa86f66c2..b13ae143e7ef5c6212d997bc5cbe2a027a17bc03 100644 (file)
@@ -72,7 +72,7 @@ struct bsg_job {
 void bsg_job_done(struct bsg_job *job, int result,
                  unsigned int reply_payload_rcv_len);
 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);
 int __must_check bsg_job_get(struct bsg_job *job);