Commit b3eeea66 authored by Bart Van Assche's avatar Bart Van Assche Committed by Nicholas Bellinger
Browse files

target: Simplify LUN shutdown code



Instead of starting a thread from transport_clear_lun_ref() that
waits for LUN shutdown, wait in that function for LUN shutdown
to finish. Additionally, change the return type of
transport_clear_lun_ref() from int to void.

Signed-off-by: default avatarBart Van Assche <bart.vanassche@sandisk.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
parent 3effdb90
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -928,7 +928,6 @@ struct se_device *target_alloc_device(struct se_hba *hba, const char *name)

	xcopy_lun = &dev->xcopy_lun;
	xcopy_lun->lun_se_dev = dev;
	init_completion(&xcopy_lun->lun_shutdown_comp);
	spin_lock_init(&xcopy_lun->lun_sep_lock);
	init_completion(&xcopy_lun->lun_ref_comp);

+1 −1
Original line number Diff line number Diff line
@@ -108,7 +108,7 @@ int transport_dump_vpd_assoc(struct t10_vpd *, unsigned char *, int);
int	transport_dump_vpd_ident_type(struct t10_vpd *, unsigned char *, int);
int	transport_dump_vpd_ident(struct t10_vpd *, unsigned char *, int);
bool	target_stop_cmd(struct se_cmd *cmd, unsigned long *flags);
int	transport_clear_lun_ref(struct se_lun *);
void	transport_clear_lun_ref(struct se_lun *);
void	transport_send_task_abort(struct se_cmd *);
sense_reason_t	target_cmd_size_check(struct se_cmd *cmd, unsigned int size);
void	target_qf_do_work(struct work_struct *work);
+0 −2
Original line number Diff line number Diff line
@@ -494,7 +494,6 @@ static int core_tpg_setup_virtual_lun0(struct se_portal_group *se_tpg)

	lun->unpacked_lun = 0;
	atomic_set(&lun->lun_acl_count, 0);
	init_completion(&lun->lun_shutdown_comp);
	spin_lock_init(&lun->lun_sep_lock);
	init_completion(&lun->lun_ref_comp);

@@ -606,7 +605,6 @@ struct se_lun *core_tpg_alloc_lun(
	lun->unpacked_lun = unpacked_lun;
	lun->lun_link_magic = SE_LUN_LINK_MAGIC;
	atomic_set(&lun->lun_acl_count, 0);
	init_completion(&lun->lun_shutdown_comp);
	spin_lock_init(&lun->lun_sep_lock);
	init_completion(&lun->lun_ref_comp);

+1 −22
Original line number Diff line number Diff line
@@ -2596,31 +2596,10 @@ void target_wait_for_sess_cmds(struct se_session *se_sess)
}
EXPORT_SYMBOL(target_wait_for_sess_cmds);

static int transport_clear_lun_ref_thread(void *p)
void transport_clear_lun_ref(struct se_lun *lun)
{
	struct se_lun *lun = p;

	percpu_ref_kill(&lun->lun_ref);

	wait_for_completion(&lun->lun_ref_comp);
	complete(&lun->lun_shutdown_comp);

	return 0;
}

int transport_clear_lun_ref(struct se_lun *lun)
{
	struct task_struct *kt;

	kt = kthread_run(transport_clear_lun_ref_thread, lun,
			"tcm_cl_%u", lun->unpacked_lun);
	if (IS_ERR(kt)) {
		pr_err("Unable to start clear_lun thread\n");
		return PTR_ERR(kt);
	}
	wait_for_completion(&lun->lun_shutdown_comp);

	return 0;
}

/**
+0 −1
Original line number Diff line number Diff line
@@ -707,7 +707,6 @@ struct se_lun {
	u32			lun_index;
	atomic_t		lun_acl_count;
	spinlock_t		lun_sep_lock;
	struct completion	lun_shutdown_comp;
	struct se_device	*lun_se_dev;
	struct se_port		*lun_sep;
	struct config_group	lun_group;