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