diff options
author | Varun Prakash <varun@chelsio.com> | 2016-04-19 14:30:16 -0400 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2016-05-10 02:12:18 -0400 |
commit | 1c46960e3310adf6ac95078210fdb16987c3b31d (patch) | |
tree | 5650df9c8b76ab4c1a41a56372e4953bd4e3c4e6 | |
parent | 864e504ae2bbdd7efcd6923075047a7a6b5ade02 (diff) |
iscsi-target: add new offload transport type
Add new transport type ISCSI_HW_OFFLOAD,
hw offload transport drivers will use
this transport type.
Signed-off-by: Varun Prakash <varun@chelsio.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
-rw-r--r-- | drivers/target/iscsi/iscsi_target_configfs.c | 76 | ||||
-rw-r--r-- | include/target/iscsi/iscsi_target_core.h | 1 |
2 files changed, 77 insertions, 0 deletions
diff --git a/drivers/target/iscsi/iscsi_target_configfs.c b/drivers/target/iscsi/iscsi_target_configfs.c index 97e5b69e0668..3565e07ad8a6 100644 --- a/drivers/target/iscsi/iscsi_target_configfs.c +++ b/drivers/target/iscsi/iscsi_target_configfs.c | |||
@@ -182,12 +182,88 @@ out: | |||
182 | return rc; | 182 | return rc; |
183 | } | 183 | } |
184 | 184 | ||
185 | static ssize_t lio_target_np_hw_offload_show(struct config_item *item, | ||
186 | char *page) | ||
187 | { | ||
188 | struct iscsi_tpg_np *tpg_np = to_iscsi_tpg_np(item); | ||
189 | struct iscsi_tpg_np *tpg_np_hw_offload; | ||
190 | ssize_t rb; | ||
191 | |||
192 | tpg_np_hw_offload = iscsit_tpg_locate_child_np(tpg_np, | ||
193 | ISCSI_HW_OFFLOAD); | ||
194 | if (tpg_np_hw_offload) | ||
195 | rb = sprintf(page, "1\n"); | ||
196 | else | ||
197 | rb = sprintf(page, "0\n"); | ||
198 | |||
199 | return rb; | ||
200 | } | ||
201 | |||
202 | static ssize_t lio_target_np_hw_offload_store(struct config_item *item, | ||
203 | const char *page, size_t count) | ||
204 | { | ||
205 | struct iscsi_tpg_np *tpg_np = to_iscsi_tpg_np(item); | ||
206 | struct iscsi_np *np; | ||
207 | struct iscsi_portal_group *tpg; | ||
208 | struct iscsi_tpg_np *tpg_np_hw_offload = NULL; | ||
209 | u32 op; | ||
210 | int rc = 0; | ||
211 | |||
212 | rc = kstrtou32(page, 0, &op); | ||
213 | if (rc) | ||
214 | return rc; | ||
215 | |||
216 | if ((op != 1) && (op != 0)) { | ||
217 | pr_err("Illegal value for tpg_enable: %u\n", op); | ||
218 | return -EINVAL; | ||
219 | } | ||
220 | |||
221 | np = tpg_np->tpg_np; | ||
222 | if (!np) { | ||
223 | pr_err("Unable to locate struct iscsi_np from" | ||
224 | " struct iscsi_tpg_np\n"); | ||
225 | return -EINVAL; | ||
226 | } | ||
227 | |||
228 | tpg = tpg_np->tpg; | ||
229 | if (iscsit_get_tpg(tpg) < 0) | ||
230 | return -EINVAL; | ||
231 | |||
232 | if (op) { | ||
233 | tpg_np_hw_offload = iscsit_tpg_add_network_portal(tpg, | ||
234 | &np->np_sockaddr, tpg_np, ISCSI_HW_OFFLOAD); | ||
235 | |||
236 | if (IS_ERR(tpg_np_hw_offload)) { | ||
237 | rc = PTR_ERR(tpg_np_hw_offload); | ||
238 | goto out; | ||
239 | } | ||
240 | } else { | ||
241 | tpg_np_hw_offload = iscsit_tpg_locate_child_np(tpg_np, | ||
242 | ISCSI_HW_OFFLOAD); | ||
243 | |||
244 | if (tpg_np_hw_offload) { | ||
245 | rc = iscsit_tpg_del_network_portal(tpg, | ||
246 | tpg_np_hw_offload); | ||
247 | if (rc < 0) | ||
248 | goto out; | ||
249 | } | ||
250 | } | ||
251 | |||
252 | iscsit_put_tpg(tpg); | ||
253 | return count; | ||
254 | out: | ||
255 | iscsit_put_tpg(tpg); | ||
256 | return rc; | ||
257 | } | ||
258 | |||
185 | CONFIGFS_ATTR(lio_target_np_, sctp); | 259 | CONFIGFS_ATTR(lio_target_np_, sctp); |
186 | CONFIGFS_ATTR(lio_target_np_, iser); | 260 | CONFIGFS_ATTR(lio_target_np_, iser); |
261 | CONFIGFS_ATTR(lio_target_np_, hw_offload); | ||
187 | 262 | ||
188 | static struct configfs_attribute *lio_target_portal_attrs[] = { | 263 | static struct configfs_attribute *lio_target_portal_attrs[] = { |
189 | &lio_target_np_attr_sctp, | 264 | &lio_target_np_attr_sctp, |
190 | &lio_target_np_attr_iser, | 265 | &lio_target_np_attr_iser, |
266 | &lio_target_np_attr_hw_offload, | ||
191 | NULL, | 267 | NULL, |
192 | }; | 268 | }; |
193 | 269 | ||
diff --git a/include/target/iscsi/iscsi_target_core.h b/include/target/iscsi/iscsi_target_core.h index 01c41f2b66d1..110c1fde7c68 100644 --- a/include/target/iscsi/iscsi_target_core.h +++ b/include/target/iscsi/iscsi_target_core.h | |||
@@ -74,6 +74,7 @@ enum iscsit_transport_type { | |||
74 | ISCSI_IWARP_TCP = 3, | 74 | ISCSI_IWARP_TCP = 3, |
75 | ISCSI_IWARP_SCTP = 4, | 75 | ISCSI_IWARP_SCTP = 4, |
76 | ISCSI_INFINIBAND = 5, | 76 | ISCSI_INFINIBAND = 5, |
77 | ISCSI_HW_OFFLOAD = 6, | ||
77 | }; | 78 | }; |
78 | 79 | ||
79 | /* RFC-3720 7.1.4 Standard Connection State Diagram for a Target */ | 80 | /* RFC-3720 7.1.4 Standard Connection State Diagram for a Target */ |