Lines Matching refs:or
72 static const char *_osd_ver_desc(struct osd_request *or) in _osd_ver_desc() argument
74 return osd_req_is_ver1(or) ? "OSD1" : "OSD2"; in _osd_ver_desc()
82 struct osd_request *or; in _osd_get_print_system_info() local
101 or = osd_start_request(od, GFP_KERNEL); in _osd_get_print_system_info()
102 if (!or) in _osd_get_print_system_info()
106 osd_req_get_attributes(or, &osd_root_object); in _osd_get_print_system_info()
107 osd_req_add_get_attr_list(or, get_attrs, ARRAY_SIZE(get_attrs)); in _osd_get_print_system_info()
109 ret = osd_finalize_request(or, 0, caps, NULL); in _osd_get_print_system_info()
113 ret = osd_execute_request(or); in _osd_get_print_system_info()
115 OSD_ERR("Failed to detect %s => %d\n", _osd_ver_desc(or), ret); in _osd_get_print_system_info()
119 osd_req_decode_get_attr_list(or, get_attrs, &nelem, &iter); in _osd_get_print_system_info()
122 _osd_ver_desc(or)); in _osd_get_print_system_info()
197 osd_end_request(or); in _osd_get_print_system_info()
218 static unsigned _osd_req_cdb_len(struct osd_request *or) in _osd_req_cdb_len() argument
220 return osd_req_is_ver1(or) ? OSDv1_TOTAL_CDB_LEN : OSD_TOTAL_CDB_LEN; in _osd_req_cdb_len()
223 static unsigned _osd_req_alist_elem_size(struct osd_request *or, unsigned len) in _osd_req_alist_elem_size() argument
225 return osd_req_is_ver1(or) ? in _osd_req_alist_elem_size()
230 static void _osd_req_alist_elem_encode(struct osd_request *or, in _osd_req_alist_elem_encode() argument
233 if (osd_req_is_ver1(or)) { in _osd_req_alist_elem_encode()
250 static int _osd_req_alist_elem_decode(struct osd_request *or, in _osd_req_alist_elem_decode() argument
254 if (osd_req_is_ver1(or)) { in _osd_req_alist_elem_decode()
261 inc = _osd_req_alist_elem_size(or, oa->len); in _osd_req_alist_elem_decode()
281 inc = _osd_req_alist_elem_size(or, oa->len); in _osd_req_alist_elem_decode()
298 static unsigned _osd_req_alist_size(struct osd_request *or, void *list_head) in _osd_req_alist_size() argument
300 return osd_req_is_ver1(or) ? in _osd_req_alist_size()
305 static unsigned _osd_req_sizeof_alist_header(struct osd_request *or) in _osd_req_sizeof_alist_header() argument
307 return osd_req_is_ver1(or) ? in _osd_req_sizeof_alist_header()
312 static void _osd_req_set_alist_type(struct osd_request *or, in _osd_req_set_alist_type() argument
315 if (osd_req_is_ver1(or)) { in _osd_req_set_alist_type()
328 static bool _osd_req_is_alist_type(struct osd_request *or, in _osd_req_is_alist_type() argument
334 if (osd_req_is_ver1(or)) { in _osd_req_is_alist_type()
346 static void _osd_req_encode_olist(struct osd_request *or, in _osd_req_encode_olist() argument
349 struct osd_cdb_head *cdbh = osd_cdb_head(&or->cdb); in _osd_req_encode_olist()
351 if (osd_req_is_ver1(or)) { in _osd_req_encode_olist()
360 static osd_cdb_offset osd_req_encode_offset(struct osd_request *or, in osd_req_encode_offset() argument
364 osd_req_is_ver1(or) ? in osd_req_encode_offset()
370 _osd_req_sec_params(struct osd_request *or) in _osd_req_sec_params() argument
372 struct osd_cdb *ocdb = &or->cdb; in _osd_req_sec_params()
374 if (osd_req_is_ver1(or)) in _osd_req_sec_params()
402 struct osd_request *or; in _osd_request_alloc() local
405 or = kzalloc(sizeof(*or), gfp); in _osd_request_alloc()
406 return or; in _osd_request_alloc()
409 static void _osd_request_free(struct osd_request *or) in _osd_request_free() argument
411 kfree(or); in _osd_request_free()
416 struct osd_request *or; in osd_start_request() local
418 or = _osd_request_alloc(gfp); in osd_start_request()
419 if (!or) in osd_start_request()
422 or->osd_dev = dev; in osd_start_request()
423 or->alloc_flags = gfp; in osd_start_request()
424 or->timeout = dev->def_timeout; in osd_start_request()
425 or->retries = OSD_REQ_RETRIES; in osd_start_request()
427 return or; in osd_start_request()
431 static void _osd_free_seg(struct osd_request *or __unused, in _osd_free_seg()
456 void osd_end_request(struct osd_request *or) in osd_end_request() argument
458 struct request *rq = or->request; in osd_end_request()
469 _osd_free_seg(or, &or->get_attr); in osd_end_request()
470 _osd_free_seg(or, &or->enc_get_attr); in osd_end_request()
471 _osd_free_seg(or, &or->set_attr); in osd_end_request()
472 _osd_free_seg(or, &or->cdb_cont); in osd_end_request()
474 _osd_request_free(or); in osd_end_request()
478 static void _set_error_resid(struct osd_request *or, struct request *req, in _set_error_resid() argument
481 or->async_error = error; in _set_error_resid()
482 or->req_errors = req->errors ? : error; in _set_error_resid()
483 or->sense_len = req->sense_len; in _set_error_resid()
484 if (or->out.req) in _set_error_resid()
485 or->out.residual = or->out.req->resid_len; in _set_error_resid()
486 if (or->in.req) in _set_error_resid()
487 or->in.residual = or->in.req->resid_len; in _set_error_resid()
490 int osd_execute_request(struct osd_request *or) in osd_execute_request() argument
492 int error = blk_execute_rq(or->request->q, NULL, or->request, 0); in osd_execute_request()
494 _set_error_resid(or, or->request, error); in osd_execute_request()
501 struct osd_request *or = req->end_io_data; in osd_request_async_done() local
503 _set_error_resid(or, req, error); in osd_request_async_done()
510 or->request = NULL; in osd_request_async_done()
511 or->in.req = NULL; in osd_request_async_done()
512 or->out.req = NULL; in osd_request_async_done()
514 if (or->async_done) in osd_request_async_done()
515 or->async_done(or, or->async_private); in osd_request_async_done()
517 osd_end_request(or); in osd_request_async_done()
520 int osd_execute_request_async(struct osd_request *or, in osd_execute_request_async() argument
523 or->request->end_io_data = or; in osd_execute_request_async()
524 or->async_private = private; in osd_execute_request_async()
525 or->async_done = done; in osd_execute_request_async()
527 blk_execute_rq_nowait(or->request->q, NULL, or->request, 0, in osd_execute_request_async()
536 static int _osd_realloc_seg(struct osd_request *or, in _osd_realloc_seg() argument
544 buff = krealloc(seg->buff, max_bytes, or->alloc_flags); in _osd_realloc_seg()
557 static int _alloc_cdb_cont(struct osd_request *or, unsigned total_bytes) in _alloc_cdb_cont() argument
560 return _osd_realloc_seg(or, &or->cdb_cont, total_bytes); in _alloc_cdb_cont()
563 static int _alloc_set_attr_list(struct osd_request *or, in _alloc_set_attr_list() argument
569 total_bytes += _osd_req_alist_elem_size(or, oa->len); in _alloc_set_attr_list()
572 return _osd_realloc_seg(or, &or->set_attr, total_bytes); in _alloc_set_attr_list()
575 static int _alloc_get_attr_desc(struct osd_request *or, unsigned max_bytes) in _alloc_get_attr_desc() argument
578 return _osd_realloc_seg(or, &or->enc_get_attr, max_bytes); in _alloc_get_attr_desc()
581 static int _alloc_get_attr_list(struct osd_request *or) in _alloc_get_attr_list() argument
583 OSD_DEBUG("total_bytes=%d\n", or->get_attr.total_bytes); in _alloc_get_attr_list()
584 return _osd_realloc_seg(or, &or->get_attr, or->get_attr.total_bytes); in _alloc_get_attr_list()
591 static void _osdv1_req_encode_common(struct osd_request *or, in _osdv1_req_encode_common() argument
594 struct osdv1_cdb *ocdb = &or->cdb.v1; in _osdv1_req_encode_common()
616 static void _osdv2_req_encode_common(struct osd_request *or, in _osdv2_req_encode_common() argument
619 struct osdv2_cdb *ocdb = &or->cdb.v2; in _osdv2_req_encode_common()
633 static void _osd_req_encode_common(struct osd_request *or, in _osd_req_encode_common() argument
636 if (osd_req_is_ver1(or)) in _osd_req_encode_common()
637 _osdv1_req_encode_common(or, act, obj, offset, len); in _osd_req_encode_common()
639 _osdv2_req_encode_common(or, act, obj, offset, len); in _osd_req_encode_common()
648 void osd_req_format(struct osd_request *or, u64 tot_capacity) in osd_req_format() argument
650 _osd_req_encode_common(or, OSD_ACT_FORMAT_OSD, &osd_root_object, 0, in osd_req_format()
655 int osd_req_list_dev_partitions(struct osd_request *or, in osd_req_list_dev_partitions() argument
658 return osd_req_list_partition_objects(or, 0, initial_id, list, nelem); in osd_req_list_dev_partitions()
662 static void _osd_req_encode_flush(struct osd_request *or, in _osd_req_encode_flush() argument
665 struct osd_cdb_head *ocdb = osd_cdb_head(&or->cdb); in _osd_req_encode_flush()
670 void osd_req_flush_obsd(struct osd_request *or, in osd_req_flush_obsd() argument
673 _osd_req_encode_common(or, OSD_ACT_FLUSH_OSD, &osd_root_object, 0, 0); in osd_req_flush_obsd()
674 _osd_req_encode_flush(or, op); in osd_req_flush_obsd()
685 static void _osd_req_encode_partition(struct osd_request *or, in _osd_req_encode_partition() argument
693 _osd_req_encode_common(or, act, &par, 0, 0); in _osd_req_encode_partition()
696 void osd_req_create_partition(struct osd_request *or, osd_id partition) in osd_req_create_partition() argument
698 _osd_req_encode_partition(or, OSD_ACT_CREATE_PARTITION, partition); in osd_req_create_partition()
702 void osd_req_remove_partition(struct osd_request *or, osd_id partition) in osd_req_remove_partition() argument
704 _osd_req_encode_partition(or, OSD_ACT_REMOVE_PARTITION, partition); in osd_req_remove_partition()
712 static int _osd_req_list_objects(struct osd_request *or, in _osd_req_list_objects() argument
716 struct request_queue *q = osd_request_queue(or->osd_dev); in _osd_req_list_objects()
720 _osd_req_encode_common(or, action, obj, (u64)initial_id, len); in _osd_req_list_objects()
723 _osd_req_encode_olist(or, list); in _osd_req_list_objects()
725 WARN_ON(or->in.bio); in _osd_req_list_objects()
726 bio = bio_map_kern(q, list, len, or->alloc_flags); in _osd_req_list_objects()
733 or->in.bio = bio; in _osd_req_list_objects()
734 or->in.total_bytes = bio->bi_iter.bi_size; in _osd_req_list_objects()
738 int osd_req_list_partition_collections(struct osd_request *or, in osd_req_list_partition_collections() argument
747 return osd_req_list_collection_objects(or, &par, initial_id, list, in osd_req_list_partition_collections()
752 int osd_req_list_partition_objects(struct osd_request *or, in osd_req_list_partition_objects() argument
761 return _osd_req_list_objects(or, OSD_ACT_LIST, &par, initial_id, list, in osd_req_list_partition_objects()
766 void osd_req_flush_partition(struct osd_request *or, in osd_req_flush_partition() argument
769 _osd_req_encode_partition(or, OSD_ACT_FLUSH_PARTITION, partition); in osd_req_flush_partition()
770 _osd_req_encode_flush(or, op); in osd_req_flush_partition()
782 int osd_req_list_collection_objects(struct osd_request *or, in osd_req_list_collection_objects() argument
786 return _osd_req_list_objects(or, OSD_ACT_LIST_COLLECTION, obj, in osd_req_list_collection_objects()
793 void osd_req_flush_collection(struct osd_request *or, in osd_req_flush_collection() argument
796 _osd_req_encode_common(or, OSD_ACT_FLUSH_PARTITION, obj, 0, 0); in osd_req_flush_collection()
797 _osd_req_encode_flush(or, op); in osd_req_flush_collection()
807 void osd_req_create_object(struct osd_request *or, struct osd_obj_id *obj) in osd_req_create_object() argument
809 _osd_req_encode_common(or, OSD_ACT_CREATE, obj, 0, 0); in osd_req_create_object()
813 void osd_req_remove_object(struct osd_request *or, struct osd_obj_id *obj) in osd_req_remove_object() argument
815 _osd_req_encode_common(or, OSD_ACT_REMOVE, obj, 0, 0); in osd_req_remove_object()
824 void osd_req_write(struct osd_request *or, in osd_req_write() argument
828 _osd_req_encode_common(or, OSD_ACT_WRITE, obj, offset, len); in osd_req_write()
829 WARN_ON(or->out.bio || or->out.total_bytes); in osd_req_write()
831 or->out.bio = bio; in osd_req_write()
832 or->out.total_bytes = len; in osd_req_write()
836 int osd_req_write_kern(struct osd_request *or, in osd_req_write_kern() argument
839 struct request_queue *req_q = osd_request_queue(or->osd_dev); in osd_req_write_kern()
846 osd_req_write(or, obj, offset, bio, len); in osd_req_write_kern()
860 void osd_req_flush_object(struct osd_request *or, in osd_req_flush_object() argument
864 if (unlikely(osd_req_is_ver1(or) && (offset || len))) { in osd_req_flush_object()
870 _osd_req_encode_common(or, OSD_ACT_FLUSH, obj, offset, len); in osd_req_flush_object()
871 _osd_req_encode_flush(or, op); in osd_req_flush_object()
875 void osd_req_read(struct osd_request *or, in osd_req_read() argument
879 _osd_req_encode_common(or, OSD_ACT_READ, obj, offset, len); in osd_req_read()
880 WARN_ON(or->in.bio || or->in.total_bytes); in osd_req_read()
882 or->in.bio = bio; in osd_req_read()
883 or->in.total_bytes = len; in osd_req_read()
887 int osd_req_read_kern(struct osd_request *or, in osd_req_read_kern() argument
890 struct request_queue *req_q = osd_request_queue(or->osd_dev); in osd_req_read_kern()
896 osd_req_read(or, obj, offset, bio, len); in osd_req_read_kern()
901 static int _add_sg_continuation_descriptor(struct osd_request *or, in _add_sg_continuation_descriptor() argument
911 if (!or->cdb_cont.total_bytes) { in _add_sg_continuation_descriptor()
915 or->cdb_cont.total_bytes = in _add_sg_continuation_descriptor()
919 ret = _alloc_cdb_cont(or, or->cdb_cont.total_bytes + oscd_size); in _add_sg_continuation_descriptor()
923 oscd = or->cdb_cont.buff + or->cdb_cont.total_bytes; in _add_sg_continuation_descriptor()
936 or->cdb_cont.total_bytes += oscd_size; in _add_sg_continuation_descriptor()
938 or->cdb_cont.total_bytes, oscd_size, numentries); in _add_sg_continuation_descriptor()
942 static int _osd_req_finalize_cdb_cont(struct osd_request *or, const u8 *cap_key) in _osd_req_finalize_cdb_cont() argument
944 struct request_queue *req_q = osd_request_queue(or->osd_dev); in _osd_req_finalize_cdb_cont()
946 struct osd_cdb_head *cdbh = osd_cdb_head(&or->cdb); in _osd_req_finalize_cdb_cont()
949 if (!or->cdb_cont.total_bytes) in _osd_req_finalize_cdb_cont()
952 cont_seg_hdr = or->cdb_cont.buff; in _osd_req_finalize_cdb_cont()
957 bio = bio_map_kern(req_q, or->cdb_cont.buff, or->cdb_cont.total_bytes, in _osd_req_finalize_cdb_cont()
970 cdbh->v2.cdb_continuation_length = cpu_to_be32(or->cdb_cont.total_bytes); in _osd_req_finalize_cdb_cont()
977 bio->bi_next = or->out.bio; in _osd_req_finalize_cdb_cont()
978 or->out.bio = bio; in _osd_req_finalize_cdb_cont()
979 or->out.total_bytes += or->cdb_cont.total_bytes; in _osd_req_finalize_cdb_cont()
990 int osd_req_write_sg(struct osd_request *or, in osd_req_write_sg() argument
995 int ret = _add_sg_continuation_descriptor(or, sglist, numentries, &len); in osd_req_write_sg()
999 osd_req_write(or, obj, 0, bio, len); in osd_req_write_sg()
1008 int osd_req_read_sg(struct osd_request *or, in osd_req_read_sg() argument
1018 ret = _add_sg_continuation_descriptor(or, sglist, numentries, in osd_req_read_sg()
1029 osd_req_read(or, obj, off, bio, len); in osd_req_read_sg()
1043 static struct bio *_create_sg_bios(struct osd_request *or, in _create_sg_bios() argument
1046 struct request_queue *q = osd_request_queue(or->osd_dev); in _create_sg_bios()
1075 int osd_req_write_sg_kern(struct osd_request *or, in osd_req_write_sg_kern() argument
1079 struct bio *bio = _create_sg_bios(or, buff, sglist, numentries); in osd_req_write_sg_kern()
1084 osd_req_write_sg(or, obj, bio, sglist, numentries); in osd_req_write_sg_kern()
1090 int osd_req_read_sg_kern(struct osd_request *or, in osd_req_read_sg_kern() argument
1094 struct bio *bio = _create_sg_bios(or, buff, sglist, numentries); in osd_req_read_sg_kern()
1098 osd_req_read_sg(or, obj, bio, sglist, numentries); in osd_req_read_sg_kern()
1106 void osd_req_get_attributes(struct osd_request *or, in osd_req_get_attributes() argument
1109 _osd_req_encode_common(or, OSD_ACT_GET_ATTRIBUTES, obj, 0, 0); in osd_req_get_attributes()
1113 void osd_req_set_attributes(struct osd_request *or, in osd_req_set_attributes() argument
1116 _osd_req_encode_common(or, OSD_ACT_SET_ATTRIBUTES, obj, 0, 0); in osd_req_set_attributes()
1124 int osd_req_add_set_attr_list(struct osd_request *or, in osd_req_add_set_attr_list() argument
1127 unsigned total_bytes = or->set_attr.total_bytes; in osd_req_add_set_attr_list()
1131 if (or->attributes_mode && in osd_req_add_set_attr_list()
1132 or->attributes_mode != OSD_CDB_GET_SET_ATTR_LISTS) { in osd_req_add_set_attr_list()
1136 or->attributes_mode = OSD_CDB_GET_SET_ATTR_LISTS; in osd_req_add_set_attr_list()
1139 total_bytes = _osd_req_sizeof_alist_header(or); in osd_req_add_set_attr_list()
1140 ret = _alloc_set_attr_list(or, oa, nelem, total_bytes); in osd_req_add_set_attr_list()
1143 _osd_req_set_alist_type(or, or->set_attr.buff, in osd_req_add_set_attr_list()
1146 attr_last = or->set_attr.buff + total_bytes; in osd_req_add_set_attr_list()
1149 unsigned elem_size = _osd_req_alist_elem_size(or, oa->len); in osd_req_add_set_attr_list()
1152 if (unlikely(or->set_attr.alloc_size < total_bytes)) { in osd_req_add_set_attr_list()
1153 or->set_attr.total_bytes = total_bytes - elem_size; in osd_req_add_set_attr_list()
1154 ret = _alloc_set_attr_list(or, oa, nelem, total_bytes); in osd_req_add_set_attr_list()
1158 or->set_attr.buff + or->set_attr.total_bytes; in osd_req_add_set_attr_list()
1161 _osd_req_alist_elem_encode(or, attr_last, oa); in osd_req_add_set_attr_list()
1167 or->set_attr.total_bytes = total_bytes; in osd_req_add_set_attr_list()
1172 static int _req_append_segment(struct osd_request *or, in _req_append_segment() argument
1188 or->alloc_flags); in _req_append_segment()
1195 or->alloc_flags); in _req_append_segment()
1205 static int _osd_req_finalize_set_attr_list(struct osd_request *or) in _osd_req_finalize_set_attr_list() argument
1207 struct osd_cdb_head *cdbh = osd_cdb_head(&or->cdb); in _osd_req_finalize_set_attr_list()
1211 if (!or->set_attr.total_bytes) { in _osd_req_finalize_set_attr_list()
1216 cdbh->attrs_list.set_attr_bytes = cpu_to_be32(or->set_attr.total_bytes); in _osd_req_finalize_set_attr_list()
1218 osd_req_encode_offset(or, or->out.total_bytes, &padding); in _osd_req_finalize_set_attr_list()
1220 ret = _req_append_segment(or, padding, &or->set_attr, in _osd_req_finalize_set_attr_list()
1221 or->out.last_seg, &or->out); in _osd_req_finalize_set_attr_list()
1225 or->out.last_seg = &or->set_attr; in _osd_req_finalize_set_attr_list()
1229 int osd_req_add_get_attr_list(struct osd_request *or, in osd_req_add_get_attr_list() argument
1232 unsigned total_bytes = or->enc_get_attr.total_bytes; in osd_req_add_get_attr_list()
1236 if (or->attributes_mode && in osd_req_add_get_attr_list()
1237 or->attributes_mode != OSD_CDB_GET_SET_ATTR_LISTS) { in osd_req_add_get_attr_list()
1241 or->attributes_mode = OSD_CDB_GET_SET_ATTR_LISTS; in osd_req_add_get_attr_list()
1244 if (!or->get_attr.total_bytes) in osd_req_add_get_attr_list()
1245 or->get_attr.total_bytes = _osd_req_sizeof_alist_header(or); in osd_req_add_get_attr_list()
1251 total_bytes = _osd_req_sizeof_alist_header(or); in osd_req_add_get_attr_list()
1254 ret = _alloc_get_attr_desc(or, max_bytes); in osd_req_add_get_attr_list()
1258 _osd_req_set_alist_type(or, or->enc_get_attr.buff, in osd_req_add_get_attr_list()
1261 attr_last = or->enc_get_attr.buff + total_bytes; in osd_req_add_get_attr_list()
1268 if (unlikely(or->enc_get_attr.alloc_size < total_bytes)) { in osd_req_add_get_attr_list()
1269 or->enc_get_attr.total_bytes = total_bytes - cur_size; in osd_req_add_get_attr_list()
1270 ret = _alloc_get_attr_desc(or, in osd_req_add_get_attr_list()
1274 attr_last = or->enc_get_attr.buff + in osd_req_add_get_attr_list()
1275 or->enc_get_attr.total_bytes; in osd_req_add_get_attr_list()
1285 or->get_attr.total_bytes += in osd_req_add_get_attr_list()
1286 _osd_req_alist_elem_size(or, oa->len); in osd_req_add_get_attr_list()
1290 or->enc_get_attr.total_bytes = total_bytes; in osd_req_add_get_attr_list()
1294 or->get_attr.total_bytes, in osd_req_add_get_attr_list()
1295 or->get_attr.total_bytes - _osd_req_sizeof_alist_header(or), in osd_req_add_get_attr_list()
1296 or->enc_get_attr.total_bytes, in osd_req_add_get_attr_list()
1297 (or->enc_get_attr.total_bytes - _osd_req_sizeof_alist_header(or)) in osd_req_add_get_attr_list()
1304 static int _osd_req_finalize_get_attr_list(struct osd_request *or) in _osd_req_finalize_get_attr_list() argument
1306 struct osd_cdb_head *cdbh = osd_cdb_head(&or->cdb); in _osd_req_finalize_get_attr_list()
1311 if (!or->enc_get_attr.total_bytes) { in _osd_req_finalize_get_attr_list()
1317 ret = _alloc_get_attr_list(or); in _osd_req_finalize_get_attr_list()
1324 cpu_to_be32(or->enc_get_attr.total_bytes); in _osd_req_finalize_get_attr_list()
1327 osd_req_encode_offset(or, or->out.total_bytes, &out_padding); in _osd_req_finalize_get_attr_list()
1329 ret = _req_append_segment(or, out_padding, &or->enc_get_attr, in _osd_req_finalize_get_attr_list()
1330 or->out.last_seg, &or->out); in _osd_req_finalize_get_attr_list()
1333 or->out.last_seg = &or->enc_get_attr; in _osd_req_finalize_get_attr_list()
1338 cpu_to_be32(or->get_attr.total_bytes); in _osd_req_finalize_get_attr_list()
1341 osd_req_encode_offset(or, or->in.total_bytes, &in_padding); in _osd_req_finalize_get_attr_list()
1343 ret = _req_append_segment(or, in_padding, &or->get_attr, NULL, in _osd_req_finalize_get_attr_list()
1344 &or->in); in _osd_req_finalize_get_attr_list()
1347 or->in.last_seg = &or->get_attr; in _osd_req_finalize_get_attr_list()
1352 int osd_req_decode_get_attr_list(struct osd_request *or, in osd_req_decode_get_attr_list() argument
1357 const unsigned sizeof_attr_list = _osd_req_sizeof_alist_header(or); in osd_req_decode_get_attr_list()
1360 if (!_osd_req_is_alist_type(or, or->get_attr.buff, in osd_req_decode_get_attr_list()
1371 BUG_ON((*iterator < or->get_attr.buff) || in osd_req_decode_get_attr_list()
1372 (or->get_attr.buff + or->get_attr.alloc_size < *iterator)); in osd_req_decode_get_attr_list()
1374 cur_bytes = (*iterator - or->get_attr.buff) - sizeof_attr_list; in osd_req_decode_get_attr_list()
1375 returned_bytes = or->get_attr.total_bytes; in osd_req_decode_get_attr_list()
1378 returned_bytes = _osd_req_alist_size(or, or->get_attr.buff) + in osd_req_decode_get_attr_list()
1381 cur_p = or->get_attr.buff + sizeof_attr_list; in osd_req_decode_get_attr_list()
1383 if (returned_bytes > or->get_attr.alloc_size) { in osd_req_decode_get_attr_list()
1386 or->get_attr.alloc_size, in osd_req_decode_get_attr_list()
1390 or->get_attr.alloc_size - sizeof_attr_list; in osd_req_decode_get_attr_list()
1392 or->get_attr.total_bytes = returned_bytes; in osd_req_decode_get_attr_list()
1396 int inc = _osd_req_alist_elem_decode(or, cur_p, oa, in osd_req_decode_get_attr_list()
1423 int osd_req_add_get_attr_page(struct osd_request *or, in osd_req_add_get_attr_page() argument
1427 struct osd_cdb_head *cdbh = osd_cdb_head(&or->cdb); in osd_req_add_get_attr_page()
1429 if (or->attributes_mode && in osd_req_add_get_attr_page()
1430 or->attributes_mode != OSD_CDB_GET_ATTR_PAGE_SET_ONE) { in osd_req_add_get_attr_page()
1434 or->attributes_mode = OSD_CDB_GET_ATTR_PAGE_SET_ONE; in osd_req_add_get_attr_page()
1436 or->get_attr.buff = attar_page; in osd_req_add_get_attr_page()
1437 or->get_attr.total_bytes = max_page_len; in osd_req_add_get_attr_page()
1445 or->set_attr.buff = set_one_attr->val_ptr; in osd_req_add_get_attr_page()
1446 or->set_attr.total_bytes = set_one_attr->len; in osd_req_add_get_attr_page()
1455 static int _osd_req_finalize_attr_page(struct osd_request *or) in _osd_req_finalize_attr_page() argument
1457 struct osd_cdb_head *cdbh = osd_cdb_head(&or->cdb); in _osd_req_finalize_attr_page()
1463 osd_req_encode_offset(or, or->in.total_bytes, &in_padding); in _osd_req_finalize_attr_page()
1465 ret = _req_append_segment(or, in_padding, &or->get_attr, NULL, in _osd_req_finalize_attr_page()
1466 &or->in); in _osd_req_finalize_attr_page()
1470 if (or->set_attr.total_bytes == 0) in _osd_req_finalize_attr_page()
1475 osd_req_encode_offset(or, or->out.total_bytes, &out_padding); in _osd_req_finalize_attr_page()
1477 ret = _req_append_segment(or, out_padding, &or->set_attr, NULL, in _osd_req_finalize_attr_page()
1478 &or->out); in _osd_req_finalize_attr_page()
1500 static int _osd_req_finalize_data_integrity(struct osd_request *or, in _osd_req_finalize_data_integrity() argument
1504 struct osd_security_parameters *sec_parms = _osd_req_sec_params(or); in _osd_req_finalize_data_integrity()
1512 .buff = &or->out_data_integ, in _osd_req_finalize_data_integrity()
1513 .total_bytes = sizeof(or->out_data_integ), in _osd_req_finalize_data_integrity()
1517 or->out_data_integ.data_bytes = cpu_to_be64(out_data_bytes); in _osd_req_finalize_data_integrity()
1518 or->out_data_integ.set_attributes_bytes = cpu_to_be64( in _osd_req_finalize_data_integrity()
1519 or->set_attr.total_bytes); in _osd_req_finalize_data_integrity()
1520 or->out_data_integ.get_attributes_bytes = cpu_to_be64( in _osd_req_finalize_data_integrity()
1521 or->enc_get_attr.total_bytes); in _osd_req_finalize_data_integrity()
1523 osd_sec_parms_set_out_offset(osd_req_is_ver1(or), sec_parms, in _osd_req_finalize_data_integrity()
1524 osd_req_encode_offset(or, or->out.total_bytes, &pad)); in _osd_req_finalize_data_integrity()
1526 ret = _req_append_segment(or, pad, &seg, or->out.last_seg, in _osd_req_finalize_data_integrity()
1527 &or->out); in _osd_req_finalize_data_integrity()
1530 or->out.last_seg = NULL; in _osd_req_finalize_data_integrity()
1533 osd_sec_sign_data(&or->out_data_integ, out_data_bio, in _osd_req_finalize_data_integrity()
1539 .buff = &or->in_data_integ, in _osd_req_finalize_data_integrity()
1540 .total_bytes = sizeof(or->in_data_integ), in _osd_req_finalize_data_integrity()
1544 osd_sec_parms_set_in_offset(osd_req_is_ver1(or), sec_parms, in _osd_req_finalize_data_integrity()
1545 osd_req_encode_offset(or, or->in.total_bytes, &pad)); in _osd_req_finalize_data_integrity()
1547 ret = _req_append_segment(or, pad, &seg, or->in.last_seg, in _osd_req_finalize_data_integrity()
1548 &or->in); in _osd_req_finalize_data_integrity()
1552 or->in.last_seg = NULL; in _osd_req_finalize_data_integrity()
1578 static int _init_blk_request(struct osd_request *or, in _init_blk_request() argument
1581 gfp_t flags = or->alloc_flags; in _init_blk_request()
1582 struct scsi_device *scsi_device = or->osd_dev->scsi_device; in _init_blk_request()
1587 req = _make_request(q, has_out, has_out ? &or->out : &or->in, flags); in _init_blk_request()
1593 or->request = req; in _init_blk_request()
1596 req->timeout = or->timeout; in _init_blk_request()
1597 req->retries = or->retries; in _init_blk_request()
1598 req->sense = or->sense; in _init_blk_request()
1602 or->out.req = req; in _init_blk_request()
1605 req = _make_request(q, false, &or->in, flags); in _init_blk_request()
1612 or->in.req = or->request->next_rq = req; in _init_blk_request()
1615 or->in.req = req; in _init_blk_request()
1620 or, has_in, has_out, ret, or->request); in _init_blk_request()
1624 int osd_finalize_request(struct osd_request *or, in osd_finalize_request() argument
1627 struct osd_cdb_head *cdbh = osd_cdb_head(&or->cdb); in osd_finalize_request()
1630 struct bio *out_data_bio = or->out.bio; in osd_finalize_request()
1631 u64 out_data_bytes = or->out.total_bytes; in osd_finalize_request()
1643 osd_set_caps(&or->cdb, cap); in osd_finalize_request()
1645 has_in = or->in.bio || or->get_attr.total_bytes; in osd_finalize_request()
1646 has_out = or->out.bio || or->cdb_cont.total_bytes || in osd_finalize_request()
1647 or->set_attr.total_bytes || or->enc_get_attr.total_bytes; in osd_finalize_request()
1649 ret = _osd_req_finalize_cdb_cont(or, cap_key); in osd_finalize_request()
1654 ret = _init_blk_request(or, has_in, has_out); in osd_finalize_request()
1660 or->out.pad_buff = sg_out_pad_buffer; in osd_finalize_request()
1661 or->in.pad_buff = sg_in_pad_buffer; in osd_finalize_request()
1663 if (!or->attributes_mode) in osd_finalize_request()
1664 or->attributes_mode = OSD_CDB_GET_SET_ATTR_LISTS; in osd_finalize_request()
1665 cdbh->command_specific_options |= or->attributes_mode; in osd_finalize_request()
1666 if (or->attributes_mode == OSD_CDB_GET_ATTR_PAGE_SET_ONE) { in osd_finalize_request()
1667 ret = _osd_req_finalize_attr_page(or); in osd_finalize_request()
1677 ret = _osd_req_finalize_set_attr_list(or); in osd_finalize_request()
1683 ret = _osd_req_finalize_get_attr_list(or); in osd_finalize_request()
1690 ret = _osd_req_finalize_data_integrity(or, has_in, has_out, in osd_finalize_request()
1696 osd_sec_sign_cdb(&or->cdb, cap_key); in osd_finalize_request()
1698 or->request->cmd = or->cdb.buff; in osd_finalize_request()
1699 or->request->cmd_len = _osd_req_cdb_len(or); in osd_finalize_request()
1722 int osd_req_decode_sense_full(struct osd_request *or, in osd_req_decode_sense_full() argument
1738 if (likely(!or->req_errors)) in osd_req_decode_sense_full()
1744 ssdb = (typeof(ssdb))or->sense; in osd_req_decode_sense_full()
1745 sense_len = or->sense_len; in osd_req_decode_sense_full()
1749 or->req_errors, sense_len, ssdb->sense_key); in osd_req_decode_sense_full()
1770 osi->additional_code, or->async_error, in osd_req_decode_sense_full()
1771 or->req_errors); in osd_req_decode_sense_full()
1908 if (or->async_error == -ENOMEM) in osd_req_decode_sense_full()
1912 ret = or->async_error; in osd_req_decode_sense_full()
1941 if (!or->out.residual) in osd_req_decode_sense_full()
1942 or->out.residual = or->out.total_bytes; in osd_req_decode_sense_full()
1943 if (!or->in.residual) in osd_req_decode_sense_full()
1944 or->in.residual = or->in.total_bytes; in osd_req_decode_sense_full()