Blob Blame History Raw
From 6d522ef7a81d6c474ad27c55a5c27c605128eb90 Mon Sep 17 00:00:00 2001
From: David Disseldorp <ddiss@suse.de>
Date: Fri, 21 Aug 2015 18:07:32 +0200
Subject: [PATCH] rbd: add rbd_dev_setxattr() helper
Patch-mainline: Not yet, SES2 clustered LIO/RBD
References: fate#318836

To be used for persistent reservation state storage in future.

Signed-off-by: David Disseldorp <ddiss@suse.de>
---
 drivers/block/rbd.c         |   50 ++++++++++++++++++++++++++++++++++++++++++++
 include/linux/ceph/librbd.h |    2 +
 2 files changed, 52 insertions(+)

--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -1847,6 +1847,9 @@ static void rbd_osd_req_callback(struct
 	case CEPH_OSD_OP_CALL:
 		rbd_osd_call_callback(obj_request);
 		break;
+	case CEPH_OSD_OP_SETXATTR:
+		obj_request_done_set(obj_request);
+		break;
 	default:
 		rbd_warn(NULL, "unexpected OSD op: object_no %016llx opcode %d",
 			 obj_request->object_no, opcode);
@@ -4718,6 +4721,53 @@ static ssize_t rbd_image_refresh(struct
 	return size;
 }
 
+int rbd_dev_setxattr(struct rbd_device *rbd_dev, char *key, void *val,
+		     int val_len)
+{
+	struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc;
+	struct rbd_obj_request *obj_request;
+	int ret;
+
+	obj_request = rbd_obj_request_create(rbd_dev->header_name, 0, 0,
+					     OBJ_REQUEST_NODATA);
+	if (!obj_request)
+		return -ENOMEM;
+
+	obj_request->osd_req = rbd_osd_req_create(rbd_dev, OBJ_OP_WRITE, 1,
+						  obj_request);
+	if (!obj_request->osd_req) {
+		ret = -ENOMEM;
+		goto out;
+	}
+
+	ret = osd_req_op_xattr_init(obj_request->osd_req, 0, CEPH_OSD_OP_SETXATTR,
+				    key, val, val_len, 0, 0);
+	if (ret)
+		goto out;
+
+	rbd_osd_req_format_write(obj_request);
+
+	ret = rbd_obj_request_submit(osdc, obj_request);
+	if (ret)
+		goto out;
+
+	ret = rbd_obj_request_wait(obj_request);
+	if (ret)
+		goto out;
+
+	ret = obj_request->result;
+	if (ret) {
+		goto out;
+	}
+
+	ret = 0;
+out:
+	rbd_obj_request_put(obj_request);
+
+	return ret;
+}
+EXPORT_SYMBOL(rbd_dev_setxattr);
+
 static DEVICE_ATTR(size, S_IRUGO, rbd_size_show, NULL);
 static DEVICE_ATTR(features, S_IRUGO, rbd_features_show, NULL);
 static DEVICE_ATTR(major, S_IRUGO, rbd_major_show, NULL);
--- a/include/linux/ceph/librbd.h
+++ b/include/linux/ceph/librbd.h
@@ -199,5 +199,7 @@ extern int rbd_img_request_fill(struct r
 				enum obj_request_type type, void *data_desc);
 extern int rbd_img_request_submit(struct rbd_img_request *img_request);
 extern void rbd_img_request_put(struct rbd_img_request *img_request);
+extern int rbd_dev_setxattr(struct rbd_device *rbd_dev, char *key, void *val,
+			    int val_len);
 
 #endif