Blob Blame History Raw
From a3028f7eac6b9e05e11e91fc41abcf3359276295 Mon Sep 17 00:00:00 2001
From: David Disseldorp <ddiss@suse.de>
Date: Fri, 2 Jun 2017 01:18:46 +0200
Subject: [PATCH 1/4] rbd: ensure r_request is allocated for creatrunc
Patch-mainline: Not yet, clustered LIO/RBD
References: bsc#1042210

Upstream commit 13d1ad16d05e ("libceph: move message allocation out of
ceph_osdc_alloc_request()") added the requirement for a
ceph_osdc_alloc_messages() call after ceph_osdc_alloc_request(). This
is needed for the downstream cmpext create+truncate fallback codepath
to avoid a r_request NULL pointer dereference in encode_request().

Signed-off-by: David Disseldorp <ddiss@suse.de>
Acked-by: Luis Henriques <lhenriques@suse.com>
---
 drivers/block/rbd.c | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 1c92df9e2f81..fd124bc7b4c4 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -3088,8 +3088,7 @@ out:
  * the same request.
  * Like rbd_img_obj_exists_submit(), this function tracks the original request
  * through to the callback via creatrunc_req->osd_req, which means that
- * creatrunc_req->img_request users (e.g. rbd_osd_req_create() and
- * rbd_osd_req_format_write()) must be avoided.
+ * creatrunc_req->img_request users (i.e. rbd_osd_req_create()) must be avoided.
  */
 static int
 rbd_img_obj_creatrunc_submit(struct rbd_obj_request *obj_request)
@@ -3130,8 +3129,13 @@ rbd_img_obj_creatrunc_submit(struct rbd_obj_request *obj_request)
 	osd_req->r_callback = rbd_osd_req_callback;
 	osd_req->r_priv = creatrunc_req;
 	osd_req->r_base_oloc.pool = rbd_dev->layout.pool_id;
-	if (ceph_oid_aprintf(&osd_req->r_base_oid, GFP_NOIO, "%s",
-			     creatrunc_req->object_name))
+	ret = ceph_oid_aprintf(&osd_req->r_base_oid, GFP_NOIO, "%s",
+			       creatrunc_req->object_name);
+	if (ret)
+		goto fail_creatrunc_request;
+
+	ret = ceph_osdc_alloc_messages(osd_req, GFP_KERNEL);
+	if (ret)
 		goto fail_creatrunc_request;
 
 	creatrunc_req->osd_req = osd_req;
@@ -3143,8 +3147,7 @@ rbd_img_obj_creatrunc_submit(struct rbd_obj_request *obj_request)
 	osd_req_op_extent_init(creatrunc_req->osd_req, 1, CEPH_OSD_OP_TRUNCATE,
 				object_size, 0, 0, 0);
 
-	/* rbd_osd_req_format_write() using snapc from img_request */
-	creatrunc_req->osd_req->r_mtime = CURRENT_TIME;
+	rbd_osd_req_format_write(creatrunc_req);
 
 	rbd_obj_request_submit(creatrunc_req);
 
-- 
2.12.3