Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bf0f2d38 authored by Johannes Thumshirn's avatar Johannes Thumshirn Committed by Martin K. Petersen
Browse files

block: add reference counting for struct bsg_job



Add reference counting to 'struct bsg_job' so we can implement a reuqest
timeout handler for bsg_jobs, which is needed for Fibre Channel.

Signed-off-by: default avatarJohannes Thumshirn <jthumshirn@suse.de>
Reviewed-by: default avatarHannes Reinecke <hare@suse.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent ad7660cc
Loading
Loading
Loading
Loading
+5 −2
Original line number Original line Diff line number Diff line
@@ -32,8 +32,10 @@
 * bsg_destroy_job - routine to teardown/delete a bsg job
 * bsg_destroy_job - routine to teardown/delete a bsg job
 * @job: bsg_job that is to be torn down
 * @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);

	put_device(job->dev);	/* release reference for the request */
	put_device(job->dev);	/* release reference for the request */


	kfree(job->request_payload.sg_list);
	kfree(job->request_payload.sg_list);
@@ -84,7 +86,7 @@ static void bsg_softirq_done(struct request *rq)
	struct bsg_job *job = rq->special;
	struct bsg_job *job = rq->special;


	blk_end_request_all(rq, rq->errors);
	blk_end_request_all(rq, rq->errors);
	bsg_destroy_job(job);
	kref_put(&job->kref, bsg_destroy_job);
}
}


static int bsg_map_buffer(struct bsg_buffer *buf, struct request *req)
static int bsg_map_buffer(struct bsg_buffer *buf, struct request *req)
@@ -142,6 +144,7 @@ static int bsg_create_job(struct device *dev, struct request *req)
	job->dev = dev;
	job->dev = dev;
	/* take a reference for the request */
	/* take a reference for the request */
	get_device(job->dev);
	get_device(job->dev);
	kref_init(&job->kref);
	return 0;
	return 0;


failjob_rls_rqst_payload:
failjob_rls_rqst_payload:
+2 −0
Original line number Original line Diff line number Diff line
@@ -40,6 +40,8 @@ struct bsg_job {
	struct device *dev;
	struct device *dev;
	struct request *req;
	struct request *req;


	struct kref kref;

	/* Transport/driver specific request/reply structs */
	/* Transport/driver specific request/reply structs */
	void *request;
	void *request;
	void *reply;
	void *reply;