diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/core/dev.c | 2 | ||||
-rw-r--r-- | net/core/flow.c | 2 | ||||
-rw-r--r-- | net/ipv4/ipvs/ip_vs_ctl.c | 1 | ||||
-rw-r--r-- | net/iucv/iucv.c | 6 | ||||
-rw-r--r-- | net/sunrpc/auth_gss/svcauth_gss.c | 15 | ||||
-rw-r--r-- | net/sunrpc/rpc_pipe.c | 9 | ||||
-rw-r--r-- | net/sunrpc/sunrpc_syms.c | 6 | ||||
-rw-r--r-- | net/sunrpc/svc.c | 2 | ||||
-rw-r--r-- | net/sunrpc/svcauth_unix.c | 10 | ||||
-rw-r--r-- | net/sunrpc/svcsock.c | 34 |
10 files changed, 54 insertions, 33 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 4317c1be4d3f..8301e2ac747f 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -3450,7 +3450,7 @@ static int dev_cpu_callback(struct notifier_block *nfb, | |||
3450 | unsigned int cpu, oldcpu = (unsigned long)ocpu; | 3450 | unsigned int cpu, oldcpu = (unsigned long)ocpu; |
3451 | struct softnet_data *sd, *oldsd; | 3451 | struct softnet_data *sd, *oldsd; |
3452 | 3452 | ||
3453 | if (action != CPU_DEAD) | 3453 | if (action != CPU_DEAD && action != CPU_DEAD_FROZEN) |
3454 | return NOTIFY_OK; | 3454 | return NOTIFY_OK; |
3455 | 3455 | ||
3456 | local_irq_disable(); | 3456 | local_irq_disable(); |
diff --git a/net/core/flow.c b/net/core/flow.c index 5d25697920b1..051430545a05 100644 --- a/net/core/flow.c +++ b/net/core/flow.c | |||
@@ -338,7 +338,7 @@ static int flow_cache_cpu(struct notifier_block *nfb, | |||
338 | unsigned long action, | 338 | unsigned long action, |
339 | void *hcpu) | 339 | void *hcpu) |
340 | { | 340 | { |
341 | if (action == CPU_DEAD) | 341 | if (action == CPU_DEAD || action == CPU_DEAD_FROZEN) |
342 | __flow_cache_shrink((unsigned long)hcpu, 0); | 342 | __flow_cache_shrink((unsigned long)hcpu, 0); |
343 | return NOTIFY_OK; | 343 | return NOTIFY_OK; |
344 | } | 344 | } |
diff --git a/net/ipv4/ipvs/ip_vs_ctl.c b/net/ipv4/ipvs/ip_vs_ctl.c index b3050a6817e7..68fe1d4d0210 100644 --- a/net/ipv4/ipvs/ip_vs_ctl.c +++ b/net/ipv4/ipvs/ip_vs_ctl.c | |||
@@ -2387,6 +2387,7 @@ void ip_vs_control_cleanup(void) | |||
2387 | EnterFunction(2); | 2387 | EnterFunction(2); |
2388 | ip_vs_trash_cleanup(); | 2388 | ip_vs_trash_cleanup(); |
2389 | cancel_rearming_delayed_work(&defense_work); | 2389 | cancel_rearming_delayed_work(&defense_work); |
2390 | cancel_work_sync(&defense_work.work); | ||
2390 | ip_vs_kill_estimator(&ip_vs_stats); | 2391 | ip_vs_kill_estimator(&ip_vs_stats); |
2391 | unregister_sysctl_table(sysctl_header); | 2392 | unregister_sysctl_table(sysctl_header); |
2392 | proc_net_remove("ip_vs_stats"); | 2393 | proc_net_remove("ip_vs_stats"); |
diff --git a/net/iucv/iucv.c b/net/iucv/iucv.c index fb3faf72e850..b7333061016d 100644 --- a/net/iucv/iucv.c +++ b/net/iucv/iucv.c | |||
@@ -556,6 +556,7 @@ static int __cpuinit iucv_cpu_notify(struct notifier_block *self, | |||
556 | 556 | ||
557 | switch (action) { | 557 | switch (action) { |
558 | case CPU_UP_PREPARE: | 558 | case CPU_UP_PREPARE: |
559 | case CPU_UP_PREPARE_FROZEN: | ||
559 | if (!percpu_populate(iucv_irq_data, | 560 | if (!percpu_populate(iucv_irq_data, |
560 | sizeof(struct iucv_irq_data), | 561 | sizeof(struct iucv_irq_data), |
561 | GFP_KERNEL|GFP_DMA, cpu)) | 562 | GFP_KERNEL|GFP_DMA, cpu)) |
@@ -567,15 +568,20 @@ static int __cpuinit iucv_cpu_notify(struct notifier_block *self, | |||
567 | } | 568 | } |
568 | break; | 569 | break; |
569 | case CPU_UP_CANCELED: | 570 | case CPU_UP_CANCELED: |
571 | case CPU_UP_CANCELED_FROZEN: | ||
570 | case CPU_DEAD: | 572 | case CPU_DEAD: |
573 | case CPU_DEAD_FROZEN: | ||
571 | percpu_depopulate(iucv_param, cpu); | 574 | percpu_depopulate(iucv_param, cpu); |
572 | percpu_depopulate(iucv_irq_data, cpu); | 575 | percpu_depopulate(iucv_irq_data, cpu); |
573 | break; | 576 | break; |
574 | case CPU_ONLINE: | 577 | case CPU_ONLINE: |
578 | case CPU_ONLINE_FROZEN: | ||
575 | case CPU_DOWN_FAILED: | 579 | case CPU_DOWN_FAILED: |
580 | case CPU_DOWN_FAILED_FROZEN: | ||
576 | smp_call_function_on(iucv_declare_cpu, NULL, 0, 1, cpu); | 581 | smp_call_function_on(iucv_declare_cpu, NULL, 0, 1, cpu); |
577 | break; | 582 | break; |
578 | case CPU_DOWN_PREPARE: | 583 | case CPU_DOWN_PREPARE: |
584 | case CPU_DOWN_PREPARE_FROZEN: | ||
579 | cpumask = iucv_buffer_cpumask; | 585 | cpumask = iucv_buffer_cpumask; |
580 | cpu_clear(cpu, cpumask); | 586 | cpu_clear(cpu, cpumask); |
581 | if (cpus_empty(cpumask)) | 587 | if (cpus_empty(cpumask)) |
diff --git a/net/sunrpc/auth_gss/svcauth_gss.c b/net/sunrpc/auth_gss/svcauth_gss.c index db298b501c81..099a983797da 100644 --- a/net/sunrpc/auth_gss/svcauth_gss.c +++ b/net/sunrpc/auth_gss/svcauth_gss.c | |||
@@ -924,6 +924,7 @@ static inline int | |||
924 | gss_write_init_verf(struct svc_rqst *rqstp, struct rsi *rsip) | 924 | gss_write_init_verf(struct svc_rqst *rqstp, struct rsi *rsip) |
925 | { | 925 | { |
926 | struct rsc *rsci; | 926 | struct rsc *rsci; |
927 | int rc; | ||
927 | 928 | ||
928 | if (rsip->major_status != GSS_S_COMPLETE) | 929 | if (rsip->major_status != GSS_S_COMPLETE) |
929 | return gss_write_null_verf(rqstp); | 930 | return gss_write_null_verf(rqstp); |
@@ -932,7 +933,9 @@ gss_write_init_verf(struct svc_rqst *rqstp, struct rsi *rsip) | |||
932 | rsip->major_status = GSS_S_NO_CONTEXT; | 933 | rsip->major_status = GSS_S_NO_CONTEXT; |
933 | return gss_write_null_verf(rqstp); | 934 | return gss_write_null_verf(rqstp); |
934 | } | 935 | } |
935 | return gss_write_verf(rqstp, rsci->mechctx, GSS_SEQ_WIN); | 936 | rc = gss_write_verf(rqstp, rsci->mechctx, GSS_SEQ_WIN); |
937 | cache_put(&rsci->h, &rsc_cache); | ||
938 | return rc; | ||
936 | } | 939 | } |
937 | 940 | ||
938 | /* | 941 | /* |
@@ -1089,6 +1092,8 @@ svcauth_gss_accept(struct svc_rqst *rqstp, __be32 *authp) | |||
1089 | } | 1092 | } |
1090 | goto complete; | 1093 | goto complete; |
1091 | case RPC_GSS_PROC_DESTROY: | 1094 | case RPC_GSS_PROC_DESTROY: |
1095 | if (gss_write_verf(rqstp, rsci->mechctx, gc->gc_seq)) | ||
1096 | goto auth_err; | ||
1092 | set_bit(CACHE_NEGATIVE, &rsci->h.flags); | 1097 | set_bit(CACHE_NEGATIVE, &rsci->h.flags); |
1093 | if (resv->iov_len + 4 > PAGE_SIZE) | 1098 | if (resv->iov_len + 4 > PAGE_SIZE) |
1094 | goto drop; | 1099 | goto drop; |
@@ -1196,13 +1201,7 @@ svcauth_gss_wrap_resp_integ(struct svc_rqst *rqstp) | |||
1196 | if (xdr_buf_subsegment(resbuf, &integ_buf, integ_offset, | 1201 | if (xdr_buf_subsegment(resbuf, &integ_buf, integ_offset, |
1197 | integ_len)) | 1202 | integ_len)) |
1198 | BUG(); | 1203 | BUG(); |
1199 | if (resbuf->page_len == 0 | 1204 | if (resbuf->tail[0].iov_base == NULL) { |
1200 | && resbuf->head[0].iov_len + RPC_MAX_AUTH_SIZE | ||
1201 | < PAGE_SIZE) { | ||
1202 | BUG_ON(resbuf->tail[0].iov_len); | ||
1203 | /* Use head for everything */ | ||
1204 | resv = &resbuf->head[0]; | ||
1205 | } else if (resbuf->tail[0].iov_base == NULL) { | ||
1206 | if (resbuf->head[0].iov_len + RPC_MAX_AUTH_SIZE > PAGE_SIZE) | 1205 | if (resbuf->head[0].iov_len + RPC_MAX_AUTH_SIZE > PAGE_SIZE) |
1207 | goto out_err; | 1206 | goto out_err; |
1208 | resbuf->tail[0].iov_base = resbuf->head[0].iov_base | 1207 | resbuf->tail[0].iov_base = resbuf->head[0].iov_base |
diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c index ad39b47e05bc..a2f1893bde53 100644 --- a/net/sunrpc/rpc_pipe.c +++ b/net/sunrpc/rpc_pipe.c | |||
@@ -845,6 +845,8 @@ init_once(void * foo, struct kmem_cache * cachep, unsigned long flags) | |||
845 | 845 | ||
846 | int register_rpc_pipefs(void) | 846 | int register_rpc_pipefs(void) |
847 | { | 847 | { |
848 | int err; | ||
849 | |||
848 | rpc_inode_cachep = kmem_cache_create("rpc_inode_cache", | 850 | rpc_inode_cachep = kmem_cache_create("rpc_inode_cache", |
849 | sizeof(struct rpc_inode), | 851 | sizeof(struct rpc_inode), |
850 | 0, (SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT| | 852 | 0, (SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT| |
@@ -852,7 +854,12 @@ int register_rpc_pipefs(void) | |||
852 | init_once, NULL); | 854 | init_once, NULL); |
853 | if (!rpc_inode_cachep) | 855 | if (!rpc_inode_cachep) |
854 | return -ENOMEM; | 856 | return -ENOMEM; |
855 | register_filesystem(&rpc_pipe_fs_type); | 857 | err = register_filesystem(&rpc_pipe_fs_type); |
858 | if (err) { | ||
859 | kmem_cache_destroy(rpc_inode_cachep); | ||
860 | return err; | ||
861 | } | ||
862 | |||
856 | return 0; | 863 | return 0; |
857 | } | 864 | } |
858 | 865 | ||
diff --git a/net/sunrpc/sunrpc_syms.c b/net/sunrpc/sunrpc_syms.c index 43ecf62f12ef..0d35bc796d00 100644 --- a/net/sunrpc/sunrpc_syms.c +++ b/net/sunrpc/sunrpc_syms.c | |||
@@ -146,9 +146,11 @@ init_sunrpc(void) | |||
146 | int err = register_rpc_pipefs(); | 146 | int err = register_rpc_pipefs(); |
147 | if (err) | 147 | if (err) |
148 | goto out; | 148 | goto out; |
149 | err = rpc_init_mempool() != 0; | 149 | err = rpc_init_mempool(); |
150 | if (err) | 150 | if (err) { |
151 | unregister_rpc_pipefs(); | ||
151 | goto out; | 152 | goto out; |
153 | } | ||
152 | #ifdef RPC_DEBUG | 154 | #ifdef RPC_DEBUG |
153 | rpc_register_sysctl(); | 155 | rpc_register_sysctl(); |
154 | #endif | 156 | #endif |
diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c index b7503c103ae8..e673ef993904 100644 --- a/net/sunrpc/svc.c +++ b/net/sunrpc/svc.c | |||
@@ -907,7 +907,7 @@ svc_process(struct svc_rqst *rqstp) | |||
907 | * better idea of reply size | 907 | * better idea of reply size |
908 | */ | 908 | */ |
909 | if (procp->pc_xdrressize) | 909 | if (procp->pc_xdrressize) |
910 | svc_reserve(rqstp, procp->pc_xdrressize<<2); | 910 | svc_reserve_auth(rqstp, procp->pc_xdrressize<<2); |
911 | 911 | ||
912 | /* Call the function that processes the request. */ | 912 | /* Call the function that processes the request. */ |
913 | if (!versp->vs_dispatch) { | 913 | if (!versp->vs_dispatch) { |
diff --git a/net/sunrpc/svcauth_unix.c b/net/sunrpc/svcauth_unix.c index 2bd23ea2aa8b..07dcd20cbee4 100644 --- a/net/sunrpc/svcauth_unix.c +++ b/net/sunrpc/svcauth_unix.c | |||
@@ -385,7 +385,7 @@ ip_map_cached_get(struct svc_rqst *rqstp) | |||
385 | { | 385 | { |
386 | struct ip_map *ipm; | 386 | struct ip_map *ipm; |
387 | struct svc_sock *svsk = rqstp->rq_sock; | 387 | struct svc_sock *svsk = rqstp->rq_sock; |
388 | spin_lock_bh(&svsk->sk_defer_lock); | 388 | spin_lock(&svsk->sk_lock); |
389 | ipm = svsk->sk_info_authunix; | 389 | ipm = svsk->sk_info_authunix; |
390 | if (ipm != NULL) { | 390 | if (ipm != NULL) { |
391 | if (!cache_valid(&ipm->h)) { | 391 | if (!cache_valid(&ipm->h)) { |
@@ -395,13 +395,13 @@ ip_map_cached_get(struct svc_rqst *rqstp) | |||
395 | * same IP address. | 395 | * same IP address. |
396 | */ | 396 | */ |
397 | svsk->sk_info_authunix = NULL; | 397 | svsk->sk_info_authunix = NULL; |
398 | spin_unlock_bh(&svsk->sk_defer_lock); | 398 | spin_unlock(&svsk->sk_lock); |
399 | cache_put(&ipm->h, &ip_map_cache); | 399 | cache_put(&ipm->h, &ip_map_cache); |
400 | return NULL; | 400 | return NULL; |
401 | } | 401 | } |
402 | cache_get(&ipm->h); | 402 | cache_get(&ipm->h); |
403 | } | 403 | } |
404 | spin_unlock_bh(&svsk->sk_defer_lock); | 404 | spin_unlock(&svsk->sk_lock); |
405 | return ipm; | 405 | return ipm; |
406 | } | 406 | } |
407 | 407 | ||
@@ -410,14 +410,14 @@ ip_map_cached_put(struct svc_rqst *rqstp, struct ip_map *ipm) | |||
410 | { | 410 | { |
411 | struct svc_sock *svsk = rqstp->rq_sock; | 411 | struct svc_sock *svsk = rqstp->rq_sock; |
412 | 412 | ||
413 | spin_lock_bh(&svsk->sk_defer_lock); | 413 | spin_lock(&svsk->sk_lock); |
414 | if (svsk->sk_sock->type == SOCK_STREAM && | 414 | if (svsk->sk_sock->type == SOCK_STREAM && |
415 | svsk->sk_info_authunix == NULL) { | 415 | svsk->sk_info_authunix == NULL) { |
416 | /* newly cached, keep the reference */ | 416 | /* newly cached, keep the reference */ |
417 | svsk->sk_info_authunix = ipm; | 417 | svsk->sk_info_authunix = ipm; |
418 | ipm = NULL; | 418 | ipm = NULL; |
419 | } | 419 | } |
420 | spin_unlock_bh(&svsk->sk_defer_lock); | 420 | spin_unlock(&svsk->sk_lock); |
421 | if (ipm) | 421 | if (ipm) |
422 | cache_put(&ipm->h, &ip_map_cache); | 422 | cache_put(&ipm->h, &ip_map_cache); |
423 | } | 423 | } |
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c index 22f61aee4824..5baf48de2558 100644 --- a/net/sunrpc/svcsock.c +++ b/net/sunrpc/svcsock.c | |||
@@ -53,7 +53,8 @@ | |||
53 | * svc_serv->sv_lock protects sv_tempsocks, sv_permsocks, sv_tmpcnt. | 53 | * svc_serv->sv_lock protects sv_tempsocks, sv_permsocks, sv_tmpcnt. |
54 | * when both need to be taken (rare), svc_serv->sv_lock is first. | 54 | * when both need to be taken (rare), svc_serv->sv_lock is first. |
55 | * BKL protects svc_serv->sv_nrthread. | 55 | * BKL protects svc_serv->sv_nrthread. |
56 | * svc_sock->sk_defer_lock protects the svc_sock->sk_deferred list | 56 | * svc_sock->sk_lock protects the svc_sock->sk_deferred list |
57 | * and the ->sk_info_authunix cache. | ||
57 | * svc_sock->sk_flags.SK_BUSY prevents a svc_sock being enqueued multiply. | 58 | * svc_sock->sk_flags.SK_BUSY prevents a svc_sock being enqueued multiply. |
58 | * | 59 | * |
59 | * Some flags can be set to certain values at any time | 60 | * Some flags can be set to certain values at any time |
@@ -787,15 +788,20 @@ svc_udp_recvfrom(struct svc_rqst *rqstp) | |||
787 | } | 788 | } |
788 | 789 | ||
789 | clear_bit(SK_DATA, &svsk->sk_flags); | 790 | clear_bit(SK_DATA, &svsk->sk_flags); |
790 | while ((err = kernel_recvmsg(svsk->sk_sock, &msg, NULL, | 791 | skb = NULL; |
791 | 0, 0, MSG_PEEK | MSG_DONTWAIT)) < 0 || | 792 | err = kernel_recvmsg(svsk->sk_sock, &msg, NULL, |
792 | (skb = skb_recv_datagram(svsk->sk_sk, 0, 1, &err)) == NULL) { | 793 | 0, 0, MSG_PEEK | MSG_DONTWAIT); |
793 | if (err == -EAGAIN) { | 794 | if (err >= 0) |
794 | svc_sock_received(svsk); | 795 | skb = skb_recv_datagram(svsk->sk_sk, 0, 1, &err); |
795 | return err; | 796 | |
797 | if (skb == NULL) { | ||
798 | if (err != -EAGAIN) { | ||
799 | /* possibly an icmp error */ | ||
800 | dprintk("svc: recvfrom returned error %d\n", -err); | ||
801 | set_bit(SK_DATA, &svsk->sk_flags); | ||
796 | } | 802 | } |
797 | /* possibly an icmp error */ | 803 | svc_sock_received(svsk); |
798 | dprintk("svc: recvfrom returned error %d\n", -err); | 804 | return -EAGAIN; |
799 | } | 805 | } |
800 | rqstp->rq_addrlen = sizeof(rqstp->rq_addr); | 806 | rqstp->rq_addrlen = sizeof(rqstp->rq_addr); |
801 | if (skb->tstamp.tv64 == 0) { | 807 | if (skb->tstamp.tv64 == 0) { |
@@ -1633,7 +1639,7 @@ static struct svc_sock *svc_setup_socket(struct svc_serv *serv, | |||
1633 | svsk->sk_server = serv; | 1639 | svsk->sk_server = serv; |
1634 | atomic_set(&svsk->sk_inuse, 1); | 1640 | atomic_set(&svsk->sk_inuse, 1); |
1635 | svsk->sk_lastrecv = get_seconds(); | 1641 | svsk->sk_lastrecv = get_seconds(); |
1636 | spin_lock_init(&svsk->sk_defer_lock); | 1642 | spin_lock_init(&svsk->sk_lock); |
1637 | INIT_LIST_HEAD(&svsk->sk_deferred); | 1643 | INIT_LIST_HEAD(&svsk->sk_deferred); |
1638 | INIT_LIST_HEAD(&svsk->sk_ready); | 1644 | INIT_LIST_HEAD(&svsk->sk_ready); |
1639 | mutex_init(&svsk->sk_mutex); | 1645 | mutex_init(&svsk->sk_mutex); |
@@ -1857,9 +1863,9 @@ static void svc_revisit(struct cache_deferred_req *dreq, int too_many) | |||
1857 | dprintk("revisit queued\n"); | 1863 | dprintk("revisit queued\n"); |
1858 | svsk = dr->svsk; | 1864 | svsk = dr->svsk; |
1859 | dr->svsk = NULL; | 1865 | dr->svsk = NULL; |
1860 | spin_lock_bh(&svsk->sk_defer_lock); | 1866 | spin_lock(&svsk->sk_lock); |
1861 | list_add(&dr->handle.recent, &svsk->sk_deferred); | 1867 | list_add(&dr->handle.recent, &svsk->sk_deferred); |
1862 | spin_unlock_bh(&svsk->sk_defer_lock); | 1868 | spin_unlock(&svsk->sk_lock); |
1863 | set_bit(SK_DEFERRED, &svsk->sk_flags); | 1869 | set_bit(SK_DEFERRED, &svsk->sk_flags); |
1864 | svc_sock_enqueue(svsk); | 1870 | svc_sock_enqueue(svsk); |
1865 | svc_sock_put(svsk); | 1871 | svc_sock_put(svsk); |
@@ -1925,7 +1931,7 @@ static struct svc_deferred_req *svc_deferred_dequeue(struct svc_sock *svsk) | |||
1925 | 1931 | ||
1926 | if (!test_bit(SK_DEFERRED, &svsk->sk_flags)) | 1932 | if (!test_bit(SK_DEFERRED, &svsk->sk_flags)) |
1927 | return NULL; | 1933 | return NULL; |
1928 | spin_lock_bh(&svsk->sk_defer_lock); | 1934 | spin_lock(&svsk->sk_lock); |
1929 | clear_bit(SK_DEFERRED, &svsk->sk_flags); | 1935 | clear_bit(SK_DEFERRED, &svsk->sk_flags); |
1930 | if (!list_empty(&svsk->sk_deferred)) { | 1936 | if (!list_empty(&svsk->sk_deferred)) { |
1931 | dr = list_entry(svsk->sk_deferred.next, | 1937 | dr = list_entry(svsk->sk_deferred.next, |
@@ -1934,6 +1940,6 @@ static struct svc_deferred_req *svc_deferred_dequeue(struct svc_sock *svsk) | |||
1934 | list_del_init(&dr->handle.recent); | 1940 | list_del_init(&dr->handle.recent); |
1935 | set_bit(SK_DEFERRED, &svsk->sk_flags); | 1941 | set_bit(SK_DEFERRED, &svsk->sk_flags); |
1936 | } | 1942 | } |
1937 | spin_unlock_bh(&svsk->sk_defer_lock); | 1943 | spin_unlock(&svsk->sk_lock); |
1938 | return dr; | 1944 | return dr; |
1939 | } | 1945 | } |