diff options
Diffstat (limited to 'block/bsg-lib.c')
-rw-r--r-- | block/bsg-lib.c | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/block/bsg-lib.c b/block/bsg-lib.c index c82408c7cc3c..15d25ccd51a5 100644 --- a/block/bsg-lib.c +++ b/block/bsg-lib.c | |||
@@ -154,7 +154,6 @@ static int bsg_prepare_job(struct device *dev, struct request *req) | |||
154 | failjob_rls_rqst_payload: | 154 | failjob_rls_rqst_payload: |
155 | kfree(job->request_payload.sg_list); | 155 | kfree(job->request_payload.sg_list); |
156 | failjob_rls_job: | 156 | failjob_rls_job: |
157 | kfree(job); | ||
158 | return -ENOMEM; | 157 | return -ENOMEM; |
159 | } | 158 | } |
160 | 159 | ||
@@ -208,20 +207,34 @@ static int bsg_init_rq(struct request_queue *q, struct request *req, gfp_t gfp) | |||
208 | struct bsg_job *job = blk_mq_rq_to_pdu(req); | 207 | struct bsg_job *job = blk_mq_rq_to_pdu(req); |
209 | struct scsi_request *sreq = &job->sreq; | 208 | struct scsi_request *sreq = &job->sreq; |
210 | 209 | ||
210 | /* called right after the request is allocated for the request_queue */ | ||
211 | |||
212 | sreq->sense = kzalloc(SCSI_SENSE_BUFFERSIZE, gfp); | ||
213 | if (!sreq->sense) | ||
214 | return -ENOMEM; | ||
215 | |||
216 | return 0; | ||
217 | } | ||
218 | |||
219 | static void bsg_initialize_rq(struct request *req) | ||
220 | { | ||
221 | struct bsg_job *job = blk_mq_rq_to_pdu(req); | ||
222 | struct scsi_request *sreq = &job->sreq; | ||
223 | void *sense = sreq->sense; | ||
224 | |||
225 | /* called right before the request is given to the request_queue user */ | ||
226 | |||
211 | memset(job, 0, sizeof(*job)); | 227 | memset(job, 0, sizeof(*job)); |
212 | 228 | ||
213 | scsi_req_init(sreq); | 229 | scsi_req_init(sreq); |
230 | |||
231 | sreq->sense = sense; | ||
214 | sreq->sense_len = SCSI_SENSE_BUFFERSIZE; | 232 | sreq->sense_len = SCSI_SENSE_BUFFERSIZE; |
215 | sreq->sense = kzalloc(sreq->sense_len, gfp); | ||
216 | if (!sreq->sense) | ||
217 | return -ENOMEM; | ||
218 | 233 | ||
219 | job->req = req; | 234 | job->req = req; |
220 | job->reply = sreq->sense; | 235 | job->reply = sense; |
221 | job->reply_len = sreq->sense_len; | 236 | job->reply_len = sreq->sense_len; |
222 | job->dd_data = job + 1; | 237 | job->dd_data = job + 1; |
223 | |||
224 | return 0; | ||
225 | } | 238 | } |
226 | 239 | ||
227 | static void bsg_exit_rq(struct request_queue *q, struct request *req) | 240 | static void bsg_exit_rq(struct request_queue *q, struct request *req) |
@@ -252,6 +265,7 @@ struct request_queue *bsg_setup_queue(struct device *dev, const char *name, | |||
252 | q->cmd_size = sizeof(struct bsg_job) + dd_job_size; | 265 | q->cmd_size = sizeof(struct bsg_job) + dd_job_size; |
253 | q->init_rq_fn = bsg_init_rq; | 266 | q->init_rq_fn = bsg_init_rq; |
254 | q->exit_rq_fn = bsg_exit_rq; | 267 | q->exit_rq_fn = bsg_exit_rq; |
268 | q->initialize_rq_fn = bsg_initialize_rq; | ||
255 | q->request_fn = bsg_request_fn; | 269 | q->request_fn = bsg_request_fn; |
256 | 270 | ||
257 | ret = blk_init_allocated_queue(q); | 271 | ret = blk_init_allocated_queue(q); |