block/bsg: move queue creation into bsg_setup_queue

Simply the boilerplate code needed for bsg nodes a bit.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: Jens Axboe <axboe@fb.com>
This commit is contained in:
Christoph Hellwig 2017-01-03 15:25:02 +03:00 committed by Jens Axboe
parent e9c787e65c
commit 8ae94eb65b
4 changed files with 25 additions and 52 deletions

View File

@ -177,7 +177,7 @@ failjob_rls_job:
* *
* Drivers/subsys should pass this to the queue init function. * Drivers/subsys should pass this to the queue init function.
*/ */
void bsg_request_fn(struct request_queue *q) static void bsg_request_fn(struct request_queue *q)
__releases(q->queue_lock) __releases(q->queue_lock)
__acquires(q->queue_lock) __acquires(q->queue_lock)
{ {
@ -214,24 +214,24 @@ void bsg_request_fn(struct request_queue *q)
put_device(dev); put_device(dev);
spin_lock_irq(q->queue_lock); spin_lock_irq(q->queue_lock);
} }
EXPORT_SYMBOL_GPL(bsg_request_fn);
/** /**
* bsg_setup_queue - Create and add the bsg hooks so we can receive requests * bsg_setup_queue - Create and add the bsg hooks so we can receive requests
* @dev: device to attach bsg device to * @dev: device to attach bsg device to
* @q: request queue setup by caller
* @name: device to give bsg device * @name: device to give bsg device
* @job_fn: bsg job handler * @job_fn: bsg job handler
* @dd_job_size: size of LLD data needed for each job * @dd_job_size: size of LLD data needed for each job
*
* The caller should have setup the reuqest queue with bsg_request_fn
* as the request_fn.
*/ */
int bsg_setup_queue(struct device *dev, struct request_queue *q, struct request_queue *bsg_setup_queue(struct device *dev, char *name,
char *name, bsg_job_fn *job_fn, int dd_job_size) bsg_job_fn *job_fn, int dd_job_size)
{ {
struct request_queue *q;
int ret; int ret;
q = blk_init_queue(bsg_request_fn, NULL);
if (!q)
return ERR_PTR(-ENOMEM);
q->queuedata = dev; q->queuedata = dev;
q->bsg_job_size = dd_job_size; q->bsg_job_size = dd_job_size;
q->bsg_job_fn = job_fn; q->bsg_job_fn = job_fn;
@ -243,9 +243,10 @@ int bsg_setup_queue(struct device *dev, struct request_queue *q,
if (ret) { if (ret) {
printk(KERN_ERR "%s: bsg interface failed to " printk(KERN_ERR "%s: bsg interface failed to "
"initialize - register queue\n", dev->kobj.name); "initialize - register queue\n", dev->kobj.name);
return ret; blk_cleanup_queue(q);
return ERR_PTR(ret);
} }
return 0; return q;
} }
EXPORT_SYMBOL_GPL(bsg_setup_queue); EXPORT_SYMBOL_GPL(bsg_setup_queue);

View File

@ -3765,7 +3765,6 @@ fc_bsg_hostadd(struct Scsi_Host *shost, struct fc_host_attrs *fc_host)
struct device *dev = &shost->shost_gendev; struct device *dev = &shost->shost_gendev;
struct fc_internal *i = to_fc_internal(shost->transportt); struct fc_internal *i = to_fc_internal(shost->transportt);
struct request_queue *q; struct request_queue *q;
int err;
char bsg_name[20]; char bsg_name[20];
fc_host->rqst_q = NULL; fc_host->rqst_q = NULL;
@ -3776,24 +3775,14 @@ 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 = blk_init_queue(bsg_request_fn, NULL); q = bsg_setup_queue(dev, bsg_name, fc_bsg_dispatch, i->f->dd_bsg_size);
if (!q) { if (IS_ERR(q)) {
dev_err(dev,
"fc_host%d: bsg interface failed to initialize - no request queue\n",
shost->host_no);
return -ENOMEM;
}
__scsi_init_queue(shost, q);
err = bsg_setup_queue(dev, q, bsg_name, fc_bsg_dispatch,
i->f->dd_bsg_size);
if (err) {
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",
shost->host_no); shost->host_no);
blk_cleanup_queue(q); return PTR_ERR(q);
return err;
} }
__scsi_init_queue(shost, q);
blk_queue_rq_timed_out(q, fc_bsg_job_timeout); 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;
@ -3825,27 +3814,18 @@ fc_bsg_rportadd(struct Scsi_Host *shost, struct fc_rport *rport)
struct device *dev = &rport->dev; struct device *dev = &rport->dev;
struct fc_internal *i = to_fc_internal(shost->transportt); struct fc_internal *i = to_fc_internal(shost->transportt);
struct request_queue *q; struct request_queue *q;
int err;
rport->rqst_q = NULL; rport->rqst_q = NULL;
if (!i->f->bsg_request) if (!i->f->bsg_request)
return -ENOTSUPP; return -ENOTSUPP;
q = blk_init_queue(bsg_request_fn, NULL); q = bsg_setup_queue(dev, NULL, fc_bsg_dispatch, i->f->dd_bsg_size);
if (!q) { if (IS_ERR(q)) {
dev_err(dev, "bsg interface failed to initialize - no request queue\n");
return -ENOMEM;
}
__scsi_init_queue(shost, q);
err = bsg_setup_queue(dev, q, NULL, fc_bsg_dispatch, i->f->dd_bsg_size);
if (err) {
dev_err(dev, "failed to setup bsg queue\n"); dev_err(dev, "failed to setup bsg queue\n");
blk_cleanup_queue(q); return PTR_ERR(q);
return err;
} }
__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_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);

View File

@ -1537,25 +1537,18 @@ iscsi_bsg_host_add(struct Scsi_Host *shost, struct iscsi_cls_host *ihost)
struct iscsi_internal *i = to_iscsi_internal(shost->transportt); struct iscsi_internal *i = to_iscsi_internal(shost->transportt);
struct request_queue *q; struct request_queue *q;
char bsg_name[20]; char bsg_name[20];
int ret;
if (!i->iscsi_transport->bsg_request) if (!i->iscsi_transport->bsg_request)
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 = blk_init_queue(bsg_request_fn, NULL); if (IS_ERR(q)) {
if (!q)
return -ENOMEM;
__scsi_init_queue(shost, q);
ret = bsg_setup_queue(dev, q, bsg_name, iscsi_bsg_host_dispatch, 0);
if (ret) {
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");
blk_cleanup_queue(q); return PTR_ERR(q);
return ret;
} }
__scsi_init_queue(shost, q);
ihost->bsg_q = q; ihost->bsg_q = q;
return 0; return 0;

View File

@ -66,9 +66,8 @@ 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);
int bsg_setup_queue(struct device *dev, struct request_queue *q, char *name, struct request_queue *bsg_setup_queue(struct device *dev, char *name,
bsg_job_fn *job_fn, int dd_job_size); bsg_job_fn *job_fn, int dd_job_size);
void bsg_request_fn(struct request_queue *q);
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);