Blob Blame History Raw
From 4e68ec92c7330b06436babb96cf627c937d7a150 Mon Sep 17 00:00:00 2001
From: David Disseldorp <ddiss@suse.de>
Date: Fri, 21 Aug 2015 18:09:28 +0200
Subject: [PATCH] rbd: add setxattr device attribute for debugging
Patch-mainline: Not yet, SES2 clustered LIO/RBD
References: fate#318836

Allows for the testing of the kernel RADOS setxattr functionality.

Signed-off-by: David Disseldorp <ddiss@suse.de>
---
 drivers/block/rbd.c |   34 ++++++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)

--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -125,6 +125,8 @@ static int atomic_dec_return_safe(atomic
 
 #define RBD_FEATURES_SUPPORTED	(RBD_FEATURES_ALL)
 
+#define RBD_MAX_XATTR_STR_LEN	128
+
 /*
  * An rbd image specification.
  *
@@ -4757,6 +4759,36 @@ out:
 }
 EXPORT_SYMBOL(rbd_dev_setxattr);
 
+/*
+ * TODO: remove me or move to debugfs for final merge.
+ */
+static ssize_t rbd_setxattr_set(struct device *dev,
+				struct device_attribute *attr,
+				const char *buf, size_t size)
+{
+	struct rbd_device *rbd_dev = dev_to_rbd_dev(dev);
+	char key[RBD_MAX_XATTR_STR_LEN];
+	char val[RBD_MAX_XATTR_STR_LEN];
+	int ret;
+
+	ret = sscanf(buf, "%" __stringify(RBD_MAX_XATTR_STR_LEN) "s %"
+		     __stringify(RBD_MAX_XATTR_STR_LEN) "s\n", key, val);
+	if (ret != 2) {
+		rbd_warn(rbd_dev, "Invalid number of params. Got %d", ret);
+		return -EINVAL;
+	} else if (!strlen(key) || !strlen(val)) {
+		rbd_warn(rbd_dev, "missing param");
+		return -EINVAL;
+	}
+
+	/* +1 to store null term */
+	ret = rbd_dev_setxattr(rbd_dev, key, val, strlen(val) + 1);
+	if (ret)
+		return ret;
+	else
+		return size;
+}
+
 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);
@@ -4773,6 +4805,7 @@ static DEVICE_ATTR(refresh, S_IWUSR, NUL
 static DEVICE_ATTR(current_snap, S_IRUGO, rbd_snap_show, NULL);
 static DEVICE_ATTR(snap_id, S_IRUGO, rbd_snap_id_show, NULL);
 static DEVICE_ATTR(parent, S_IRUGO, rbd_parent_show, NULL);
+static DEVICE_ATTR(setxattr, S_IWUSR, NULL, rbd_setxattr_set);
 
 static struct attribute *rbd_attrs[] = {
 	&dev_attr_size.attr,
@@ -4791,6 +4824,7 @@ static struct attribute *rbd_attrs[] = {
 	&dev_attr_snap_id.attr,
 	&dev_attr_parent.attr,
 	&dev_attr_refresh.attr,
+	&dev_attr_setxattr.attr,
 	NULL
 };