Blob Blame History Raw
From 68d0a33872dfafcd96b58f08b4df098a759fd7cd Mon Sep 17 00:00:00 2001
From: David Disseldorp <ddiss@suse.de>
Date: Fri, 31 Aug 2018 15:02:14 +0200
Subject: [PATCH 1/2] target_core_rbd: use RCU in free_device
Patch-mainline: Not yet, SES clustered LIO/RBD
References: bsc#1105524

This matches behaviour introduced with 4cc987eaff91:
("target: Drop lun_sep_lock for se_lun->lun_se_dev RCU usage")

Signed-off-by: David Disseldorp <ddiss@suse.de>
Acked-by: Luis Henriques <lhenriques@suse.com>
---
 drivers/target/target_core_rbd.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/target/target_core_rbd.c b/drivers/target/target_core_rbd.c
index 00efe9762267..b986a94ff586 100644
--- a/drivers/target/target_core_rbd.c
+++ b/drivers/target/target_core_rbd.c
@@ -127,6 +127,14 @@ static int tcm_rbd_configure_device(struct se_device *dev)
 	return 0;
 }
 
+static void tcm_rbd_dev_call_rcu(struct rcu_head *p)
+{
+	struct se_device *dev = container_of(p, struct se_device, rcu_head);
+	struct tcm_rbd_dev *tcm_rbd_dev = TCM_RBD_DEV(dev);
+
+	kfree(tcm_rbd_dev);
+}
+
 static void tcm_rbd_free_device(struct se_device *dev)
 {
 	struct tcm_rbd_dev *tcm_rbd_dev = TCM_RBD_DEV(dev);
@@ -134,7 +142,7 @@ static void tcm_rbd_free_device(struct se_device *dev)
 	if (tcm_rbd_dev->bd != NULL)
 		blkdev_put(tcm_rbd_dev->bd, FMODE_WRITE|FMODE_READ|FMODE_EXCL);
 
-	kfree(tcm_rbd_dev);
+	call_rcu(&dev->rcu_head, tcm_rbd_dev_call_rcu);
 }
 
 static sector_t tcm_rbd_get_blocks(struct se_device *dev)
-- 
2.13.7