From 67b562dd81ec7387e55e74176a4960e75561eecb Mon Sep 17 00:00:00 2001
From: David Disseldorp <ddiss@suse.de>
Date: Sat, 22 Aug 2015 18:52:53 +0200
Subject: [PATCH] rbd: add getxattr device attribute for debugging
Patch-mainline: Not yet, SES2 clustered LIO/RBD
References: fate#318836
Signed-off-by: David Disseldorp <ddiss@suse.de>
---
drivers/block/rbd.c | 39 +++++++++++++++++++++++++++++++++++++++
1 file changed, 39 insertions(+)
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -4933,6 +4933,43 @@ static ssize_t rbd_cmpsetxattr_set(struc
return size;
}
+static ssize_t rbd_getxattr_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 = NULL;
+ int val_len = 0;
+ int ret;
+
+ ret = sscanf(buf, "%" __stringify(RBD_MAX_XATTR_STR_LEN) "s\n", key);
+ if (ret != 1) {
+ rbd_warn(rbd_dev, "Invalid number of params. Got %d", ret);
+ return -EINVAL;
+ } else if (!strlen(key)) {
+ rbd_warn(rbd_dev, "missing param");
+ return -EINVAL;
+ }
+
+ ret = rbd_dev_getxattr(rbd_dev, key, RBD_MAX_XATTR_STR_LEN,
+ (void **)&val, &val_len);
+ if (ret)
+ return ret;
+
+ if (!val_len)
+ return size;
+
+ if (val[val_len - 1] == '\0') {
+ rbd_warn(rbd_dev, "%s: %s", key, val);
+ } else {
+ rbd_warn(rbd_dev, "%s: %*ph", key, val_len, val);
+ }
+ kfree(val);
+
+ 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);
@@ -4951,6 +4988,7 @@ static DEVICE_ATTR(snap_id, S_IRUGO, rbd
static DEVICE_ATTR(parent, S_IRUGO, rbd_parent_show, NULL);
static DEVICE_ATTR(setxattr, S_IWUSR, NULL, rbd_setxattr_set);
static DEVICE_ATTR(cmpsetxattr, S_IWUSR, NULL, rbd_cmpsetxattr_set);
+static DEVICE_ATTR(getxattr, S_IWUSR, NULL, rbd_getxattr_set);
static struct attribute *rbd_attrs[] = {
&dev_attr_size.attr,
@@ -4971,6 +5009,7 @@ static struct attribute *rbd_attrs[] = {
&dev_attr_refresh.attr,
&dev_attr_setxattr.attr,
&dev_attr_cmpsetxattr.attr,
+ &dev_attr_getxattr.attr,
NULL
};