Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
•
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
drivers
target
target_core_hba.c
Go to the documentation of this file.
1
/*******************************************************************************
2
* Filename: target_core_hba.c
3
*
4
* This file contains the TCM HBA Transport related functions.
5
*
6
* Copyright (c) 2003, 2004, 2005 PyX Technologies, Inc.
7
* Copyright (c) 2005, 2006, 2007 SBE, Inc.
8
* Copyright (c) 2007-2010 Rising Tide Systems
9
* Copyright (c) 2008-2010 Linux-iSCSI.org
10
*
11
* Nicholas A. Bellinger <nab@kernel.org>
12
*
13
* This program is free software; you can redistribute it and/or modify
14
* it under the terms of the GNU General Public License as published by
15
* the Free Software Foundation; either version 2 of the License, or
16
* (at your option) any later version.
17
*
18
* This program is distributed in the hope that it will be useful,
19
* but WITHOUT ANY WARRANTY; without even the implied warranty of
20
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
* GNU General Public License for more details.
22
*
23
* You should have received a copy of the GNU General Public License
24
* along with this program; if not, write to the Free Software
25
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26
*
27
******************************************************************************/
28
29
#include <linux/net.h>
30
#include <linux/string.h>
31
#include <
linux/timer.h
>
32
#include <linux/slab.h>
33
#include <
linux/spinlock.h
>
34
#include <linux/in.h>
35
#include <linux/module.h>
36
#include <
net/sock.h
>
37
#include <
net/tcp.h
>
38
39
#include <
target/target_core_base.h
>
40
#include <
target/target_core_backend.h
>
41
#include <
target/target_core_fabric.h
>
42
43
#include "
target_core_internal.h
"
44
45
static
LIST_HEAD
(subsystem_list);
46
static
DEFINE_MUTEX
(subsystem_mutex);
47
48
static
u32
hba_id_counter;
49
50
static
DEFINE_SPINLOCK
(hba_lock);
51
static
LIST_HEAD
(hba_list);
52
53
int
transport_subsystem_register
(
struct
se_subsystem_api
*sub_api)
54
{
55
struct
se_subsystem_api
*
s
;
56
57
INIT_LIST_HEAD(&sub_api->
sub_api_list
);
58
59
mutex_lock
(&subsystem_mutex);
60
list_for_each_entry
(s, &subsystem_list,
sub_api_list
) {
61
if
(!
strcmp
(s->
name
, sub_api->
name
)) {
62
pr_err
(
"%p is already registered with"
63
" duplicate name %s, unable to process"
64
" request\n"
, s, s->
name
);
65
mutex_unlock
(&subsystem_mutex);
66
return
-
EEXIST
;
67
}
68
}
69
list_add_tail
(&sub_api->
sub_api_list
, &subsystem_list);
70
mutex_unlock
(&subsystem_mutex);
71
72
pr_debug
(
"TCM: Registered subsystem plugin: %s struct module:"
73
" %p\n"
, sub_api->
name
, sub_api->
owner
);
74
return
0;
75
}
76
EXPORT_SYMBOL
(
transport_subsystem_register
);
77
78
void
transport_subsystem_release
(
struct
se_subsystem_api
*sub_api)
79
{
80
mutex_lock
(&subsystem_mutex);
81
list_del
(&sub_api->
sub_api_list
);
82
mutex_unlock
(&subsystem_mutex);
83
}
84
EXPORT_SYMBOL
(
transport_subsystem_release
);
85
86
static
struct
se_subsystem_api
*core_get_backend(
const
char
*sub_name)
87
{
88
struct
se_subsystem_api
*
s
;
89
90
mutex_lock
(&subsystem_mutex);
91
list_for_each_entry
(s, &subsystem_list,
sub_api_list
) {
92
if
(!
strcmp
(s->
name
, sub_name))
93
goto
found;
94
}
95
mutex_unlock
(&subsystem_mutex);
96
return
NULL
;
97
found:
98
if
(s->
owner
&& !try_module_get(s->
owner
))
99
s =
NULL
;
100
mutex_unlock
(&subsystem_mutex);
101
return
s
;
102
}
103
104
struct
se_hba
*
105
core_alloc_hba
(
const
char
*plugin_name,
u32
plugin_dep_id,
u32
hba_flags
)
106
{
107
struct
se_hba
*hba;
108
int
ret
= 0;
109
110
hba = kzalloc(
sizeof
(*hba),
GFP_KERNEL
);
111
if
(!hba) {
112
pr_err
(
"Unable to allocate struct se_hba\n"
);
113
return
ERR_PTR(-
ENOMEM
);
114
}
115
116
INIT_LIST_HEAD(&hba->
hba_dev_list
);
117
spin_lock_init
(&hba->
device_lock
);
118
mutex_init
(&hba->
hba_access_mutex
);
119
120
hba->
hba_index
=
scsi_get_new_index
(
SCSI_INST_INDEX
);
121
hba->
hba_flags
|=
hba_flags
;
122
123
hba->
transport
= core_get_backend(plugin_name);
124
if
(!hba->
transport
) {
125
ret = -
EINVAL
;
126
goto
out_free_hba;
127
}
128
129
ret = hba->
transport
->attach_hba(hba, plugin_dep_id);
130
if
(ret < 0)
131
goto
out_module_put;
132
133
spin_lock(&hba_lock);
134
hba->
hba_id
= hba_id_counter++;
135
list_add_tail
(&hba->
hba_node
, &
hba_list
);
136
spin_unlock(&hba_lock);
137
138
pr_debug
(
"CORE_HBA[%d] - Attached HBA to Generic Target"
139
" Core\n"
, hba->
hba_id
);
140
141
return
hba;
142
143
out_module_put:
144
if
(hba->
transport
->owner)
145
module_put(hba->
transport
->owner);
146
hba->
transport
=
NULL
;
147
out_free_hba:
148
kfree
(hba);
149
return
ERR_PTR(ret);
150
}
151
152
int
153
core_delete_hba
(
struct
se_hba
*hba)
154
{
155
if
(!list_empty(&hba->
hba_dev_list
))
156
dump_stack
();
157
158
hba->
transport
->detach_hba(hba);
159
160
spin_lock(&hba_lock);
161
list_del
(&hba->
hba_node
);
162
spin_unlock(&hba_lock);
163
164
pr_debug
(
"CORE_HBA[%d] - Detached HBA from Generic Target"
165
" Core\n"
, hba->
hba_id
);
166
167
if
(hba->
transport
->owner)
168
module_put(hba->
transport
->owner);
169
170
hba->
transport
=
NULL
;
171
kfree
(hba);
172
return
0;
173
}
Generated on Thu Jan 10 2013 14:33:15 for Linux Kernel by
1.8.2