mirror of
https://github.com/torvalds/linux.git
synced 2024-12-27 05:11:48 +00:00
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:
parent
e9c787e65c
commit
8ae94eb65b
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user