Blob Blame History Raw
From a5bfc34f9e961d8c288f4ee7aae84a33b3e655ca Mon Sep 17 00:00:00 2001
From: David Disseldorp <ddiss@suse.de>
Date: Thu, 1 Oct 2020 01:06:23 +0200
Subject: [PATCH] target/rbd: add emulate_legacy_capacity dev attribute
References: bsc#1177109
Patch-mainline: Not yet, SES clustered LIO/RBD

This attribute does nothing for now, it's just retained and printed via
the configfs callbacks.

Signed-off-by: David Disseldorp <ddiss@suse.de>
Reviewed-by: Roman Penyaev <rpenyaev@suse.com>
---
 drivers/target/target_core_rbd.c | 75 ++++++++++++++++++++++++++++++--
 drivers/target/target_core_rbd.h |  1 +
 2 files changed, 73 insertions(+), 3 deletions(-)

diff --git a/drivers/target/target_core_rbd.c b/drivers/target/target_core_rbd.c
index 17e558341f91..0ac02631faff 100644
--- a/drivers/target/target_core_rbd.c
+++ b/drivers/target/target_core_rbd.c
@@ -68,6 +68,8 @@ static struct se_device *tcm_rbd_alloc_device(struct se_hba *hba, const char *na
 		return NULL;
 	}
 
+	tcm_rbd_dev->emulate_legacy_capacity = true;
+
 	pr_debug( "TCM RBD: Allocated tcm_rbd_dev for %s\n", name);
 
 	return &tcm_rbd_dev->dev;
@@ -599,7 +601,7 @@ static bool tcm_rbd_get_write_cache(struct se_device *dev)
 	return false;
 }
 
-static const struct target_backend_ops tcm_rbd_ops = {
+static struct target_backend_ops tcm_rbd_ops = {
 	.name			= "rbd",
 	.inquiry_prod		= "RBD",
 	.inquiry_rev		= TCM_RBD_VERSION,
@@ -620,17 +622,84 @@ static const struct target_backend_ops tcm_rbd_ops = {
 	.get_io_min		= tcm_rbd_get_io_min,
 	.get_io_opt		= tcm_rbd_get_io_opt,
 	.get_write_cache	= tcm_rbd_get_write_cache,
-	.tb_dev_attrib_attrs	= sbc_attrib_attrs,
+};
+
+static ssize_t tcm_rbd_emulate_legacy_capacity_show(struct config_item *item,
+						     char *page)
+{
+	struct se_dev_attrib *da = container_of(to_config_group(item),
+					struct se_dev_attrib, da_group);
+	struct tcm_rbd_dev *tcm_rbd_dev = TCM_RBD_DEV(da->da_dev);
+
+	return snprintf(page, PAGE_SIZE, "%d\n",
+			tcm_rbd_dev->emulate_legacy_capacity);
+}
+
+static ssize_t tcm_rbd_emulate_legacy_capacity_store(struct config_item *item,
+						      const char *page,
+						      size_t count)
+{
+	struct se_dev_attrib *da = container_of(to_config_group(item),
+					struct se_dev_attrib, da_group);
+	struct tcm_rbd_dev *tcm_rbd_dev = TCM_RBD_DEV(da->da_dev);
+	bool flag = 0;
+	int ret;
+
+	ret = strtobool(page, &flag);
+	if (ret < 0)
+		return ret;
+
+	tcm_rbd_dev->emulate_legacy_capacity = flag;
+	pr_debug("dev[%p]: tcm_rbd_emulate_legacy_capacity: %s\n",
+		da->da_dev, flag ? "Enabled" : "Disabled");
+
+	return count;
+}
+CONFIGFS_ATTR(tcm_rbd_, emulate_legacy_capacity);
+
+static struct configfs_attribute *tcm_rbd_attrib_attrs[] = {
+	&tcm_rbd_attr_emulate_legacy_capacity,
+	NULL,
 };
 
 static int __init tcm_rbd_module_init(void)
 {
-	return transport_backend_register(&tcm_rbd_ops);
+	struct configfs_attribute **tcm_rbd_attrs;
+	int i, k, ret, len = 0;
+
+	for (i = 0; sbc_attrib_attrs[i] != NULL; i++) {
+		len += sizeof(struct configfs_attribute *);
+	}
+	for (i = 0; tcm_rbd_attrib_attrs[i] != NULL; i++) {
+		len += sizeof(struct configfs_attribute *);
+	}
+	len += sizeof(struct configfs_attribute *);
+
+	tcm_rbd_attrs = kzalloc(len, GFP_KERNEL);
+	if (!tcm_rbd_attrs) {
+		return -ENOMEM;
+	}
+
+	for (i = 0; sbc_attrib_attrs[i] != NULL; i++) {
+		tcm_rbd_attrs[i] = sbc_attrib_attrs[i];
+	}
+	for (k = 0; tcm_rbd_attrib_attrs[k] != NULL; k++) {
+		tcm_rbd_attrs[i] = tcm_rbd_attrib_attrs[k];
+		i++;
+	}
+	tcm_rbd_ops.tb_dev_attrib_attrs = tcm_rbd_attrs;
+	ret = transport_backend_register(&tcm_rbd_ops);
+	if (ret) {
+		kfree(tcm_rbd_ops.tb_dev_attrib_attrs);
+		tcm_rbd_ops.tb_dev_attrib_attrs = NULL;
+	}
+	return ret;
 }
 
 static void __exit tcm_rbd_module_exit(void)
 {
 	target_backend_unregister(&tcm_rbd_ops);
+	kfree(tcm_rbd_ops.tb_dev_attrib_attrs);
 }
 
 MODULE_DESCRIPTION("TCM Ceph RBD subsystem plugin");
diff --git a/drivers/target/target_core_rbd.h b/drivers/target/target_core_rbd.h
index 62a1aa6fbb75..2a9d6ff26b47 100644
--- a/drivers/target/target_core_rbd.h
+++ b/drivers/target/target_core_rbd.h
@@ -13,6 +13,7 @@ struct tcm_rbd_dev {
 	u32 bd_flags;
 	struct block_device *bd;
 	bool bd_readonly;
+	bool emulate_legacy_capacity;
 } ____cacheline_aligned;
 
 #endif /* TARGET_CORE_TCM_RBD_H */
-- 
2.26.2