Commit a95be384 authored by Bart Van Assche's avatar Bart Van Assche Committed by Martin K. Petersen

scsi: target/core: Simplify transport_clear_lun_ref()

Since transport_clear_lun_ref() already waits until the percpu-refcount
.release() method is called, it is not necessary to wait first until
percpu_ref_kill_and_confirm() has finished transitioning the refcount into
atomic mode. Remove the code that waits for percpu_ref_kill_and_confirm()
to complete and also the completion object that is used by that code.  This
patch does not change the behavior of the SCSI target code.

Cc: Nicholas Bellinger <nab@linux-iscsi.org>
Cc: Mike Christie <mchristi@redhat.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: David Disseldorp <ddiss@suse.de>
Cc: Hannes Reinecke <hare@suse.de>
Signed-off-by: default avatarBart Van Assche <bvanassche@acm.org>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 5d6cd9fe
...@@ -823,7 +823,6 @@ struct se_device *target_alloc_device(struct se_hba *hba, const char *name) ...@@ -823,7 +823,6 @@ struct se_device *target_alloc_device(struct se_hba *hba, const char *name)
xcopy_lun = &dev->xcopy_lun; xcopy_lun = &dev->xcopy_lun;
rcu_assign_pointer(xcopy_lun->lun_se_dev, dev); rcu_assign_pointer(xcopy_lun->lun_se_dev, dev);
init_completion(&xcopy_lun->lun_ref_comp);
init_completion(&xcopy_lun->lun_shutdown_comp); init_completion(&xcopy_lun->lun_shutdown_comp);
INIT_LIST_HEAD(&xcopy_lun->lun_deve_list); INIT_LIST_HEAD(&xcopy_lun->lun_deve_list);
INIT_LIST_HEAD(&xcopy_lun->lun_dev_link); INIT_LIST_HEAD(&xcopy_lun->lun_dev_link);
......
...@@ -577,7 +577,6 @@ struct se_lun *core_tpg_alloc_lun( ...@@ -577,7 +577,6 @@ struct se_lun *core_tpg_alloc_lun(
} }
lun->unpacked_lun = unpacked_lun; lun->unpacked_lun = unpacked_lun;
atomic_set(&lun->lun_acl_count, 0); atomic_set(&lun->lun_acl_count, 0);
init_completion(&lun->lun_ref_comp);
init_completion(&lun->lun_shutdown_comp); init_completion(&lun->lun_shutdown_comp);
INIT_LIST_HEAD(&lun->lun_deve_list); INIT_LIST_HEAD(&lun->lun_deve_list);
INIT_LIST_HEAD(&lun->lun_dev_link); INIT_LIST_HEAD(&lun->lun_dev_link);
......
...@@ -2911,38 +2911,13 @@ void target_wait_for_sess_cmds(struct se_session *se_sess) ...@@ -2911,38 +2911,13 @@ void target_wait_for_sess_cmds(struct se_session *se_sess)
} }
EXPORT_SYMBOL(target_wait_for_sess_cmds); EXPORT_SYMBOL(target_wait_for_sess_cmds);
static void target_lun_confirm(struct percpu_ref *ref) /*
{ * Prevent that new percpu_ref_tryget_live() calls succeed and wait until
struct se_lun *lun = container_of(ref, struct se_lun, lun_ref); * all references to the LUN have been released. Called during LUN shutdown.
*/
complete(&lun->lun_ref_comp);
}
void transport_clear_lun_ref(struct se_lun *lun) void transport_clear_lun_ref(struct se_lun *lun)
{ {
/* percpu_ref_kill(&lun->lun_ref);
* Mark the percpu-ref as DEAD, switch to atomic_t mode, drop
* the initial reference and schedule confirm kill to be
* executed after one full RCU grace period has completed.
*/
percpu_ref_kill_and_confirm(&lun->lun_ref, target_lun_confirm);
/*
* The first completion waits for percpu_ref_switch_to_atomic_rcu()
* to call target_lun_confirm after lun->lun_ref has been marked
* as __PERCPU_REF_DEAD on all CPUs, and switches to atomic_t
* mode so that percpu_ref_tryget_live() lookup of lun->lun_ref
* fails for all new incoming I/O.
*/
wait_for_completion(&lun->lun_ref_comp);
/*
* The second completion waits for percpu_ref_put_many() to
* invoke ->release() after lun->lun_ref has switched to
* atomic_t mode, and lun->lun_ref.count has reached zero.
*
* At this point all target-core lun->lun_ref references have
* been dropped via transport_lun_remove_cmd(), and it's safe
* to proceed with the remaining LUN shutdown.
*/
wait_for_completion(&lun->lun_shutdown_comp); wait_for_completion(&lun->lun_shutdown_comp);
} }
......
...@@ -733,7 +733,6 @@ struct se_lun { ...@@ -733,7 +733,6 @@ struct se_lun {
struct scsi_port_stats lun_stats; struct scsi_port_stats lun_stats;
struct config_group lun_group; struct config_group lun_group;
struct se_port_stat_grps port_stat_grps; struct se_port_stat_grps port_stat_grps;
struct completion lun_ref_comp;
struct completion lun_shutdown_comp; struct completion lun_shutdown_comp;
struct percpu_ref lun_ref; struct percpu_ref lun_ref;
struct list_head lun_dev_link; struct list_head lun_dev_link;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment