aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-02-26 14:42:23 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2013-02-26 14:42:23 -0500
commitecc88efbe7adceb3f4bfdbbb1efb669efcaab124 (patch)
treed9288ef55a17de21ac41cf84ae696ee83a28e336 /drivers
parent70a3a06d01ed9ca887316a881813cdefb8a20170 (diff)
parent972b29c8f86093f44e1d781588bd5c5faae3d8e3 (diff)
Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending
Pull scsi target updates from Nicholas Bellinger: "The highlights in this series include: - Improve sg_table lookup scalability in RAMDISK_MCP (martin) - Add device attribute to expose config name for INQUIRY model (tregaron) - Convert tcm_vhost to use lock-less list for cmd completion (asias) - Add tcm_vhost support for multiple target's per endpoint (asias) - Add tcm_vhost support for multiple queues per vhost (asias) - Add missing mapped_lun bounds checking during make_mappedlun setup in generic fabric configfs code (jan engelhardt + nab) - Enforce individual iscsi-target network portal export once per TargetName endpoint (grover + nab) - Add WRITE_SAME w/ UNMAP=0 emulation to FILEIO backend (nab) Things have been mostly quiet this round, with majority of the work being done on the iser-target WIP driver + associated iscsi-target refactoring patches currently in flight for v3.10 code. At this point there is one patch series left outstanding from Asias to add support for UNMAP + WRITE_SAME w/ UNMAP=1 to FILEIO awaiting feedback from hch & Co, that will likely be included in a post v3.9-rc1 PULL request if there are no objections. Also, there is a regression bug recently reported off-list that seems to be effecting v3.5 and v3.6 kernels with MSFT iSCSI initiators that is still being tracked down. No word if this effects >= v3.7 just yet, but if so there will likely another PULL request coming your way.." * 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending: (26 commits) target: Rename spc_get_write_same_sectors -> sbc_get_write_same_sectors target/file: Add WRITE_SAME w/ UNMAP=0 emulation support iscsi-target: Enforce individual network portal export once per TargetName iscsi-target: Refactor iscsit_get_np sockaddr matching into iscsit_check_np_match target: Add missing mapped_lun bounds checking during make_mappedlun setup target: Fix lookup of dynamic NodeACLs during cached demo-mode operation target: Fix parameter list length checking in MODE SELECT target: Fix error checking for UNMAP commands target: Fix sense data for out-of-bounds IO operations target_core_rd: break out unterminated loop during copy tcm_vhost: Multi-queue support tcm_vhost: Multi-target support target: Add device attribute to expose config_item_name for INQUIRY model target: don't truncate the fail intr address target: don't always say "ipv6" as address type target/iblock: Use backend REQ_FLUSH hint for WriteCacheEnabled status iscsi-target: make some temporary buffers larger tcm_vhost: Optimize gup in vhost_scsi_map_to_sgl tcm_vhost: Use iov_num_pages to calculate sgl_count tcm_vhost: Introduce iov_num_pages ...
Diffstat (limited to 'drivers')
-rw-r--r--drivers/target/iscsi/iscsi_target.c65
-rw-r--r--drivers/target/iscsi/iscsi_target.h2
-rw-r--r--drivers/target/iscsi/iscsi_target_parameters.c8
-rw-r--r--drivers/target/iscsi/iscsi_target_stat.c25
-rw-r--r--drivers/target/iscsi/iscsi_target_tpg.c39
-rw-r--r--drivers/target/target_core_configfs.c4
-rw-r--r--drivers/target/target_core_device.c58
-rw-r--r--drivers/target/target_core_fabric_configfs.c12
-rw-r--r--drivers/target/target_core_file.c114
-rw-r--r--drivers/target/target_core_iblock.c46
-rw-r--r--drivers/target/target_core_internal.h3
-rw-r--r--drivers/target/target_core_rd.c18
-rw-r--r--drivers/target/target_core_sbc.c8
-rw-r--r--drivers/target/target_core_spc.c42
-rw-r--r--drivers/target/target_core_tmr.c12
-rw-r--r--drivers/target/target_core_tpg.c10
-rw-r--r--drivers/target/target_core_transport.c19
-rw-r--r--drivers/vhost/tcm_vhost.c287
-rw-r--r--drivers/vhost/tcm_vhost.h8
19 files changed, 554 insertions, 226 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
267static struct iscsi_np *iscsit_get_np( 267bool 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
304static 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 *);
8extern void iscsit_del_tiqn(struct iscsi_tiqn *); 8extern void iscsit_del_tiqn(struct iscsi_tiqn *);
9extern int iscsit_access_np(struct iscsi_np *, struct iscsi_portal_group *); 9extern int iscsit_access_np(struct iscsi_np *, struct iscsi_portal_group *);
10extern int iscsit_deaccess_np(struct iscsi_np *, struct iscsi_portal_group *); 10extern int iscsit_deaccess_np(struct iscsi_np *, struct iscsi_portal_group *);
11extern bool iscsit_check_np_match(struct __kernel_sockaddr_storage *,
12 struct iscsi_np *, int);
11extern struct iscsi_np *iscsit_add_np(struct __kernel_sockaddr_storage *, 13extern struct iscsi_np *iscsit_add_np(struct __kernel_sockaddr_storage *,
12 char *, int); 14 char *, int);
13extern int iscsit_reset_np_thread(struct iscsi_np *, struct iscsi_tpg_np *, 15extern int iscsit_reset_np_thread(struct iscsi_np *, struct iscsi_tpg_np *,
diff --git a/drivers/target/iscsi/iscsi_target_parameters.c b/drivers/target/iscsi/iscsi_target_parameters.c
index d89164287d00..ca2be406f141 100644
--- a/drivers/target/iscsi/iscsi_target_parameters.c
+++ b/drivers/target/iscsi/iscsi_target_parameters.c
@@ -1095,11 +1095,11 @@ static int iscsi_check_acceptor_state(struct iscsi_param *param, char *value,
1095 SET_PSTATE_REPLY_OPTIONAL(param); 1095 SET_PSTATE_REPLY_OPTIONAL(param);
1096 } 1096 }
1097 } else if (IS_TYPE_NUMBER(param)) { 1097 } else if (IS_TYPE_NUMBER(param)) {
1098 char *tmpptr, buf[10]; 1098 char *tmpptr, buf[11];
1099 u32 acceptor_value = simple_strtoul(param->value, &tmpptr, 0); 1099 u32 acceptor_value = simple_strtoul(param->value, &tmpptr, 0);
1100 u32 proposer_value = simple_strtoul(value, &tmpptr, 0); 1100 u32 proposer_value = simple_strtoul(value, &tmpptr, 0);
1101 1101
1102 memset(buf, 0, 10); 1102 memset(buf, 0, sizeof(buf));
1103 1103
1104 if (!strcmp(param->name, MAXCONNECTIONS) || 1104 if (!strcmp(param->name, MAXCONNECTIONS) ||
1105 !strcmp(param->name, MAXBURSTLENGTH) || 1105 !strcmp(param->name, MAXBURSTLENGTH) ||
@@ -1503,8 +1503,8 @@ static int iscsi_enforce_integrity_rules(
1503 FirstBurstLength = simple_strtoul(param->value, 1503 FirstBurstLength = simple_strtoul(param->value,
1504 &tmpptr, 0); 1504 &tmpptr, 0);
1505 if (FirstBurstLength > MaxBurstLength) { 1505 if (FirstBurstLength > MaxBurstLength) {
1506 char tmpbuf[10]; 1506 char tmpbuf[11];
1507 memset(tmpbuf, 0, 10); 1507 memset(tmpbuf, 0, sizeof(tmpbuf));
1508 sprintf(tmpbuf, "%u", MaxBurstLength); 1508 sprintf(tmpbuf, "%u", MaxBurstLength);