diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-10-25 09:42:01 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-10-25 09:42:01 -0400 |
commit | 1442d1678ca7e53574fd403ba7bee6f4125d920c (patch) | |
tree | fd053a849158d2c5b8345ced8982108825b85736 /net/sunrpc | |
parent | 7e0bb71e75020348bee523720a0c2f04cc72f540 (diff) | |
parent | 345c284290cabb5484df909303e73d6def8ec8ec (diff) |
Merge branch 'for-3.2' of git://linux-nfs.org/~bfields/linux
* 'for-3.2' of git://linux-nfs.org/~bfields/linux: (103 commits)
nfs41: implement DESTROY_CLIENTID operation
nfsd4: typo logical vs bitwise negate for want_mask
nfsd4: allow NFS4_SHARE_SIGNAL_DELEG_WHEN_RESRC_AVAIL | NFS4_SHARE_PUSH_DELEG_WHEN_UNCONTENDED
nfsd4: seq->status_flags may be used unitialized
nfsd41: use SEQ4_STATUS_BACKCHANNEL_FAULT when cb_sequence is invalid
nfsd4: implement new 4.1 open reclaim types
nfsd4: remove unneeded CLAIM_DELEGATE_CUR workaround
nfsd4: warn on open failure after create
nfsd4: preallocate open stateid in process_open1()
nfsd4: do idr preallocation with stateid allocation
nfsd4: preallocate nfs4_file in process_open1()
nfsd4: clean up open owners on OPEN failure
nfsd4: simplify process_open1 logic
nfsd4: make is_open_owner boolean
nfsd4: centralize renew_client() calls
nfsd4: typo logical vs bitwise negate
nfs: fix bug about IPv6 address scope checking
nfsd4: more robust ignoring of WANT bits in OPEN
nfsd4: move name-length checks to xdr
nfsd4: move access/deny validity checks to xdr code
...
Diffstat (limited to 'net/sunrpc')
-rw-r--r-- | net/sunrpc/rpc_pipe.c | 3 | ||||
-rw-r--r-- | net/sunrpc/svc.c | 33 | ||||
-rw-r--r-- | net/sunrpc/svc_xprt.c | 13 | ||||
-rw-r--r-- | net/sunrpc/svcsock.c | 23 |
4 files changed, 46 insertions, 26 deletions
diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c index b181e3441323..3156ba864519 100644 --- a/net/sunrpc/rpc_pipe.c +++ b/net/sunrpc/rpc_pipe.c | |||
@@ -1084,3 +1084,6 @@ void unregister_rpc_pipefs(void) | |||
1084 | kmem_cache_destroy(rpc_inode_cachep); | 1084 | kmem_cache_destroy(rpc_inode_cachep); |
1085 | unregister_filesystem(&rpc_pipe_fs_type); | 1085 | unregister_filesystem(&rpc_pipe_fs_type); |
1086 | } | 1086 | } |
1087 | |||
1088 | /* Make 'mount -t rpc_pipefs ...' autoload this module. */ | ||
1089 | MODULE_ALIAS("rpc_pipefs"); | ||
diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c index 6a69a1131fb7..30d70abb4e2c 100644 --- a/net/sunrpc/svc.c +++ b/net/sunrpc/svc.c | |||
@@ -295,6 +295,18 @@ svc_pool_map_put(void) | |||
295 | } | 295 | } |
296 | 296 | ||
297 | 297 | ||
298 | static int svc_pool_map_get_node(unsigned int pidx) | ||
299 | { | ||
300 | const struct svc_pool_map *m = &svc_pool_map; | ||
301 | |||
302 | if (m->count) { | ||
303 | if (m->mode == SVC_POOL_PERCPU) | ||
304 | return cpu_to_node(m->pool_to[pidx]); | ||
305 | if (m->mode == SVC_POOL_PERNODE) | ||
306 | return m->pool_to[pidx]; | ||
307 | } | ||
308 | return NUMA_NO_NODE; | ||
309 | } | ||
298 | /* | 310 | /* |
299 | * Set the given thread's cpus_allowed mask so that it | 311 | * Set the given thread's cpus_allowed mask so that it |
300 | * will only run on cpus in the given pool. | 312 | * will only run on cpus in the given pool. |
@@ -499,7 +511,7 @@ EXPORT_SYMBOL_GPL(svc_destroy); | |||
499 | * We allocate pages and place them in rq_argpages. | 511 | * We allocate pages and place them in rq_argpages. |
500 | */ | 512 | */ |
501 | static int | 513 | static int |
502 | svc_init_buffer(struct svc_rqst *rqstp, unsigned int size) | 514 | svc_init_buffer(struct svc_rqst *rqstp, unsigned int size, int node) |
503 | { | 515 | { |
504 | unsigned int pages, arghi; | 516 | unsigned int pages, arghi; |
505 | 517 | ||
@@ -513,7 +525,7 @@ svc_init_buffer(struct svc_rqst *rqstp, unsigned int size) | |||
513 | arghi = 0; | 525 | arghi = 0; |
514 | BUG_ON(pages > RPCSVC_MAXPAGES); | 526 | BUG_ON(pages > RPCSVC_MAXPAGES); |
515 | while (pages) { | 527 | while (pages) { |
516 | struct page *p = alloc_page(GFP_KERNEL); | 528 | struct page *p = alloc_pages_node(node, GFP_KERNEL, 0); |
517 | if (!p) | 529 | if (!p) |
518 | break; | 530 | break; |
519 | rqstp->rq_pages[arghi++] = p; | 531 | rqstp->rq_pages[arghi++] = p; |
@@ -536,11 +548,11 @@ svc_release_buffer(struct svc_rqst *rqstp) | |||
536 | } | 548 | } |
537 | 549 | ||
538 | struct svc_rqst * | 550 | struct svc_rqst * |
539 | svc_prepare_thread(struct svc_serv *serv, struct svc_pool *pool) | 551 | svc_prepare_thread(struct svc_serv *serv, struct svc_pool *pool, int node) |
540 | { | 552 | { |
541 | struct svc_rqst *rqstp; | 553 | struct svc_rqst *rqstp; |
542 | 554 | ||
543 | rqstp = kzalloc(sizeof(*rqstp), GFP_KERNEL); | 555 | rqstp = kzalloc_node(sizeof(*rqstp), GFP_KERNEL, node); |
544 | if (!rqstp) | 556 | if (!rqstp) |
545 | goto out_enomem; | 557 | goto out_enomem; |
546 | 558 | ||
@@ -554,15 +566,15 @@ svc_prepare_thread(struct svc_serv *serv, struct svc_pool *pool) | |||
554 | rqstp->rq_server = serv; | 566 | rqstp->rq_server = serv; |
555 | rqstp->rq_pool = pool; | 567 | rqstp->rq_pool = pool; |
556 | 568 | ||
557 | rqstp->rq_argp = kmalloc(serv->sv_xdrsize, GFP_KERNEL); | 569 | rqstp->rq_argp = kmalloc_node(serv->sv_xdrsize, GFP_KERNEL, node); |
558 | if (!rqstp->rq_argp) | 570 | if (!rqstp->rq_argp) |
559 | goto out_thread; | 571 | goto out_thread; |
560 | 572 | ||
561 | rqstp->rq_resp = kmalloc(serv->sv_xdrsize, GFP_KERNEL); | 573 | rqstp->rq_resp = kmalloc_node(serv->sv_xdrsize, GFP_KERNEL, node); |
562 | if (!rqstp->rq_resp) | 574 | if (!rqstp->rq_resp) |
563 | goto out_thread; | 575 | goto out_thread; |
564 | 576 | ||
565 | if (!svc_init_buffer(rqstp, serv->sv_max_mesg)) | 577 | if (!svc_init_buffer(rqstp, serv->sv_max_mesg, node)) |
566 | goto out_thread; | 578 | goto out_thread; |
567 | 579 | ||
568 | return rqstp; | 580 | return rqstp; |
@@ -647,6 +659,7 @@ svc_set_num_threads(struct svc_serv *serv, struct svc_pool *pool, int nrservs) | |||
647 | struct svc_pool *chosen_pool; | 659 | struct svc_pool *chosen_pool; |
648 | int error = 0; | 660 | int error = 0; |
649 | unsigned int state = serv->sv_nrthreads-1; | 661 | unsigned int state = serv->sv_nrthreads-1; |
662 | int node; | ||
650 | 663 | ||
651 | if (pool == NULL) { | 664 | if (pool == NULL) { |
652 | /* The -1 assumes caller has done a svc_get() */ | 665 | /* The -1 assumes caller has done a svc_get() */ |
@@ -662,14 +675,16 @@ svc_set_num_threads(struct svc_serv *serv, struct svc_pool *pool, int nrservs) | |||
662 | nrservs--; | 675 | nrservs--; |
663 | chosen_pool = choose_pool(serv, pool, &state); | 676 | chosen_pool = choose_pool(serv, pool, &state); |
664 | 677 | ||
665 | rqstp = svc_prepare_thread(serv, chosen_pool); | 678 | node = svc_pool_map_get_node(chosen_pool->sp_id); |
679 | rqstp = svc_prepare_thread(serv, chosen_pool, node); | ||
666 | if (IS_ERR(rqstp)) { | 680 | if (IS_ERR(rqstp)) { |
667 | error = PTR_ERR(rqstp); | 681 | error = PTR_ERR(rqstp); |
668 | break; | 682 | break; |
669 | } | 683 | } |
670 | 684 | ||
671 | __module_get(serv->sv_module); | 685 | __module_get(serv->sv_module); |
672 | task = kthread_create(serv->sv_function, rqstp, serv->sv_name); | 686 | task = kthread_create_on_node(serv->sv_function, rqstp, |
687 | node, serv->sv_name); | ||
673 | if (IS_ERR(task)) { | 688 | if (IS_ERR(task)) { |
674 | error = PTR_ERR(task); | 689 | error = PTR_ERR(task); |
675 | module_put(serv->sv_module); | 690 | module_put(serv->sv_module); |
diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c index bd31208bbb61..d86bb673e1f6 100644 --- a/net/sunrpc/svc_xprt.c +++ b/net/sunrpc/svc_xprt.c | |||
@@ -254,8 +254,6 @@ EXPORT_SYMBOL_GPL(svc_create_xprt); | |||
254 | */ | 254 | */ |
255 | void svc_xprt_copy_addrs(struct svc_rqst *rqstp, struct svc_xprt *xprt) | 255 | void svc_xprt_copy_addrs(struct svc_rqst *rqstp, struct svc_xprt *xprt) |
256 | { | 256 | { |
257 | struct sockaddr *sin; | ||
258 | |||
259 | memcpy(&rqstp->rq_addr, &xprt->xpt_remote, xprt->xpt_remotelen); | 257 | memcpy(&rqstp->rq_addr, &xprt->xpt_remote, xprt->xpt_remotelen); |
260 | rqstp->rq_addrlen = xprt->xpt_remotelen; | 258 | rqstp->rq_addrlen = xprt->xpt_remotelen; |
261 | 259 | ||
@@ -263,15 +261,8 @@ void svc_xprt_copy_addrs(struct svc_rqst *rqstp, struct svc_xprt *xprt) | |||
263 | * Destination address in request is needed for binding the | 261 | * Destination address in request is needed for binding the |
264 | * source address in RPC replies/callbacks later. | 262 | * source address in RPC replies/callbacks later. |
265 | */ | 263 | */ |
266 | sin = (struct sockaddr *)&xprt->xpt_local; | 264 | memcpy(&rqstp->rq_daddr, &xprt->xpt_local, xprt->xpt_locallen); |
267 | switch (sin->sa_family) { | 265 | rqstp->rq_daddrlen = xprt->xpt_locallen; |
268 | case AF_INET: | ||
269 | rqstp->rq_daddr.addr = ((struct sockaddr_in *)sin)->sin_addr; | ||
270 | break; | ||
271 | case AF_INET6: | ||
272 | rqstp->rq_daddr.addr6 = ((struct sockaddr_in6 *)sin)->sin6_addr; | ||
273 | break; | ||
274 | } | ||
275 | } | 266 | } |
276 | EXPORT_SYMBOL_GPL(svc_xprt_copy_addrs); | 267 | EXPORT_SYMBOL_GPL(svc_xprt_copy_addrs); |
277 | 268 | ||
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c index 767d494de7a2..dfd686eb0b7f 100644 --- a/net/sunrpc/svcsock.c +++ b/net/sunrpc/svcsock.c | |||
@@ -143,19 +143,20 @@ static void svc_set_cmsg_data(struct svc_rqst *rqstp, struct cmsghdr *cmh) | |||
143 | cmh->cmsg_level = SOL_IP; | 143 | cmh->cmsg_level = SOL_IP; |
144 | cmh->cmsg_type = IP_PKTINFO; | 144 | cmh->cmsg_type = IP_PKTINFO; |
145 | pki->ipi_ifindex = 0; | 145 | pki->ipi_ifindex = 0; |
146 | pki->ipi_spec_dst.s_addr = rqstp->rq_daddr.addr.s_addr; | 146 | pki->ipi_spec_dst.s_addr = |
147 | svc_daddr_in(rqstp)->sin_addr.s_addr; | ||
147 | cmh->cmsg_len = CMSG_LEN(sizeof(*pki)); | 148 | cmh->cmsg_len = CMSG_LEN(sizeof(*pki)); |
148 | } | 149 | } |
149 | break; | 150 | break; |
150 | 151 | ||
151 | case AF_INET6: { | 152 | case AF_INET6: { |
152 | struct in6_pktinfo *pki = CMSG_DATA(cmh); | 153 | struct in6_pktinfo *pki = CMSG_DATA(cmh); |
154 | struct sockaddr_in6 *daddr = svc_daddr_in6(rqstp); | ||
153 | 155 | ||
154 | cmh->cmsg_level = SOL_IPV6; | 156 | cmh->cmsg_level = SOL_IPV6; |
155 | cmh->cmsg_type = IPV6_PKTINFO; | 157 | cmh->cmsg_type = IPV6_PKTINFO; |
156 | pki->ipi6_ifindex = 0; | 158 | pki->ipi6_ifindex = daddr->sin6_scope_id; |
157 | ipv6_addr_copy(&pki->ipi6_addr, | 159 | ipv6_addr_copy(&pki->ipi6_addr, &daddr->sin6_addr); |
158 | &rqstp->rq_daddr.addr6); | ||
159 | cmh->cmsg_len = CMSG_LEN(sizeof(*pki)); | 160 | cmh->cmsg_len = CMSG_LEN(sizeof(*pki)); |
160 | } | 161 | } |
161 | break; | 162 | break; |
@@ -498,9 +499,13 @@ static int svc_udp_get_dest_address4(struct svc_rqst *rqstp, | |||
498 | struct cmsghdr *cmh) | 499 | struct cmsghdr *cmh) |
499 | { | 500 | { |
500 | struct in_pktinfo *pki = CMSG_DATA(cmh); | 501 | struct in_pktinfo *pki = CMSG_DATA(cmh); |
502 | struct sockaddr_in *daddr = svc_daddr_in(rqstp); | ||
503 | |||
501 | if (cmh->cmsg_type != IP_PKTINFO) | 504 | if (cmh->cmsg_type != IP_PKTINFO) |
502 | return 0; | 505 | return 0; |
503 | rqstp->rq_daddr.addr.s_addr = pki->ipi_spec_dst.s_addr; | 506 | |
507 | daddr->sin_family = AF_INET; | ||
508 | daddr->sin_addr.s_addr = pki->ipi_spec_dst.s_addr; | ||
504 | return 1; | 509 | return 1; |
505 | } | 510 | } |
506 | 511 | ||
@@ -511,9 +516,14 @@ static int svc_udp_get_dest_address6(struct svc_rqst *rqstp, | |||
511 | struct cmsghdr *cmh) | 516 | struct cmsghdr *cmh) |
512 | { | 517 | { |
513 | struct in6_pktinfo *pki = CMSG_DATA(cmh); | 518 | struct in6_pktinfo *pki = CMSG_DATA(cmh); |
519 | struct sockaddr_in6 *daddr = svc_daddr_in6(rqstp); | ||
520 | |||
514 | if (cmh->cmsg_type != IPV6_PKTINFO) | 521 | if (cmh->cmsg_type != IPV6_PKTINFO) |
515 | return 0; | 522 | return 0; |
516 | ipv6_addr_copy(&rqstp->rq_daddr.addr6, &pki->ipi6_addr); | 523 | |
524 | daddr->sin6_family = AF_INET6; | ||
525 | ipv6_addr_copy(&daddr->sin6_addr, &pki->ipi6_addr); | ||
526 | daddr->sin6_scope_id = pki->ipi6_ifindex; | ||
517 | return 1; | 527 | return 1; |
518 | } | 528 | } |
519 | 529 | ||
@@ -614,6 +624,7 @@ static int svc_udp_recvfrom(struct svc_rqst *rqstp) | |||
614 | skb_free_datagram_locked(svsk->sk_sk, skb); | 624 | skb_free_datagram_locked(svsk->sk_sk, skb); |
615 | return 0; | 625 | return 0; |
616 | } | 626 | } |
627 | rqstp->rq_daddrlen = svc_addr_len(svc_daddr(rqstp)); | ||
617 | 628 | ||
618 | if (skb_is_nonlinear(skb)) { | 629 | if (skb_is_nonlinear(skb)) { |
619 | /* we have to copy */ | 630 | /* we have to copy */ |