• Home
  • Raw
  • Download

Lines Matching full:or

13  * This program is free software; you can redistribute it and/or modify
16 * Redistribution and use in source and binary forms, with or without
24 * documentation and/or other materials provided with the distribution.
26 * contributors may be used to endorse or promote products derived
29 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
32 * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
33 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
35 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
37 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
38 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
73 static const char *_osd_ver_desc(struct osd_request *or) in _osd_ver_desc() argument
75 return osd_req_is_ver1(or) ? "OSD1" : "OSD2"; in _osd_ver_desc()
83 struct osd_request *or; in _osd_get_print_system_info() local
102 or = osd_start_request(od); in _osd_get_print_system_info()
103 if (!or) in _osd_get_print_system_info()
107 osd_req_get_attributes(or, &osd_root_object); in _osd_get_print_system_info()
108 osd_req_add_get_attr_list(or, get_attrs, ARRAY_SIZE(get_attrs)); in _osd_get_print_system_info()
110 ret = osd_finalize_request(or, 0, caps, NULL); in _osd_get_print_system_info()
114 ret = osd_execute_request(or); in _osd_get_print_system_info()
116 OSD_ERR("Failed to detect %s => %d\n", _osd_ver_desc(or), ret); in _osd_get_print_system_info()
120 osd_req_decode_get_attr_list(or, get_attrs, &nelem, &iter); in _osd_get_print_system_info()
123 _osd_ver_desc(or)); in _osd_get_print_system_info()
195 osd_end_request(or); in _osd_get_print_system_info()
216 static unsigned _osd_req_cdb_len(struct osd_request *or) in _osd_req_cdb_len() argument
218 return osd_req_is_ver1(or) ? OSDv1_TOTAL_CDB_LEN : OSD_TOTAL_CDB_LEN; in _osd_req_cdb_len()
221 static unsigned _osd_req_alist_elem_size(struct osd_request *or, unsigned len) in _osd_req_alist_elem_size() argument
223 return osd_req_is_ver1(or) ? in _osd_req_alist_elem_size()
228 static void _osd_req_alist_elem_encode(struct osd_request *or, in _osd_req_alist_elem_encode() argument
231 if (osd_req_is_ver1(or)) { in _osd_req_alist_elem_encode()
248 static int _osd_req_alist_elem_decode(struct osd_request *or, in _osd_req_alist_elem_decode() argument
252 if (osd_req_is_ver1(or)) { in _osd_req_alist_elem_decode()
259 inc = _osd_req_alist_elem_size(or, oa->len); in _osd_req_alist_elem_decode()
279 inc = _osd_req_alist_elem_size(or, oa->len); in _osd_req_alist_elem_decode()
289 * oa->val_ptr == NULL marks the end-of-list, or error. in _osd_req_alist_elem_decode()
296 static unsigned _osd_req_alist_size(struct osd_request *or, void *list_head) in _osd_req_alist_size() argument
298 return osd_req_is_ver1(or) ? in _osd_req_alist_size()
303 static unsigned _osd_req_sizeof_alist_header(struct osd_request *or) in _osd_req_sizeof_alist_header() argument
305 return osd_req_is_ver1(or) ? in _osd_req_sizeof_alist_header()
310 static void _osd_req_set_alist_type(struct osd_request *or, in _osd_req_set_alist_type() argument
313 if (osd_req_is_ver1(or)) { in _osd_req_set_alist_type()
326 static bool _osd_req_is_alist_type(struct osd_request *or, in _osd_req_is_alist_type() argument
332 if (osd_req_is_ver1(or)) { in _osd_req_is_alist_type()
344 static void _osd_req_encode_olist(struct osd_request *or, in _osd_req_encode_olist() argument
347 struct osd_cdb_head *cdbh = osd_cdb_head(&or->cdb); in _osd_req_encode_olist()
349 if (osd_req_is_ver1(or)) { in _osd_req_encode_olist()
358 static osd_cdb_offset osd_req_encode_offset(struct osd_request *or, in osd_req_encode_offset() argument
362 osd_req_is_ver1(or) ? in osd_req_encode_offset()
368 _osd_req_sec_params(struct osd_request *or) in _osd_req_sec_params() argument
370 struct osd_cdb *ocdb = &or->cdb; in _osd_req_sec_params()
372 if (osd_req_is_ver1(or)) in _osd_req_sec_params()
400 struct osd_request *or; in _osd_request_alloc() local
403 or = kzalloc(sizeof(*or), gfp); in _osd_request_alloc()
404 return or; in _osd_request_alloc()
407 static void _osd_request_free(struct osd_request *or) in _osd_request_free() argument
409 kfree(or); in _osd_request_free()
414 struct osd_request *or; in osd_start_request() local
416 or = _osd_request_alloc(GFP_KERNEL); in osd_start_request()
417 if (!or) in osd_start_request()
420 or->osd_dev = dev; in osd_start_request()
421 or->timeout = dev->def_timeout; in osd_start_request()
422 or->retries = OSD_REQ_RETRIES; in osd_start_request()
424 return or; in osd_start_request()
428 static void _osd_free_seg(struct osd_request *or __unused, in _osd_free_seg()
444 * TODO: Keep error code in or->async_error. Need to audit all in _put_request()
453 void osd_end_request(struct osd_request *or) in osd_end_request() argument
455 struct request *rq = or->request; in osd_end_request()
466 _osd_free_seg(or, &or->get_attr); in osd_end_request()
467 _osd_free_seg(or, &or->enc_get_attr); in osd_end_request()
468 _osd_free_seg(or, &or->set_attr); in osd_end_request()
469 _osd_free_seg(or, &or->cdb_cont); in osd_end_request()
471 _osd_request_free(or); in osd_end_request()
475 static void _set_error_resid(struct osd_request *or, struct request *req, in _set_error_resid() argument
478 or->async_error = error; in _set_error_resid()
479 or->req_errors = scsi_req(req)->result; in _set_error_resid()
480 or->sense_len = scsi_req(req)->sense_len; in _set_error_resid()
481 if (or->sense_len) in _set_error_resid()
482 memcpy(or->sense, scsi_req(req)->sense, or->sense_len); in _set_error_resid()
483 if (or->out.req) in _set_error_resid()
484 or->out.residual = scsi_req(or->out.req)->resid_len; in _set_error_resid()
485 if (or->in.req) in _set_error_resid()
486 or->in.residual = scsi_req(or->in.req)->resid_len; in _set_error_resid()
489 int osd_execute_request(struct osd_request *or) in osd_execute_request() argument
491 blk_execute_rq(or->request->q, NULL, or->request, 0); in osd_execute_request()
493 if (scsi_req(or->request)->result) { in osd_execute_request()
494 _set_error_resid(or, or->request, BLK_STS_IOERR); in osd_execute_request()
498 _set_error_resid(or, or->request, BLK_STS_OK); in osd_execute_request()
505 struct osd_request *or = req->end_io_data; in osd_request_async_done() local
507 _set_error_resid(or, req, error); in osd_request_async_done()
514 or->request = NULL; in osd_request_async_done()
515 or->in.req = NULL; in osd_request_async_done()
516 or->out.req = NULL; in osd_request_async_done()
518 if (or->async_done) in osd_request_async_done()
519 or->async_done(or, or->async_private); in osd_request_async_done()
521 osd_end_request(or); in osd_request_async_done()
524 int osd_execute_request_async(struct osd_request *or, in osd_execute_request_async() argument
527 or->request->end_io_data = or; in osd_execute_request_async()
528 or->async_private = private; in osd_execute_request_async()
529 or->async_done = done; in osd_execute_request_async()
531 blk_execute_rq_nowait(or->request->q, NULL, or->request, 0, in osd_execute_request_async()
540 static int _osd_realloc_seg(struct osd_request *or, in _osd_realloc_seg() argument
561 static int _alloc_cdb_cont(struct osd_request *or, unsigned total_bytes) in _alloc_cdb_cont() argument
564 return _osd_realloc_seg(or, &or->cdb_cont, total_bytes); in _alloc_cdb_cont()
567 static int _alloc_set_attr_list(struct osd_request *or, in _alloc_set_attr_list() argument
573 total_bytes += _osd_req_alist_elem_size(or, oa->len); in _alloc_set_attr_list()
576 return _osd_realloc_seg(or, &or->set_attr, total_bytes); in _alloc_set_attr_list()
579 static int _alloc_get_attr_desc(struct osd_request *or, unsigned max_bytes) in _alloc_get_attr_desc() argument
582 return _osd_realloc_seg(or, &or->enc_get_attr, max_bytes); in _alloc_get_attr_desc()
585 static int _alloc_get_attr_list(struct osd_request *or) in _alloc_get_attr_list() argument
587 OSD_DEBUG("total_bytes=%d\n", or->get_attr.total_bytes); in _alloc_get_attr_list()
588 return _osd_realloc_seg(or, &or->get_attr, or->get_attr.total_bytes); in _alloc_get_attr_list()
595 static void _osdv1_req_encode_common(struct osd_request *or, in _osdv1_req_encode_common() argument
598 struct osdv1_cdb *ocdb = &or->cdb.v1; in _osdv1_req_encode_common()
620 static void _osdv2_req_encode_common(struct osd_request *or, in _osdv2_req_encode_common() argument
623 struct osdv2_cdb *ocdb = &or->cdb.v2; in _osdv2_req_encode_common()
637 static void _osd_req_encode_common(struct osd_request *or, in _osd_req_encode_common() argument
640 if (osd_req_is_ver1(or)) in _osd_req_encode_common()
641 _osdv1_req_encode_common(or, act, obj, offset, len); in _osd_req_encode_common()
643 _osdv2_req_encode_common(or, act, obj, offset, len); in _osd_req_encode_common()
652 void osd_req_format(struct osd_request *or, u64 tot_capacity) in osd_req_format() argument
654 _osd_req_encode_common(or, OSD_ACT_FORMAT_OSD, &osd_root_object, 0, in osd_req_format()
659 int osd_req_list_dev_partitions(struct osd_request *or, in osd_req_list_dev_partitions() argument
662 return osd_req_list_partition_objects(or, 0, initial_id, list, nelem); in osd_req_list_dev_partitions()
666 static void _osd_req_encode_flush(struct osd_request *or, in _osd_req_encode_flush() argument
669 struct osd_cdb_head *ocdb = osd_cdb_head(&or->cdb); in _osd_req_encode_flush()
674 void osd_req_flush_obsd(struct osd_request *or, in osd_req_flush_obsd() argument
677 _osd_req_encode_common(or, OSD_ACT_FLUSH_OSD, &osd_root_object, 0, 0); in osd_req_flush_obsd()
678 _osd_req_encode_flush(or, op); in osd_req_flush_obsd()
689 static void _osd_req_encode_partition(struct osd_request *or, in _osd_req_encode_partition() argument
697 _osd_req_encode_common(or, act, &par, 0, 0); in _osd_req_encode_partition()
700 void osd_req_create_partition(struct osd_request *or, osd_id partition) in osd_req_create_partition() argument
702 _osd_req_encode_partition(or, OSD_ACT_CREATE_PARTITION, partition); in osd_req_create_partition()
706 void osd_req_remove_partition(struct osd_request *or, osd_id partition) in osd_req_remove_partition() argument
708 _osd_req_encode_partition(or, OSD_ACT_REMOVE_PARTITION, partition); in osd_req_remove_partition()
716 static int _osd_req_list_objects(struct osd_request *or, in _osd_req_list_objects() argument
720 struct request_queue *q = osd_request_queue(or->osd_dev); in _osd_req_list_objects()
724 _osd_req_encode_common(or, action, obj, (u64)initial_id, len); in _osd_req_list_objects()
727 _osd_req_encode_olist(or, list); in _osd_req_list_objects()
729 WARN_ON(or->in.bio); in _osd_req_list_objects()
737 or->in.bio = bio; in _osd_req_list_objects()
738 or->in.total_bytes = bio->bi_iter.bi_size; in _osd_req_list_objects()
742 int osd_req_list_partition_collections(struct osd_request *or, in osd_req_list_partition_collections() argument
751 return osd_req_list_collection_objects(or, &par, initial_id, list, in osd_req_list_partition_collections()
756 int osd_req_list_partition_objects(struct osd_request *or, in osd_req_list_partition_objects() argument
765 return _osd_req_list_objects(or, OSD_ACT_LIST, &par, initial_id, list, in osd_req_list_partition_objects()
770 void osd_req_flush_partition(struct osd_request *or, in osd_req_flush_partition() argument
773 _osd_req_encode_partition(or, OSD_ACT_FLUSH_PARTITION, partition); in osd_req_flush_partition()
774 _osd_req_encode_flush(or, op); in osd_req_flush_partition()
786 int osd_req_list_collection_objects(struct osd_request *or, in osd_req_list_collection_objects() argument
790 return _osd_req_list_objects(or, OSD_ACT_LIST_COLLECTION, obj, in osd_req_list_collection_objects()
797 void osd_req_flush_collection(struct osd_request *or, in osd_req_flush_collection() argument
800 _osd_req_encode_common(or, OSD_ACT_FLUSH_PARTITION, obj, 0, 0); in osd_req_flush_collection()
801 _osd_req_encode_flush(or, op); in osd_req_flush_collection()
811 void osd_req_create_object(struct osd_request *or, struct osd_obj_id *obj) in osd_req_create_object() argument
813 _osd_req_encode_common(or, OSD_ACT_CREATE, obj, 0, 0); in osd_req_create_object()
817 void osd_req_remove_object(struct osd_request *or, struct osd_obj_id *obj) in osd_req_remove_object() argument
819 _osd_req_encode_common(or, OSD_ACT_REMOVE, obj, 0, 0); in osd_req_remove_object()
824 /*TODO: void osd_req_create_multi(struct osd_request *or,
828 void osd_req_write(struct osd_request *or, in osd_req_write() argument
832 _osd_req_encode_common(or, OSD_ACT_WRITE, obj, offset, len); in osd_req_write()
833 WARN_ON(or->out.bio || or->out.total_bytes); in osd_req_write()
835 or->out.bio = bio; in osd_req_write()
836 or->out.total_bytes = len; in osd_req_write()
840 int osd_req_write_kern(struct osd_request *or, in osd_req_write_kern() argument
843 struct request_queue *req_q = osd_request_queue(or->osd_dev); in osd_req_write_kern()
850 osd_req_write(or, obj, offset, bio, len); in osd_req_write_kern()
864 void osd_req_flush_object(struct osd_request *or, in osd_req_flush_object() argument
868 if (unlikely(osd_req_is_ver1(or) && (offset || len))) { in osd_req_flush_object()
874 _osd_req_encode_common(or, OSD_ACT_FLUSH, obj, offset, len); in osd_req_flush_object()
875 _osd_req_encode_flush(or, op); in osd_req_flush_object()
879 void osd_req_read(struct osd_request *or, in osd_req_read() argument
883 _osd_req_encode_common(or, OSD_ACT_READ, obj, offset, len); in osd_req_read()
884 WARN_ON(or->in.bio || or->in.total_bytes); in osd_req_read()
886 or->in.bio = bio; in osd_req_read()
887 or->in.total_bytes = len; in osd_req_read()
891 int osd_req_read_kern(struct osd_request *or, in osd_req_read_kern() argument
894 struct request_queue *req_q = osd_request_queue(or->osd_dev); in osd_req_read_kern()
900 osd_req_read(or, obj, offset, bio, len); in osd_req_read_kern()
905 static int _add_sg_continuation_descriptor(struct osd_request *or, in _add_sg_continuation_descriptor() argument
915 if (!or->cdb_cont.total_bytes) { in _add_sg_continuation_descriptor()
919 or->cdb_cont.total_bytes = in _add_sg_continuation_descriptor()
923 ret = _alloc_cdb_cont(or, or->cdb_cont.total_bytes + oscd_size); in _add_sg_continuation_descriptor()
927 oscd = or->cdb_cont.buff + or->cdb_cont.total_bytes; in _add_sg_continuation_descriptor()
940 or->cdb_cont.total_bytes += oscd_size; in _add_sg_continuation_descriptor()
942 or->cdb_cont.total_bytes, oscd_size, numentries); in _add_sg_continuation_descriptor()
946 static int _osd_req_finalize_cdb_cont(struct osd_request *or, const u8 *cap_key) in _osd_req_finalize_cdb_cont() argument
948 struct request_queue *req_q = osd_request_queue(or->osd_dev); in _osd_req_finalize_cdb_cont()
950 struct osd_cdb_head *cdbh = osd_cdb_head(&or->cdb); in _osd_req_finalize_cdb_cont()
953 if (!or->cdb_cont.total_bytes) in _osd_req_finalize_cdb_cont()
956 cont_seg_hdr = or->cdb_cont.buff; in _osd_req_finalize_cdb_cont()
961 bio = bio_map_kern(req_q, or->cdb_cont.buff, or->cdb_cont.total_bytes, in _osd_req_finalize_cdb_cont()
974 cdbh->v2.cdb_continuation_length = cpu_to_be32(or->cdb_cont.total_bytes); in _osd_req_finalize_cdb_cont()
981 bio->bi_next = or->out.bio; in _osd_req_finalize_cdb_cont()
982 or->out.bio = bio; in _osd_req_finalize_cdb_cont()
983 or->out.total_bytes += or->cdb_cont.total_bytes; in _osd_req_finalize_cdb_cont()
991 * may overlap and/or be in any order. The only constrain is that:
994 int osd_req_write_sg(struct osd_request *or, in osd_req_write_sg() argument
999 int ret = _add_sg_continuation_descriptor(or, sglist, numentries, &len); in osd_req_write_sg()
1003 osd_req_write(or, obj, 0, bio, len); in osd_req_write_sg()
1012 int osd_req_read_sg(struct osd_request *or, in osd_req_read_sg() argument
1022 ret = _add_sg_continuation_descriptor(or, sglist, numentries, in osd_req_read_sg()
1033 osd_req_read(or, obj, off, bio, len); in osd_req_read_sg()
1047 static struct bio *_create_sg_bios(struct osd_request *or, in _create_sg_bios() argument
1050 struct request_queue *q = osd_request_queue(or->osd_dev); in _create_sg_bios()
1079 int osd_req_write_sg_kern(struct osd_request *or, in osd_req_write_sg_kern() argument
1083 struct bio *bio = _create_sg_bios(or, buff, sglist, numentries); in osd_req_write_sg_kern()
1088 osd_req_write_sg(or, obj, bio, sglist, numentries); in osd_req_write_sg_kern()
1094 int osd_req_read_sg_kern(struct osd_request *or, in osd_req_read_sg_kern() argument
1098 struct bio *bio = _create_sg_bios(or, buff, sglist, numentries); in osd_req_read_sg_kern()
1102 osd_req_read_sg(or, obj, bio, sglist, numentries); in osd_req_read_sg_kern()
1110 void osd_req_get_attributes(struct osd_request *or, in osd_req_get_attributes() argument
1113 _osd_req_encode_common(or, OSD_ACT_GET_ATTRIBUTES, obj, 0, 0); in osd_req_get_attributes()
1117 void osd_req_set_attributes(struct osd_request *or, in osd_req_set_attributes() argument
1120 _osd_req_encode_common(or, OSD_ACT_SET_ATTRIBUTES, obj, 0, 0); in osd_req_set_attributes()
1128 int osd_req_add_set_attr_list(struct osd_request *or, in osd_req_add_set_attr_list() argument
1131 unsigned total_bytes = or->set_attr.total_bytes; in osd_req_add_set_attr_list()
1135 if (or->attributes_mode && in osd_req_add_set_attr_list()
1136 or->attributes_mode != OSD_CDB_GET_SET_ATTR_LISTS) { in osd_req_add_set_attr_list()
1140 or->attributes_mode = OSD_CDB_GET_SET_ATTR_LISTS; in osd_req_add_set_attr_list()
1143 total_bytes = _osd_req_sizeof_alist_header(or); in osd_req_add_set_attr_list()
1144 ret = _alloc_set_attr_list(or, oa, nelem, total_bytes); in osd_req_add_set_attr_list()
1147 _osd_req_set_alist_type(or, or->set_attr.buff, in osd_req_add_set_attr_list()
1150 attr_last = or->set_attr.buff + total_bytes; in osd_req_add_set_attr_list()
1153 unsigned elem_size = _osd_req_alist_elem_size(or, oa->len); in osd_req_add_set_attr_list()
1156 if (unlikely(or->set_attr.alloc_size < total_bytes)) { in osd_req_add_set_attr_list()
1157 or->set_attr.total_bytes = total_bytes - elem_size; in osd_req_add_set_attr_list()
1158 ret = _alloc_set_attr_list(or, oa, nelem, total_bytes); in osd_req_add_set_attr_list()
1162 or->set_attr.buff + or->set_attr.total_bytes; in osd_req_add_set_attr_list()
1165 _osd_req_alist_elem_encode(or, attr_last, oa); in osd_req_add_set_attr_list()
1171 or->set_attr.total_bytes = total_bytes; in osd_req_add_set_attr_list()
1176 static int _req_append_segment(struct osd_request *or, in _req_append_segment() argument
1209 static int _osd_req_finalize_set_attr_list(struct osd_request *or) in _osd_req_finalize_set_attr_list() argument
1211 struct osd_cdb_head *cdbh = osd_cdb_head(&or->cdb); in _osd_req_finalize_set_attr_list()
1215 if (!or->set_attr.total_bytes) { in _osd_req_finalize_set_attr_list()
1220 cdbh->attrs_list.set_attr_bytes = cpu_to_be32(or->set_attr.total_bytes); in _osd_req_finalize_set_attr_list()
1222 osd_req_encode_offset(or, or->out.total_bytes, &padding); in _osd_req_finalize_set_attr_list()
1224 ret = _req_append_segment(or, padding, &or->set_attr, in _osd_req_finalize_set_attr_list()
1225 or->out.last_seg, &or->out); in _osd_req_finalize_set_attr_list()
1229 or->out.last_seg = &or->set_attr; in _osd_req_finalize_set_attr_list()
1233 int osd_req_add_get_attr_list(struct osd_request *or, in osd_req_add_get_attr_list() argument
1236 unsigned total_bytes = or->enc_get_attr.total_bytes; in osd_req_add_get_attr_list()
1240 if (or->attributes_mode && in osd_req_add_get_attr_list()
1241 or->attributes_mode != OSD_CDB_GET_SET_ATTR_LISTS) { in osd_req_add_get_attr_list()
1245 or->attributes_mode = OSD_CDB_GET_SET_ATTR_LISTS; in osd_req_add_get_attr_list()
1248 if (!or->get_attr.total_bytes) in osd_req_add_get_attr_list()
1249 or->get_attr.total_bytes = _osd_req_sizeof_alist_header(or); in osd_req_add_get_attr_list()
1255 total_bytes = _osd_req_sizeof_alist_header(or); in osd_req_add_get_attr_list()
1258 ret = _alloc_get_attr_desc(or, max_bytes); in osd_req_add_get_attr_list()
1262 _osd_req_set_alist_type(or, or->enc_get_attr.buff, in osd_req_add_get_attr_list()
1265 attr_last = or->enc_get_attr.buff + total_bytes; in osd_req_add_get_attr_list()
1272 if (unlikely(or->enc_get_attr.alloc_size < total_bytes)) { in osd_req_add_get_attr_list()
1273 or->enc_get_attr.total_bytes = total_bytes - cur_size; in osd_req_add_get_attr_list()
1274 ret = _alloc_get_attr_desc(or, in osd_req_add_get_attr_list()
1278 attr_last = or->enc_get_attr.buff + in osd_req_add_get_attr_list()
1279 or->enc_get_attr.total_bytes; in osd_req_add_get_attr_list()
1289 or->get_attr.total_bytes += in osd_req_add_get_attr_list()
1290 _osd_req_alist_elem_size(or, oa->len); in osd_req_add_get_attr_list()
1294 or->enc_get_attr.total_bytes = total_bytes; in osd_req_add_get_attr_list()
1298 or->get_attr.total_bytes, in osd_req_add_get_attr_list()
1299 or->get_attr.total_bytes - _osd_req_sizeof_alist_header(or), in osd_req_add_get_attr_list()
1300 or->enc_get_attr.total_bytes, in osd_req_add_get_attr_list()
1301 (or->enc_get_attr.total_bytes - _osd_req_sizeof_alist_header(or)) in osd_req_add_get_attr_list()
1308 static int _osd_req_finalize_get_attr_list(struct osd_request *or) in _osd_req_finalize_get_attr_list() argument
1310 struct osd_cdb_head *cdbh = osd_cdb_head(&or->cdb); in _osd_req_finalize_get_attr_list()
1315 if (!or->enc_get_attr.total_bytes) { in _osd_req_finalize_get_attr_list()
1321 ret = _alloc_get_attr_list(or); in _osd_req_finalize_get_attr_list()
1328 cpu_to_be32(or->enc_get_attr.total_bytes); in _osd_req_finalize_get_attr_list()
1331 osd_req_encode_offset(or, or->out.total_bytes, &out_padding); in _osd_req_finalize_get_attr_list()
1333 ret = _req_append_segment(or, out_padding, &or->enc_get_attr, in _osd_req_finalize_get_attr_list()
1334 or->out.last_seg, &or->out); in _osd_req_finalize_get_attr_list()
1337 or->out.last_seg = &or->enc_get_attr; in _osd_req_finalize_get_attr_list()
1342 cpu_to_be32(or->get_attr.total_bytes); in _osd_req_finalize_get_attr_list()
1345 osd_req_encode_offset(or, or->in.total_bytes, &in_padding); in _osd_req_finalize_get_attr_list()
1347 ret = _req_append_segment(or, in_padding, &or->get_attr, NULL, in _osd_req_finalize_get_attr_list()
1348 &or->in); in _osd_req_finalize_get_attr_list()
1351 or->in.last_seg = &or->get_attr; in _osd_req_finalize_get_attr_list()
1356 int osd_req_decode_get_attr_list(struct osd_request *or, in osd_req_decode_get_attr_list() argument
1361 const unsigned sizeof_attr_list = _osd_req_sizeof_alist_header(or); in osd_req_decode_get_attr_list()
1364 if (!_osd_req_is_alist_type(or, or->get_attr.buff, in osd_req_decode_get_attr_list()
1375 BUG_ON((*iterator < or->get_attr.buff) || in osd_req_decode_get_attr_list()
1376 (or->get_attr.buff + or->get_attr.alloc_size < *iterator)); in osd_req_decode_get_attr_list()
1378 cur_bytes = (*iterator - or->get_attr.buff) - sizeof_attr_list; in osd_req_decode_get_attr_list()
1379 returned_bytes = or->get_attr.total_bytes; in osd_req_decode_get_attr_list()
1382 returned_bytes = _osd_req_alist_size(or, or->get_attr.buff) + in osd_req_decode_get_attr_list()
1385 cur_p = or->get_attr.buff + sizeof_attr_list; in osd_req_decode_get_attr_list()
1387 if (returned_bytes > or->get_attr.alloc_size) { in osd_req_decode_get_attr_list()
1390 or->get_attr.alloc_size, in osd_req_decode_get_attr_list()
1394 or->get_attr.alloc_size - sizeof_attr_list; in osd_req_decode_get_attr_list()
1396 or->get_attr.total_bytes = returned_bytes; in osd_req_decode_get_attr_list()
1400 int inc = _osd_req_alist_elem_decode(or, cur_p, oa, in osd_req_decode_get_attr_list()
1427 int osd_req_add_get_attr_page(struct osd_request *or, in osd_req_add_get_attr_page() argument
1431 struct osd_cdb_head *cdbh = osd_cdb_head(&or->cdb); in osd_req_add_get_attr_page()
1433 if (or->attributes_mode && 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()
1438 or->attributes_mode = OSD_CDB_GET_ATTR_PAGE_SET_ONE; in osd_req_add_get_attr_page()
1440 or->get_attr.buff = attar_page; in osd_req_add_get_attr_page()
1441 or->get_attr.total_bytes = max_page_len; in osd_req_add_get_attr_page()
1449 or->set_attr.buff = set_one_attr->val_ptr; in osd_req_add_get_attr_page()
1450 or->set_attr.total_bytes = set_one_attr->len; in osd_req_add_get_attr_page()
1459 static int _osd_req_finalize_attr_page(struct osd_request *or) in _osd_req_finalize_attr_page() argument
1461 struct osd_cdb_head *cdbh = osd_cdb_head(&or->cdb); in _osd_req_finalize_attr_page()
1467 osd_req_encode_offset(or, or->in.total_bytes, &in_padding); in _osd_req_finalize_attr_page()
1469 ret = _req_append_segment(or, in_padding, &or->get_attr, NULL, in _osd_req_finalize_attr_page()
1470 &or->in); in _osd_req_finalize_attr_page()
1474 if (or->set_attr.total_bytes == 0) in _osd_req_finalize_attr_page()
1479 osd_req_encode_offset(or, or->out.total_bytes, &out_padding); in _osd_req_finalize_attr_page()
1481 ret = _req_append_segment(or, out_padding, &or->set_attr, NULL, in _osd_req_finalize_attr_page()
1482 &or->out); in _osd_req_finalize_attr_page()
1504 static int _osd_req_finalize_data_integrity(struct osd_request *or, in _osd_req_finalize_data_integrity() argument
1508 struct osd_security_parameters *sec_parms = _osd_req_sec_params(or); in _osd_req_finalize_data_integrity()
1516 .buff = &or->out_data_integ, in _osd_req_finalize_data_integrity()
1517 .total_bytes = sizeof(or->out_data_integ), in _osd_req_finalize_data_integrity()
1521 or->out_data_integ.data_bytes = cpu_to_be64(out_data_bytes); in _osd_req_finalize_data_integrity()
1522 or->out_data_integ.set_attributes_bytes = cpu_to_be64( in _osd_req_finalize_data_integrity()
1523 or->set_attr.total_bytes); in _osd_req_finalize_data_integrity()
1524 or->out_data_integ.get_attributes_bytes = cpu_to_be64( in _osd_req_finalize_data_integrity()
1525 or->enc_get_attr.total_bytes); in _osd_req_finalize_data_integrity()
1527 osd_sec_parms_set_out_offset(osd_req_is_ver1(or), sec_parms, in _osd_req_finalize_data_integrity()
1528 osd_req_encode_offset(or, or->out.total_bytes, &pad)); in _osd_req_finalize_data_integrity()
1530 ret = _req_append_segment(or, pad, &seg, or->out.last_seg, in _osd_req_finalize_data_integrity()
1531 &or->out); in _osd_req_finalize_data_integrity()
1534 or->out.last_seg = NULL; in _osd_req_finalize_data_integrity()
1537 osd_sec_sign_data(&or->out_data_integ, out_data_bio, in _osd_req_finalize_data_integrity()
1543 .buff = &or->in_data_integ, in _osd_req_finalize_data_integrity()
1544 .total_bytes = sizeof(or->in_data_integ), in _osd_req_finalize_data_integrity()
1548 osd_sec_parms_set_in_offset(osd_req_is_ver1(or), sec_parms, in _osd_req_finalize_data_integrity()
1549 osd_req_encode_offset(or, or->in.total_bytes, &pad)); in _osd_req_finalize_data_integrity()
1551 ret = _req_append_segment(or, pad, &seg, or->in.last_seg, in _osd_req_finalize_data_integrity()
1552 &or->in); in _osd_req_finalize_data_integrity()
1556 or->in.last_seg = NULL; in _osd_req_finalize_data_integrity()
1588 static int _init_blk_request(struct osd_request *or, in _init_blk_request() argument
1591 struct scsi_device *scsi_device = or->osd_dev->scsi_device; in _init_blk_request()
1596 req = _make_request(q, has_out, has_out ? &or->out : &or->in); in _init_blk_request()
1602 or->request = req; in _init_blk_request()
1605 req->timeout = or->timeout; in _init_blk_request()
1606 scsi_req(req)->retries = or->retries; in _init_blk_request()
1609 or->out.req = req; in _init_blk_request()
1612 req = _make_request(q, false, &or->in); in _init_blk_request()
1618 or->in.req = or->request->next_rq = req; in _init_blk_request()
1621 or->in.req = req; in _init_blk_request()
1625 OSD_DEBUG("or=%p has_in=%d has_out=%d => %d, %p\n", in _init_blk_request()
1626 or, has_in, has_out, ret, or->request); in _init_blk_request()
1630 int osd_finalize_request(struct osd_request *or, in osd_finalize_request() argument
1633 struct osd_cdb_head *cdbh = osd_cdb_head(&or->cdb); in osd_finalize_request()
1636 struct bio *out_data_bio = or->out.bio; in osd_finalize_request()
1637 u64 out_data_bytes = or->out.total_bytes; in osd_finalize_request()
1649 osd_set_caps(&or->cdb, cap); in osd_finalize_request()
1651 has_in = or->in.bio || or->get_attr.total_bytes; in osd_finalize_request()
1652 has_out = or->out.bio || or->cdb_cont.total_bytes || in osd_finalize_request()
1653 or->set_attr.total_bytes || or->enc_get_attr.total_bytes; in osd_finalize_request()
1655 ret = _osd_req_finalize_cdb_cont(or, cap_key); in osd_finalize_request()
1660 ret = _init_blk_request(or, has_in, has_out); in osd_finalize_request()
1666 or->out.pad_buff = sg_out_pad_buffer; in osd_finalize_request()
1667 or->in.pad_buff = sg_in_pad_buffer; in osd_finalize_request()
1669 if (!or->attributes_mode) in osd_finalize_request()
1670 or->attributes_mode = OSD_CDB_GET_SET_ATTR_LISTS; in osd_finalize_request()
1671 cdbh->command_specific_options |= or->attributes_mode; in osd_finalize_request()
1672 if (or->attributes_mode == OSD_CDB_GET_ATTR_PAGE_SET_ONE) { in osd_finalize_request()
1673 ret = _osd_req_finalize_attr_page(or); in osd_finalize_request()
1683 ret = _osd_req_finalize_set_attr_list(or); in osd_finalize_request()
1689 ret = _osd_req_finalize_get_attr_list(or); in osd_finalize_request()
1696 ret = _osd_req_finalize_data_integrity(or, has_in, has_out, in osd_finalize_request()
1702 osd_sec_sign_cdb(&or->cdb, cap_key); in osd_finalize_request()
1704 scsi_req(or->request)->cmd = or->cdb.buff; in osd_finalize_request()
1705 scsi_req(or->request)->cmd_len = _osd_req_cdb_len(or); in osd_finalize_request()
1728 int osd_req_decode_sense_full(struct osd_request *or, in osd_req_decode_sense_full() argument
1744 if (likely(!or->req_errors)) in osd_req_decode_sense_full()
1750 ssdb = (typeof(ssdb))or->sense; in osd_req_decode_sense_full()
1751 sense_len = or->sense_len; in osd_req_decode_sense_full()
1755 or->req_errors, sense_len, ssdb->sense_key); in osd_req_decode_sense_full()
1776 osi->additional_code, or->async_error, in osd_req_decode_sense_full()
1777 or->req_errors); in osd_req_decode_sense_full()
1914 if (or->async_error == BLK_STS_RESOURCE) in osd_req_decode_sense_full()
1918 ret = or->async_error; in osd_req_decode_sense_full()
1947 if (!or->out.residual) in osd_req_decode_sense_full()
1948 or->out.residual = or->out.total_bytes; in osd_req_decode_sense_full()
1949 if (!or->in.residual) in osd_req_decode_sense_full()
1950 or->in.residual = or->in.total_bytes; in osd_req_decode_sense_full()