From c833984aa399479a2a8b9c70b7fa7c4f8381c6be Mon Sep 17 00:00:00 2001
From: David Disseldorp <ddiss@suse.de>
Date: Wed, 21 Jun 2017 01:24:55 +0200
Subject: [PATCH 2/4] rbd: helper to copy compare-and-write osd requests
Patch-mainline: Not yet, clustered LIO/RBD
References: bsc#1042210
compare-and-write requests which require resubmission following
unwritten extent create-truncate fallback need to be copied, so that
OSD request ID reuse is avoided.
Add a helper function to perform this.
Signed-off-by: David Disseldorp <ddiss@suse.de>
Acked-by: Luis Henriques <lhenriques@suse.com>
[ddiss@suse.de: rebase for SLE15, without bi-directional OSD ops]
---
drivers/block/rbd.c | 33 +++++++++++++++++++++++++++++++++
1 file changed, 33 insertions(+)
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -2987,6 +2987,39 @@ fail_stat_request:
}
static void
+rbd_osd_cmp_and_write_req_copy(struct ceph_osd_request *dest_osd_req,
+ const struct ceph_osd_request *src_osd_req)
+{
+ int num_ops = 0;
+ const struct ceph_osd_req_op *src_op;
+
+ src_op = &src_osd_req->r_ops[num_ops];
+ osd_req_op_alloc_hint_init(dest_osd_req, num_ops,
+ src_op->alloc_hint.expected_object_size,
+ src_op->alloc_hint.expected_write_size);
+
+ num_ops++;
+ src_op = &src_osd_req->r_ops[num_ops];
+ osd_req_op_extent_init(dest_osd_req, num_ops, CEPH_OSD_OP_CMPEXT,
+ src_op->extent.offset, src_op->extent.length, 0,
+ 0);
+ osd_req_op_extent_osd_data_sg(dest_osd_req, num_ops,
+ src_op->extent.osd_data.sgl,
+ src_op->extent.osd_data.sgl_init_offset,
+ src_op->extent.osd_data.sgl_length);
+
+ num_ops++;
+ src_op = &src_osd_req->r_ops[num_ops];
+ osd_req_op_extent_init(dest_osd_req, num_ops, CEPH_OSD_OP_WRITE,
+ src_op->extent.offset, src_op->extent.length, 0,
+ 0);
+ osd_req_op_extent_osd_data_sg(dest_osd_req, num_ops,
+ src_op->extent.osd_data.sgl,
+ src_op->extent.osd_data.sgl_init_offset,
+ src_op->extent.osd_data.sgl_length);
+}
+
+static void
rbd_img_obj_creatrunc_callback(struct rbd_obj_request *obj_request)
{
struct rbd_obj_request *orig_request;