projects
/
linux-drm-fsl-dcu.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wirel...
[linux-drm-fsl-dcu.git]
/
drivers
/
target
/
target_core_tpg.c
diff --git
a/drivers/target/target_core_tpg.c
b/drivers/target/target_core_tpg.c
index aac9d2727e3c8584a20db563ef5c914bc758de19..f697f8baec5418d13484904bf3730880f90639fd 100644
(file)
--- a/
drivers/target/target_core_tpg.c
+++ b/
drivers/target/target_core_tpg.c
@@
-3,7
+3,7
@@
*
* This file contains generic Target Portal Group related functions.
*
*
* This file contains generic Target Portal Group related functions.
*
- * (c) Copyright 2002-201
2 RisingTide Systems LLC
.
+ * (c) Copyright 2002-201
3 Datera, Inc
.
*
* Nicholas A. Bellinger <nab@kernel.org>
*
*
* Nicholas A. Bellinger <nab@kernel.org>
*
@@
-116,6
+116,7
@@
struct se_node_acl *core_tpg_get_initiator_node_acl(
return acl;
}
return acl;
}
+EXPORT_SYMBOL(core_tpg_get_initiator_node_acl);
/* core_tpg_add_node_to_devs():
*
/* core_tpg_add_node_to_devs():
*
@@
-633,6
+634,13
@@
int core_tpg_set_initiator_node_tag(
}
EXPORT_SYMBOL(core_tpg_set_initiator_node_tag);
}
EXPORT_SYMBOL(core_tpg_set_initiator_node_tag);
+static void core_tpg_lun_ref_release(struct percpu_ref *ref)
+{
+ struct se_lun *lun = container_of(ref, struct se_lun, lun_ref);
+
+ complete(&lun->lun_ref_comp);
+}
+
static int core_tpg_setup_virtual_lun0(struct se_portal_group *se_tpg)
{
/* Set in core_dev_setup_virtual_lun0() */
static int core_tpg_setup_virtual_lun0(struct se_portal_group *se_tpg)
{
/* Set in core_dev_setup_virtual_lun0() */
@@
-646,15
+654,20
@@
static int core_tpg_setup_virtual_lun0(struct se_portal_group *se_tpg)
atomic_set(&lun->lun_acl_count, 0);
init_completion(&lun->lun_shutdown_comp);
INIT_LIST_HEAD(&lun->lun_acl_list);
atomic_set(&lun->lun_acl_count, 0);
init_completion(&lun->lun_shutdown_comp);
INIT_LIST_HEAD(&lun->lun_acl_list);
- INIT_LIST_HEAD(&lun->lun_cmd_list);
spin_lock_init(&lun->lun_acl_lock);
spin_lock_init(&lun->lun_acl_lock);
- spin_lock_init(&lun->lun_cmd_lock);
spin_lock_init(&lun->lun_sep_lock);
spin_lock_init(&lun->lun_sep_lock);
+ init_completion(&lun->lun_ref_comp);
- ret =
core_tpg_post_addlun(se_tpg, lun, lun_access, dev
);
+ ret =
percpu_ref_init(&lun->lun_ref, core_tpg_lun_ref_release
);
if (ret < 0)
return ret;
if (ret < 0)
return ret;
+ ret = core_tpg_post_addlun(se_tpg, lun, lun_access, dev);
+ if (ret < 0) {
+ percpu_ref_cancel_init(&lun->lun_ref);
+ return ret;
+ }
+
return 0;
}
return 0;
}
@@
-691,10
+704,9
@@
int core_tpg_register(
atomic_set(&lun->lun_acl_count, 0);
init_completion(&lun->lun_shutdown_comp);
INIT_LIST_HEAD(&lun->lun_acl_list);
atomic_set(&lun->lun_acl_count, 0);
init_completion(&lun->lun_shutdown_comp);
INIT_LIST_HEAD(&lun->lun_acl_list);
- INIT_LIST_HEAD(&lun->lun_cmd_list);
spin_lock_init(&lun->lun_acl_lock);
spin_lock_init(&lun->lun_acl_lock);
- spin_lock_init(&lun->lun_cmd_lock);
spin_lock_init(&lun->lun_sep_lock);
spin_lock_init(&lun->lun_sep_lock);
+ init_completion(&lun->lun_ref_comp);
}
se_tpg->se_tpg_type = se_tpg_type;
}
se_tpg->se_tpg_type = se_tpg_type;
@@
-815,10
+827,16
@@
int core_tpg_post_addlun(
{
int ret;
{
int ret;
- ret =
core_dev_export(lun_ptr, tpg, lun
);
+ ret =
percpu_ref_init(&lun->lun_ref, core_tpg_lun_ref_release
);
if (ret < 0)
return ret;
if (ret < 0)
return ret;
+ ret = core_dev_export(lun_ptr, tpg, lun);
+ if (ret < 0) {
+ percpu_ref_cancel_init(&lun->lun_ref);
+ return ret;
+ }
+
spin_lock(&tpg->tpg_lun_lock);
lun->lun_access = lun_access;
lun->lun_status = TRANSPORT_LUN_STATUS_ACTIVE;
spin_lock(&tpg->tpg_lun_lock);
lun->lun_access = lun_access;
lun->lun_status = TRANSPORT_LUN_STATUS_ACTIVE;
@@
-827,14
+845,6
@@
int core_tpg_post_addlun(
return 0;
}
return 0;
}
-static void core_tpg_shutdown_lun(
- struct se_portal_group *tpg,
- struct se_lun *lun)
-{
- core_clear_lun_from_tpg(lun, tpg);
- transport_clear_lun_from_sessions(lun);
-}
-
struct se_lun *core_tpg_pre_dellun(
struct se_portal_group *tpg,
u32 unpacked_lun)
struct se_lun *core_tpg_pre_dellun(
struct se_portal_group *tpg,
u32 unpacked_lun)
@@
-869,7
+879,8
@@
int core_tpg_post_dellun(
struct se_portal_group *tpg,
struct se_lun *lun)
{
struct se_portal_group *tpg,
struct se_lun *lun)
{
- core_tpg_shutdown_lun(tpg, lun);
+ core_clear_lun_from_tpg(lun, tpg);
+ transport_clear_lun_ref(lun);
core_dev_unexport(lun->lun_se_dev, tpg, lun);
core_dev_unexport(lun->lun_se_dev, tpg, lun);