diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-02-26 14:42:23 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-02-26 14:42:23 -0500 |
| commit | ecc88efbe7adceb3f4bfdbbb1efb669efcaab124 (patch) | |
| tree | d9288ef55a17de21ac41cf84ae696ee83a28e336 /drivers | |
| parent | 70a3a06d01ed9ca887316a881813cdefb8a20170 (diff) | |
| parent | 972b29c8f86093f44e1d781588bd5c5faae3d8e3 (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.c | 65 | ||||
| -rw-r--r-- | drivers/target/iscsi/iscsi_target.h | 2 | ||||
| -rw-r--r-- | drivers/target/iscsi/iscsi_target_parameters.c | 8 | ||||
| -rw-r--r-- | drivers/target/iscsi/iscsi_target_stat.c | 25 | ||||
| -rw-r--r-- | drivers/target/iscsi/iscsi_target_tpg.c | 39 | ||||
| -rw-r--r-- | drivers/target/target_core_configfs.c | 4 | ||||
| -rw-r--r-- | drivers/target/target_core_device.c | 58 | ||||
| -rw-r--r-- | drivers/target/target_core_fabric_configfs.c | 12 | ||||
| -rw-r--r-- | drivers/target/target_core_file.c | 114 | ||||
| -rw-r--r-- | drivers/target/target_core_iblock.c | 46 | ||||
| -rw-r--r-- | drivers/target/target_core_internal.h | 3 | ||||
| -rw-r--r-- | drivers/target/target_core_rd.c | 18 | ||||
| -rw-r--r-- | drivers/target/target_core_sbc.c | 8 | ||||
| -rw-r--r-- | drivers/target/target_core_spc.c | 42 | ||||
| -rw-r--r-- | drivers/target/target_core_tmr.c | 12 | ||||
| -rw-r--r-- | drivers/target/target_core_tpg.c | 10 | ||||
| -rw-r--r-- | drivers/target/target_core_transport.c | 19 | ||||
| -rw-r--r-- | drivers/vhost/tcm_vhost.c | 287 | ||||
| -rw-r--r-- | drivers/vhost/tcm_vhost.h | 8 |
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 | ||
| 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 *, |
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); |
