diff options
author | Nicholas Bellinger <nab@linux-iscsi.org> | 2013-02-18 23:59:27 -0500 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2013-02-19 20:58:04 -0500 |
commit | 05b9689245c1b2f0dea38c1cb4882810ce3adda8 (patch) | |
tree | fcf82d7aad2b9772f7c70a0572f83441ddb04f72 /drivers/target | |
parent | fbbf8555a986ed31e54f006b6cc637ea4ff1425b (diff) |
iscsi-target: Refactor iscsit_get_np sockaddr matching into iscsit_check_np_match
This patch refactors the sockaddr matching logic in iscsit_get_np() into
a seperate iscsit_check_np_match() that can be used by external code.
Tested-by: Andy Grover <agrover@redhat.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target')
-rw-r--r-- | drivers/target/iscsi/iscsi_target.c | 65 | ||||
-rw-r--r-- | drivers/target/iscsi/iscsi_target.h | 2 |
2 files changed, 41 insertions, 26 deletions
diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c index 339f97f7085b..23a98e658306 100644 --- a/drivers/target/iscsi/iscsi_target.c +++ b/drivers/target/iscsi/iscsi_target.c | |||
@@ -264,16 +264,50 @@ int iscsit_deaccess_np(struct iscsi_np *np, struct iscsi_portal_group *tpg) | |||
264 | return 0; | 264 | return 0; |
265 | } | 265 | } |
266 | 266 | ||
267 | static struct iscsi_np *iscsit_get_np( | 267 | bool iscsit_check_np_match( |
268 | struct __kernel_sockaddr_storage *sockaddr, | 268 | struct __kernel_sockaddr_storage *sockaddr, |
269 | struct iscsi_np *np, | ||
269 | int network_transport) | 270 | int network_transport) |
270 | { | 271 | { |
271 | struct sockaddr_in *sock_in, *sock_in_e; | 272 | struct sockaddr_in *sock_in, *sock_in_e; |
272 | struct sockaddr_in6 *sock_in6, *sock_in6_e; | 273 | struct sockaddr_in6 *sock_in6, *sock_in6_e; |
273 | struct iscsi_np *np; | 274 | bool ip_match = false; |
274 | int ip_match = 0; | ||
275 | u16 port; | 275 | u16 port; |
276 | 276 | ||
277 | if (sockaddr->ss_family == AF_INET6) { | ||
278 | sock_in6 = (struct sockaddr_in6 *)sockaddr; | ||
279 | sock_in6_e = (struct sockaddr_in6 *)&np->np_sockaddr; | ||
280 | |||
281 | if (!memcmp(&sock_in6->sin6_addr.in6_u, | ||
282 | &sock_in6_e->sin6_addr.in6_u, | ||
283 | sizeof(struct in6_addr))) | ||
284 | ip_match = true; | ||
285 | |||
286 | port = ntohs(sock_in6->sin6_port); | ||
287 | } else { | ||
288 | sock_in = (struct sockaddr_in *)sockaddr; | ||
289 | sock_in_e = (struct sockaddr_in *)&np->np_sockaddr; | ||
290 | |||
291 | if (sock_in->sin_addr.s_addr == sock_in_e->sin_addr.s_addr) | ||
292 | ip_match = true; | ||
293 | |||
294 | port = ntohs(sock_in->sin_port); | ||
295 | } | ||
296 | |||
297 | if ((ip_match == true) && (np->np_port == port) && | ||
298 | (np->np_network_transport == network_transport)) | ||
299 | return true; | ||
300 | |||
301 | return false; | ||
302 | } | ||
303 | |||
304 | static struct iscsi_np *iscsit_get_np( | ||
305 | struct __kernel_sockaddr_storage *sockaddr, | ||
306 | int network_transport) | ||
307 | { | ||
308 | struct iscsi_np *np; | ||
309 | bool match; | ||
310 | |||
277 | spin_lock_bh(&np_lock); | 311 | spin_lock_bh(&np_lock); |
278 | list_for_each_entry(np, &g_np_list, np_list) { | 312 | list_for_each_entry(np, &g_np_list, np_list) { |
279 | spin_lock(&np->np_thread_lock); | 313 | spin_lock(&np->np_thread_lock); |
@@ -282,29 +316,8 @@ static struct iscsi_np *iscsit_get_np( | |||
282 | continue; | 316 | continue; |
283 | } | 317 | } |
284 | 318 | ||
285 | if (sockaddr->ss_family == AF_INET6) { | 319 | match = iscsit_check_np_match(sockaddr, np, network_transport); |
286 | sock_in6 = (struct sockaddr_in6 *)sockaddr; | 320 | if (match == true) { |
287 | sock_in6_e = (struct sockaddr_in6 *)&np->np_sockaddr; | ||
288 | |||
289 | if (!memcmp(&sock_in6->sin6_addr.in6_u, | ||
290 | &sock_in6_e->sin6_addr.in6_u, | ||
291 | sizeof(struct in6_addr))) | ||
292 | ip_match = 1; | ||
293 | |||
294 | port = ntohs(sock_in6->sin6_port); | ||
295 | } else { | ||
296 | sock_in = (struct sockaddr_in *)sockaddr; | ||
297 | sock_in_e = (struct sockaddr_in *)&np->np_sockaddr; | ||
298 | |||
299 | if (sock_in->sin_addr.s_addr == | ||
300 | sock_in_e->sin_addr.s_addr) | ||
301 | ip_match = 1; | ||
302 | |||
303 | port = ntohs(sock_in->sin_port); | ||
304 | } | ||
305 | |||
306 | if ((ip_match == 1) && (np->np_port == port) && | ||
307 | (np->np_network_transport == network_transport)) { | ||
308 | /* | 321 | /* |
309 | * Increment the np_exports reference count now to | 322 | * Increment the np_exports reference count now to |
310 | * prevent iscsit_del_np() below from being called | 323 | * prevent iscsit_del_np() below from being called |
diff --git a/drivers/target/iscsi/iscsi_target.h b/drivers/target/iscsi/iscsi_target.h index f1e4f3155bac..b1a1e6350707 100644 --- a/drivers/target/iscsi/iscsi_target.h +++ b/drivers/target/iscsi/iscsi_target.h | |||
@@ -8,6 +8,8 @@ extern struct iscsi_tiqn *iscsit_add_tiqn(unsigned char *); | |||
8 | extern void iscsit_del_tiqn(struct iscsi_tiqn *); | 8 | extern void iscsit_del_tiqn(struct iscsi_tiqn *); |
9 | extern int iscsit_access_np(struct iscsi_np *, struct iscsi_portal_group *); | 9 | extern int iscsit_access_np(struct iscsi_np *, struct iscsi_portal_group *); |
10 | extern int iscsit_deaccess_np(struct iscsi_np *, struct iscsi_portal_group *); | 10 | extern int iscsit_deaccess_np(struct iscsi_np *, struct iscsi_portal_group *); |
11 | extern bool iscsit_check_np_match(struct __kernel_sockaddr_storage *, | ||
12 | struct iscsi_np *, int); | ||
11 | extern struct iscsi_np *iscsit_add_np(struct __kernel_sockaddr_storage *, | 13 | extern struct iscsi_np *iscsit_add_np(struct __kernel_sockaddr_storage *, |
12 | char *, int); | 14 | char *, int); |
13 | extern int iscsit_reset_np_thread(struct iscsi_np *, struct iscsi_tpg_np *, | 15 | extern int iscsit_reset_np_thread(struct iscsi_np *, struct iscsi_tpg_np *, |