aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/target/target_core_rd.c
diff options
context:
space:
mode:
authorNicholas Bellinger <nab@linux-iscsi.org>2015-05-19 03:03:07 -0400
committerNicholas Bellinger <nab@linux-iscsi.org>2015-06-01 03:27:38 -0400
commit4cc987eaff9144182cde88d6d132420c28d3f81b (patch)
tree15cf7d432599e1e09446462968ef01c4d10a087e /drivers/target/target_core_rd.c
parentadf653f92f38e80a78bb77e912d49bcc8055330f (diff)
target: Drop lun_sep_lock for se_lun->lun_se_dev RCU usage
With se_port and t10_alua_tg_pt_gp_member being absored into se_lun, there is no need for an extra lock to protect se_lun->lun_se_dev assignment. This patch also converts backend drivers to use call_rcu() release to allow any se_device readers to complete. The call_rcu() instead of kfree_rcu() is required here because se_device is embedded into the backend driver specific structure. Also, convert se_lun->lun_stats to use atomic_long_t within the target_complete_ok_work() completion callback, and add FIXME for transport_lookup_tmr_lun() with se_lun->lun_ref. Finally, update sbp_update_unit_directory() special case usage with proper rcu_dereference_raw() and configfs symlink comment. Reported-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Hannes Reinecke <hare@suse.de> Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Cc: Chris Boot <bootc@bootc.net> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target/target_core_rd.c')
-rw-r--r--drivers/target/target_core_rd.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/drivers/target/target_core_rd.c b/drivers/target/target_core_rd.c
index 55dd73e7f213..e98432705f39 100644
--- a/drivers/target/target_core_rd.c
+++ b/drivers/target/target_core_rd.c
@@ -350,12 +350,20 @@ fail:
350 return ret; 350 return ret;
351} 351}
352 352
353static void rd_dev_call_rcu(struct rcu_head *p)
354{
355 struct se_device *dev = container_of(p, struct se_device, rcu_head);
356 struct rd_dev *rd_dev = RD_DEV(dev);
357
358 kfree(rd_dev);
359}
360
353static void rd_free_device(struct se_device *dev) 361static void rd_free_device(struct se_device *dev)
354{ 362{
355 struct rd_dev *rd_dev = RD_DEV(dev); 363 struct rd_dev *rd_dev = RD_DEV(dev);
356 364
357 rd_release_device_space(rd_dev); 365 rd_release_device_space(rd_dev);
358 kfree(rd_dev); 366 call_rcu(&dev->rcu_head, rd_dev_call_rcu);
359} 367}
360 368
361static struct rd_dev_sg_table *rd_get_sg_table(struct rd_dev *rd_dev, u32 page) 369static struct rd_dev_sg_table *rd_get_sg_table(struct rd_dev *rd_dev, u32 page)