Hannes Reinecke b1f324
From: Sagi Grimberg <sagi@grimberg.me>
Hannes Reinecke b1f324
Date: Wed, 1 Apr 2020 16:16:27 -0700
Hannes Reinecke b1f324
Subject: [PATCH] nvmet: fix NULL dereference when removing a referral
Hannes Reinecke b1f324
Git-commit: f0e656e4f253120eb871a53ffab7664530c1d9f4
Michal Kubecek 66e035
Patch-mainline: v5.7-rc1
Hannes Reinecke b1f324
References: bsc#1169045
Hannes Reinecke b1f324
Hannes Reinecke b1f324
When item release is called, the parent is already null.  We need the
Hannes Reinecke b1f324
parent to pass to nvmet_referral_disable so hook it up to
Hannes Reinecke b1f324
->disconnect_notify.
Hannes Reinecke b1f324
Hannes Reinecke b1f324
Reported-by: Tony Asleson <tasleson@redhat.com>
Hannes Reinecke b1f324
Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
Hannes Reinecke b1f324
Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
Hannes Reinecke b1f324
Signed-off-by: Christoph Hellwig <hch@lst.de>
Hannes Reinecke b1f324
Acked-by: Hannes Reinecke <hare@suse.com>
Hannes Reinecke b1f324
---
Hannes Reinecke b1f324
 drivers/nvme/target/configfs.c | 10 +++++++++-
Hannes Reinecke b1f324
 1 file changed, 9 insertions(+), 1 deletion(-)
Hannes Reinecke b1f324
Hannes Reinecke b1f324
diff --git a/drivers/nvme/target/configfs.c b/drivers/nvme/target/configfs.c
Hannes Reinecke b1f324
index 7aa10788b7c8..58cabd7b6fc5 100644
Hannes Reinecke b1f324
--- a/drivers/nvme/target/configfs.c
Hannes Reinecke b1f324
+++ b/drivers/nvme/target/configfs.c
Hannes Reinecke b1f324
@@ -1098,12 +1098,19 @@ static struct configfs_attribute *nvmet_referral_attrs[] = {
Hannes Reinecke b1f324
 	NULL,
Hannes Reinecke b1f324
 };
Hannes Reinecke b1f324
 
Hannes Reinecke b1f324
-static void nvmet_referral_release(struct config_item *item)
Hannes Reinecke b1f324
+static void nvmet_referral_notify(struct config_group *group,
Hannes Reinecke b1f324
+		struct config_item *item)
Hannes Reinecke b1f324
 {
Hannes Reinecke b1f324
 	struct nvmet_port *parent = to_nvmet_port(item->ci_parent->ci_parent);
Hannes Reinecke b1f324
 	struct nvmet_port *port = to_nvmet_port(item);
Hannes Reinecke b1f324
 
Hannes Reinecke b1f324
 	nvmet_referral_disable(parent, port);
Hannes Reinecke b1f324
+}
Hannes Reinecke b1f324
+
Hannes Reinecke b1f324
+static void nvmet_referral_release(struct config_item *item)
Hannes Reinecke b1f324
+{
Hannes Reinecke b1f324
+	struct nvmet_port *port = to_nvmet_port(item);
Hannes Reinecke b1f324
+
Hannes Reinecke b1f324
 	kfree(port);
Hannes Reinecke b1f324
 }
Hannes Reinecke b1f324
 
Hannes Reinecke b1f324
@@ -1134,6 +1141,7 @@ static struct config_group *nvmet_referral_make(
Hannes Reinecke b1f324
 
Hannes Reinecke b1f324
 static struct configfs_group_operations nvmet_referral_group_ops = {
Hannes Reinecke b1f324
 	.make_group		= nvmet_referral_make,
Hannes Reinecke b1f324
+	.disconnect_notify	= nvmet_referral_notify,
Hannes Reinecke b1f324
 };
Hannes Reinecke b1f324
 
Hannes Reinecke b1f324
 static const struct config_item_type nvmet_referrals_type = {
Hannes Reinecke b1f324
-- 
Hannes Reinecke b1f324
2.16.4
Hannes Reinecke b1f324