diff options
| -rw-r--r-- | block/bsg-lib.c | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/block/bsg-lib.c b/block/bsg-lib.c index dbddff8174e5..15d25ccd51a5 100644 --- a/block/bsg-lib.c +++ b/block/bsg-lib.c | |||
| @@ -207,20 +207,34 @@ static int bsg_init_rq(struct request_queue *q, struct request *req, gfp_t gfp) | |||
| 207 | struct bsg_job *job = blk_mq_rq_to_pdu(req); | 207 | struct bsg_job *job = blk_mq_rq_to_pdu(req); |
| 208 | struct scsi_request *sreq = &job->sreq; | 208 | struct scsi_request *sreq = &job->sreq; |
| 209 | 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 | |||
| 210 | memset(job, 0, sizeof(*job)); | 227 | memset(job, 0, sizeof(*job)); |
| 211 | 228 | ||
| 212 | scsi_req_init(sreq); | 229 | scsi_req_init(sreq); |
| 230 | |||
| 231 | sreq->sense = sense; | ||
| 213 | sreq->sense_len = SCSI_SENSE_BUFFERSIZE; | 232 | sreq->sense_len = SCSI_SENSE_BUFFERSIZE; |
| 214 | sreq->sense = kzalloc(sreq->sense_len, gfp); | ||
| 215 | if (!sreq->sense) | ||
| 216 | return -ENOMEM; | ||
| 217 | 233 | ||
| 218 | job->req = req; | 234 | job->req = req; |
| 219 | job->reply = sreq->sense; | 235 | job->reply = sense; |
| 220 | job->reply_len = sreq->sense_len; | 236 | job->reply_len = sreq->sense_len; |
| 221 | job->dd_data = job + 1; | 237 | job->dd_data = job + 1; |
| 222 | |||
| 223 | return 0; | ||
| 224 | } | 238 | } |
| 225 | 239 | ||
| 226 | 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) |
| @@ -251,6 +265,7 @@ struct request_queue *bsg_setup_queue(struct device *dev, const char *name, | |||
| 251 | q->cmd_size = sizeof(struct bsg_job) + dd_job_size; | 265 | q->cmd_size = sizeof(struct bsg_job) + dd_job_size; |
| 252 | q->init_rq_fn = bsg_init_rq; | 266 | q->init_rq_fn = bsg_init_rq; |
| 253 | q->exit_rq_fn = bsg_exit_rq; | 267 | q->exit_rq_fn = bsg_exit_rq; |
| 268 | q->initialize_rq_fn = bsg_initialize_rq; | ||
| 254 | q->request_fn = bsg_request_fn; | 269 | q->request_fn = bsg_request_fn; |
| 255 | 270 | ||
| 256 | ret = blk_init_allocated_queue(q); | 271 | ret = blk_init_allocated_queue(q); |
