Blob Blame History Raw
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;