diff options
Diffstat (limited to 'drivers/scsi/osd/osd_initiator.c')
-rw-r--r-- | drivers/scsi/osd/osd_initiator.c | 72 |
1 files changed, 25 insertions, 47 deletions
diff --git a/drivers/scsi/osd/osd_initiator.c b/drivers/scsi/osd/osd_initiator.c index 1ce6b24abab..5776b2ab6b1 100644 --- a/drivers/scsi/osd/osd_initiator.c +++ b/drivers/scsi/osd/osd_initiator.c | |||
@@ -889,26 +889,6 @@ int osd_req_add_set_attr_list(struct osd_request *or, | |||
889 | } | 889 | } |
890 | EXPORT_SYMBOL(osd_req_add_set_attr_list); | 890 | EXPORT_SYMBOL(osd_req_add_set_attr_list); |
891 | 891 | ||
892 | static int _append_map_kern(struct request *req, | ||
893 | void *buff, unsigned len, gfp_t flags) | ||
894 | { | ||
895 | struct bio *bio; | ||
896 | int ret; | ||
897 | |||
898 | bio = bio_map_kern(req->q, buff, len, flags); | ||
899 | if (IS_ERR(bio)) { | ||
900 | OSD_ERR("Failed bio_map_kern(%p, %d) => %ld\n", buff, len, | ||
901 | PTR_ERR(bio)); | ||
902 | return PTR_ERR(bio); | ||
903 | } | ||
904 | ret = blk_rq_append_bio(req->q, req, bio); | ||
905 | if (ret) { | ||
906 | OSD_ERR("Failed blk_rq_append_bio(%p) => %d\n", bio, ret); | ||
907 | bio_put(bio); | ||
908 | } | ||
909 | return ret; | ||
910 | } | ||
911 | |||
912 | static int _req_append_segment(struct osd_request *or, | 892 | static int _req_append_segment(struct osd_request *or, |
913 | unsigned padding, struct _osd_req_data_segment *seg, | 893 | unsigned padding, struct _osd_req_data_segment *seg, |
914 | struct _osd_req_data_segment *last_seg, struct _osd_io_info *io) | 894 | struct _osd_req_data_segment *last_seg, struct _osd_io_info *io) |
@@ -924,14 +904,14 @@ static int _req_append_segment(struct osd_request *or, | |||
924 | else | 904 | else |
925 | pad_buff = io->pad_buff; | 905 | pad_buff = io->pad_buff; |
926 | 906 | ||
927 | ret = _append_map_kern(io->req, pad_buff, padding, | 907 | ret = blk_rq_map_kern(io->req->q, io->req, pad_buff, padding, |
928 | or->alloc_flags); | 908 | or->alloc_flags); |
929 | if (ret) | 909 | if (ret) |
930 | return ret; | 910 | return ret; |
931 | io->total_bytes += padding; | 911 | io->total_bytes += padding; |
932 | } | 912 | } |
933 | 913 | ||
934 | ret = _append_map_kern(io->req, seg->buff, seg->total_bytes, | 914 | ret = blk_rq_map_kern(io->req->q, io->req, seg->buff, seg->total_bytes, |
935 | or->alloc_flags); | 915 | or->alloc_flags); |
936 | if (ret) | 916 | if (ret) |
937 | return ret; | 917 | return ret; |
@@ -1293,6 +1273,21 @@ static int _osd_req_finalize_data_integrity(struct osd_request *or, | |||
1293 | /* | 1273 | /* |
1294 | * osd_finalize_request and helpers | 1274 | * osd_finalize_request and helpers |
1295 | */ | 1275 | */ |
1276 | static struct request *_make_request(struct request_queue *q, bool has_write, | ||
1277 | struct _osd_io_info *oii, gfp_t flags) | ||
1278 | { | ||
1279 | if (oii->bio) | ||
1280 | return blk_make_request(q, oii->bio, flags); | ||
1281 | else { | ||
1282 | struct request *req; | ||
1283 | |||
1284 | req = blk_get_request(q, has_write ? WRITE : READ, flags); | ||
1285 | if (unlikely(!req)) | ||
1286 | return ERR_PTR(-ENOMEM); | ||
1287 | |||
1288 | return req; | ||
1289 | } | ||
1290 | } | ||
1296 | 1291 | ||
1297 | static int _init_blk_request(struct osd_request *or, | 1292 | static int _init_blk_request(struct osd_request *or, |
1298 | bool has_in, bool has_out) | 1293 | bool has_in, bool has_out) |
@@ -1301,11 +1296,13 @@ static int _init_blk_request(struct osd_request *or, | |||
1301 | struct scsi_device *scsi_device = or->osd_dev->scsi_device; | 1296 | struct scsi_device *scsi_device = or->osd_dev->scsi_device; |
1302 | struct request_queue *q = scsi_device->request_queue; | 1297 | struct request_queue *q = scsi_device->request_queue; |
1303 | struct request *req; | 1298 | struct request *req; |
1304 | int ret = -ENOMEM; | 1299 | int ret; |
1305 | 1300 | ||
1306 | req = blk_get_request(q, has_out, flags); | 1301 | req = _make_request(q, has_out, has_out ? &or->out : &or->in, flags); |
1307 | if (!req) | 1302 | if (IS_ERR(req)) { |
1303 | ret = PTR_ERR(req); | ||
1308 | goto out; | 1304 | goto out; |
1305 | } | ||
1309 | 1306 | ||
1310 | or->request = req; | 1307 | or->request = req; |
1311 | req->cmd_type = REQ_TYPE_BLOCK_PC; | 1308 | req->cmd_type = REQ_TYPE_BLOCK_PC; |
@@ -1318,9 +1315,10 @@ static int _init_blk_request(struct osd_request *or, | |||
1318 | or->out.req = req; | 1315 | or->out.req = req; |
1319 | if (has_in) { | 1316 | if (has_in) { |
1320 | /* allocate bidi request */ | 1317 | /* allocate bidi request */ |
1321 | req = blk_get_request(q, READ, flags); | 1318 | req = _make_request(q, false, &or->in, flags); |
1322 | if (!req) { | 1319 | if (IS_ERR(req)) { |
1323 | OSD_DEBUG("blk_get_request for bidi failed\n"); | 1320 | OSD_DEBUG("blk_get_request for bidi failed\n"); |
1321 | ret = PTR_ERR(req); | ||
1324 | goto out; | 1322 | goto out; |
1325 | } | 1323 | } |
1326 | req->cmd_type = REQ_TYPE_BLOCK_PC; | 1324 | req->cmd_type = REQ_TYPE_BLOCK_PC; |
@@ -1364,26 +1362,6 @@ int osd_finalize_request(struct osd_request *or, | |||
1364 | return ret; | 1362 | return ret; |
1365 | } | 1363 | } |
1366 | 1364 | ||
1367 | if (or->out.bio) { | ||
1368 | ret = blk_rq_append_bio(or->request->q, or->out.req, | ||
1369 | or->out.bio); | ||
1370 | if (ret) { | ||
1371 | OSD_DEBUG("blk_rq_append_bio out failed\n"); | ||
1372 | return ret; | ||
1373 | } | ||
1374 | OSD_DEBUG("out bytes=%llu (bytes_req=%u)\n", | ||
1375 | _LLU(or->out.total_bytes), or->out.req->data_len); | ||
1376 | } | ||
1377 | if (or->in.bio) { | ||
1378 | ret = blk_rq_append_bio(or->request->q, or->in.req, or->in.bio); | ||
1379 | if (ret) { | ||
1380 | OSD_DEBUG("blk_rq_append_bio in failed\n"); | ||
1381 | return ret; | ||
1382 | } | ||
1383 | OSD_DEBUG("in bytes=%llu (bytes_req=%u)\n", | ||
1384 | _LLU(or->in.total_bytes), or->in.req->data_len); | ||
1385 | } | ||
1386 | |||
1387 | or->out.pad_buff = sg_out_pad_buffer; | 1365 | or->out.pad_buff = sg_out_pad_buffer; |
1388 | or->in.pad_buff = sg_in_pad_buffer; | 1366 | or->in.pad_buff = sg_in_pad_buffer; |
1389 | 1367 | ||