diff options
Diffstat (limited to 'block')
-rw-r--r-- | block/blk-mq-cpumap.c | 1 | ||||
-rw-r--r-- | block/blk-mq.h | 1 | ||||
-rw-r--r-- | block/bsg-lib.c | 23 |
3 files changed, 21 insertions, 4 deletions
diff --git a/block/blk-mq-cpumap.c b/block/blk-mq-cpumap.c index 19b1d9c5f07e..8e61e8640e17 100644 --- a/block/blk-mq-cpumap.c +++ b/block/blk-mq-cpumap.c @@ -87,6 +87,7 @@ int blk_mq_map_queues(struct blk_mq_tag_set *set) free_cpumask_var(cpus); return 0; } +EXPORT_SYMBOL_GPL(blk_mq_map_queues); /* * We have no quick way of doing reverse lookups. This is only used at diff --git a/block/blk-mq.h b/block/blk-mq.h index 3a54dd32a6fc..63e9116cddbd 100644 --- a/block/blk-mq.h +++ b/block/blk-mq.h @@ -42,7 +42,6 @@ void blk_mq_disable_hotplug(void); /* * CPU -> queue mappings */ -int blk_mq_map_queues(struct blk_mq_tag_set *set); extern int blk_mq_hw_queue_to_node(unsigned int *map, unsigned int); static inline struct blk_mq_hw_ctx *blk_mq_map_queue(struct request_queue *q, diff --git a/block/bsg-lib.c b/block/bsg-lib.c index b2a61e3ecb14..9d652a992316 100644 --- a/block/bsg-lib.c +++ b/block/bsg-lib.c @@ -32,8 +32,13 @@ * bsg_destroy_job - routine to teardown/delete a bsg job * @job: bsg_job that is to be torn down */ -static void bsg_destroy_job(struct bsg_job *job) +static void bsg_destroy_job(struct kref *kref) { + struct bsg_job *job = container_of(kref, struct bsg_job, kref); + struct request *rq = job->req; + + blk_end_request_all(rq, rq->errors); + put_device(job->dev); /* release reference for the request */ kfree(job->request_payload.sg_list); @@ -41,6 +46,18 @@ static void bsg_destroy_job(struct bsg_job *job) kfree(job); } +void bsg_job_put(struct bsg_job *job) +{ + kref_put(&job->kref, bsg_destroy_job); +} +EXPORT_SYMBOL_GPL(bsg_job_put); + +int bsg_job_get(struct bsg_job *job) +{ + return kref_get_unless_zero(&job->kref); +} +EXPORT_SYMBOL_GPL(bsg_job_get); + /** * bsg_job_done - completion routine for bsg requests * @job: bsg_job that is complete @@ -83,8 +100,7 @@ static void bsg_softirq_done(struct request *rq) { struct bsg_job *job = rq->special; - blk_end_request_all(rq, rq->errors); - bsg_destroy_job(job); + bsg_job_put(job); } static int bsg_map_buffer(struct bsg_buffer *buf, struct request *req) @@ -142,6 +158,7 @@ static int bsg_create_job(struct device *dev, struct request *req) job->dev = dev; /* take a reference for the request */ get_device(job->dev); + kref_init(&job->kref); return 0; failjob_rls_rqst_payload: |