aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/target/sbp
diff options
context:
space:
mode:
authorJiri Kosina <jkosina@suse.cz>2013-01-29 04:48:30 -0500
committerJiri Kosina <jkosina@suse.cz>2013-01-29 04:48:30 -0500
commit617677295b53a40d0e54aac4cbbc216ffbc755dd (patch)
tree51b9e87213243ed5efff252c8e8d8fec4eebc588 /drivers/target/sbp
parent5c8d1b68e01a144813e38795fe6dbe7ebb506131 (diff)
parent6abb7c25775b7fb2225ad0508236d63ca710e65f (diff)
Merge branch 'master' into for-next
Conflicts: drivers/devfreq/exynos4_bus.c Sync with Linus' tree to be able to apply patches that are against newer code (mvneta).
Diffstat (limited to 'drivers/target/sbp')
-rw-r--r--drivers/target/sbp/Kconfig2
-rw-r--r--drivers/target/sbp/sbp_target.c24
2 files changed, 15 insertions, 11 deletions
diff --git a/drivers/target/sbp/Kconfig b/drivers/target/sbp/Kconfig
index 132da544eafc..1614bc710d4e 100644
--- a/drivers/target/sbp/Kconfig
+++ b/drivers/target/sbp/Kconfig
@@ -1,6 +1,6 @@
1config SBP_TARGET 1config SBP_TARGET
2 tristate "FireWire SBP-2 fabric module" 2 tristate "FireWire SBP-2 fabric module"
3 depends on FIREWIRE && EXPERIMENTAL 3 depends on FIREWIRE
4 help 4 help
5 Say Y or M here to enable SCSI target functionality over FireWire. 5 Say Y or M here to enable SCSI target functionality over FireWire.
6 This enables you to expose SCSI devices to other nodes on the FireWire 6 This enables you to expose SCSI devices to other nodes on the FireWire
diff --git a/drivers/target/sbp/sbp_target.c b/drivers/target/sbp/sbp_target.c
index be793883413d..6917a9e938e7 100644
--- a/drivers/target/sbp/sbp_target.c
+++ b/drivers/target/sbp/sbp_target.c
@@ -704,16 +704,17 @@ static void session_maintenance_work(struct work_struct *work)
704static int tgt_agent_rw_agent_state(struct fw_card *card, int tcode, void *data, 704static int tgt_agent_rw_agent_state(struct fw_card *card, int tcode, void *data,
705 struct sbp_target_agent *agent) 705 struct sbp_target_agent *agent)
706{ 706{
707 __be32 state; 707 int state;
708 708
709 switch (tcode) { 709 switch (tcode) {
710 case TCODE_READ_QUADLET_REQUEST: 710 case TCODE_READ_QUADLET_REQUEST:
711 pr_debug("tgt_agent AGENT_STATE READ\n"); 711 pr_debug("tgt_agent AGENT_STATE READ\n");
712 712
713 spin_lock_bh(&agent->lock); 713 spin_lock_bh(&agent->lock);
714 state = cpu_to_be32(agent->state); 714 state = agent->state;
715 spin_unlock_bh(&agent->lock); 715 spin_unlock_bh(&agent->lock);
716 memcpy(data, &state, sizeof(state)); 716
717 *(__be32 *)data = cpu_to_be32(state);
717 718
718 return RCODE_COMPLETE; 719 return RCODE_COMPLETE;
719 720
@@ -2207,20 +2208,23 @@ static struct se_portal_group *sbp_make_tpg(
2207 tport->mgt_agt = sbp_management_agent_register(tport); 2208 tport->mgt_agt = sbp_management_agent_register(tport);
2208 if (IS_ERR(tport->mgt_agt)) { 2209 if (IS_ERR(tport->mgt_agt)) {
2209 ret = PTR_ERR(tport->mgt_agt); 2210 ret = PTR_ERR(tport->mgt_agt);
2210 kfree(tpg); 2211 goto out_free_tpg;
2211 return ERR_PTR(ret);
2212 } 2212 }
2213 2213
2214 ret = core_tpg_register(&sbp_fabric_configfs->tf_ops, wwn, 2214 ret = core_tpg_register(&sbp_fabric_configfs->tf_ops, wwn,
2215 &tpg->se_tpg, (void *)tpg, 2215 &tpg->se_tpg, (void *)tpg,
2216 TRANSPORT_TPG_TYPE_NORMAL); 2216 TRANSPORT_TPG_TYPE_NORMAL);
2217 if (ret < 0) { 2217 if (ret < 0)
2218 sbp_management_agent_unregister(tport->mgt_agt); 2218 goto out_unreg_mgt_agt;
2219 kfree(tpg);
2220 return ERR_PTR(ret);
2221 }
2222 2219
2223 return &tpg->se_tpg; 2220 return &tpg->se_tpg;
2221
2222out_unreg_mgt_agt:
2223 sbp_management_agent_unregister(tport->mgt_agt);
2224out_free_tpg:
2225 tport->tpg = NULL;
2226 kfree(tpg);
2227 return ERR_PTR(ret);
2224} 2228}
2225 2229
2226static void sbp_drop_tpg(struct se_portal_group *se_tpg) 2230static void sbp_drop_tpg(struct se_portal_group *se_tpg)