|
@@ -155,6 +155,13 @@ static void ceph_osd_data_bio_init(struct ceph_osd_data *osd_data,
|
|
}
|
|
}
|
|
#endif /* CONFIG_BLOCK */
|
|
#endif /* CONFIG_BLOCK */
|
|
|
|
|
|
|
|
+static void ceph_osd_data_bvecs_init(struct ceph_osd_data *osd_data,
|
|
|
|
+ struct ceph_bvec_iter *bvec_pos)
|
|
|
|
+{
|
|
|
|
+ osd_data->type = CEPH_OSD_DATA_TYPE_BVECS;
|
|
|
|
+ osd_data->bvec_pos = *bvec_pos;
|
|
|
|
+}
|
|
|
|
+
|
|
#define osd_req_op_data(oreq, whch, typ, fld) \
|
|
#define osd_req_op_data(oreq, whch, typ, fld) \
|
|
({ \
|
|
({ \
|
|
struct ceph_osd_request *__oreq = (oreq); \
|
|
struct ceph_osd_request *__oreq = (oreq); \
|
|
@@ -229,6 +236,17 @@ void osd_req_op_extent_osd_data_bio(struct ceph_osd_request *osd_req,
|
|
EXPORT_SYMBOL(osd_req_op_extent_osd_data_bio);
|
|
EXPORT_SYMBOL(osd_req_op_extent_osd_data_bio);
|
|
#endif /* CONFIG_BLOCK */
|
|
#endif /* CONFIG_BLOCK */
|
|
|
|
|
|
|
|
+void osd_req_op_extent_osd_data_bvec_pos(struct ceph_osd_request *osd_req,
|
|
|
|
+ unsigned int which,
|
|
|
|
+ struct ceph_bvec_iter *bvec_pos)
|
|
|
|
+{
|
|
|
|
+ struct ceph_osd_data *osd_data;
|
|
|
|
+
|
|
|
|
+ osd_data = osd_req_op_data(osd_req, which, extent, osd_data);
|
|
|
|
+ ceph_osd_data_bvecs_init(osd_data, bvec_pos);
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL(osd_req_op_extent_osd_data_bvec_pos);
|
|
|
|
+
|
|
static void osd_req_op_cls_request_info_pagelist(
|
|
static void osd_req_op_cls_request_info_pagelist(
|
|
struct ceph_osd_request *osd_req,
|
|
struct ceph_osd_request *osd_req,
|
|
unsigned int which, struct ceph_pagelist *pagelist)
|
|
unsigned int which, struct ceph_pagelist *pagelist)
|
|
@@ -266,6 +284,23 @@ void osd_req_op_cls_request_data_pages(struct ceph_osd_request *osd_req,
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(osd_req_op_cls_request_data_pages);
|
|
EXPORT_SYMBOL(osd_req_op_cls_request_data_pages);
|
|
|
|
|
|
|
|
+void osd_req_op_cls_request_data_bvecs(struct ceph_osd_request *osd_req,
|
|
|
|
+ unsigned int which,
|
|
|
|
+ struct bio_vec *bvecs, u32 bytes)
|
|
|
|
+{
|
|
|
|
+ struct ceph_osd_data *osd_data;
|
|
|
|
+ struct ceph_bvec_iter it = {
|
|
|
|
+ .bvecs = bvecs,
|
|
|
|
+ .iter = { .bi_size = bytes },
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ osd_data = osd_req_op_data(osd_req, which, cls, request_data);
|
|
|
|
+ ceph_osd_data_bvecs_init(osd_data, &it);
|
|
|
|
+ osd_req->r_ops[which].cls.indata_len += bytes;
|
|
|
|
+ osd_req->r_ops[which].indata_len += bytes;
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL(osd_req_op_cls_request_data_bvecs);
|
|
|
|
+
|
|
void osd_req_op_cls_response_data_pages(struct ceph_osd_request *osd_req,
|
|
void osd_req_op_cls_response_data_pages(struct ceph_osd_request *osd_req,
|
|
unsigned int which, struct page **pages, u64 length,
|
|
unsigned int which, struct page **pages, u64 length,
|
|
u32 alignment, bool pages_from_pool, bool own_pages)
|
|
u32 alignment, bool pages_from_pool, bool own_pages)
|
|
@@ -291,6 +326,8 @@ static u64 ceph_osd_data_length(struct ceph_osd_data *osd_data)
|
|
case CEPH_OSD_DATA_TYPE_BIO:
|
|
case CEPH_OSD_DATA_TYPE_BIO:
|
|
return (u64)osd_data->bio_length;
|
|
return (u64)osd_data->bio_length;
|
|
#endif /* CONFIG_BLOCK */
|
|
#endif /* CONFIG_BLOCK */
|
|
|
|
+ case CEPH_OSD_DATA_TYPE_BVECS:
|
|
|
|
+ return osd_data->bvec_pos.iter.bi_size;
|
|
default:
|
|
default:
|
|
WARN(true, "unrecognized data type %d\n", (int)osd_data->type);
|
|
WARN(true, "unrecognized data type %d\n", (int)osd_data->type);
|
|
return 0;
|
|
return 0;
|
|
@@ -831,6 +868,8 @@ static void ceph_osdc_msg_data_add(struct ceph_msg *msg,
|
|
} else if (osd_data->type == CEPH_OSD_DATA_TYPE_BIO) {
|
|
} else if (osd_data->type == CEPH_OSD_DATA_TYPE_BIO) {
|
|
ceph_msg_data_add_bio(msg, &osd_data->bio_pos, length);
|
|
ceph_msg_data_add_bio(msg, &osd_data->bio_pos, length);
|
|
#endif
|
|
#endif
|
|
|
|
+ } else if (osd_data->type == CEPH_OSD_DATA_TYPE_BVECS) {
|
|
|
|
+ ceph_msg_data_add_bvecs(msg, &osd_data->bvec_pos);
|
|
} else {
|
|
} else {
|
|
BUG_ON(osd_data->type != CEPH_OSD_DATA_TYPE_NONE);
|
|
BUG_ON(osd_data->type != CEPH_OSD_DATA_TYPE_NONE);
|
|
}
|
|
}
|