diff options
| author | David S. Miller <davem@davemloft.net> | 2010-03-15 19:23:54 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2010-03-15 19:23:54 -0400 |
| commit | 4961e02f1999e1c3468c09b2669c94d7c3ae82a8 (patch) | |
| tree | 44c15abb09d7ba5e17a9aba95ee246648b1c1a8a /net/sunrpc | |
| parent | d14a0ebda7d3daede1a99c01527affb9ceaa4c22 (diff) | |
| parent | a3d3203e4bb40f253b1541e310dc0f9305be7c84 (diff) | |
Merge branch 'master' of /home/davem/src/GIT/linux-2.6/
Diffstat (limited to 'net/sunrpc')
| -rw-r--r-- | net/sunrpc/addr.c | 8 | ||||
| -rw-r--r-- | net/sunrpc/auth_gss/auth_gss.c | 11 | ||||
| -rw-r--r-- | net/sunrpc/rpc_pipe.c | 9 | ||||
| -rw-r--r-- | net/sunrpc/svc.c | 6 | ||||
| -rw-r--r-- | net/sunrpc/svc_xprt.c | 27 | ||||
| -rw-r--r-- | net/sunrpc/svcauth_unix.c | 49 | ||||
| -rw-r--r-- | net/sunrpc/svcsock.c | 3 | ||||
| -rw-r--r-- | net/sunrpc/xprtsock.c | 9 |
8 files changed, 70 insertions, 52 deletions
diff --git a/net/sunrpc/addr.c b/net/sunrpc/addr.c index 6dcdd2517819..f845d9d72f73 100644 --- a/net/sunrpc/addr.c +++ b/net/sunrpc/addr.c | |||
| @@ -71,8 +71,9 @@ static size_t rpc_ntop6(const struct sockaddr *sap, | |||
| 71 | if (unlikely(len == 0)) | 71 | if (unlikely(len == 0)) |
| 72 | return len; | 72 | return len; |
| 73 | 73 | ||
| 74 | if (!(ipv6_addr_type(&sin6->sin6_addr) & IPV6_ADDR_LINKLOCAL) && | 74 | if (!(ipv6_addr_type(&sin6->sin6_addr) & IPV6_ADDR_LINKLOCAL)) |
| 75 | !(ipv6_addr_type(&sin6->sin6_addr) & IPV6_ADDR_SITELOCAL)) | 75 | return len; |
| 76 | if (sin6->sin6_scope_id == 0) | ||
| 76 | return len; | 77 | return len; |
| 77 | 78 | ||
| 78 | rc = snprintf(scopebuf, sizeof(scopebuf), "%c%u", | 79 | rc = snprintf(scopebuf, sizeof(scopebuf), "%c%u", |
| @@ -165,8 +166,7 @@ static int rpc_parse_scope_id(const char *buf, const size_t buflen, | |||
| 165 | if (*delim != IPV6_SCOPE_DELIMITER) | 166 | if (*delim != IPV6_SCOPE_DELIMITER) |
| 166 | return 0; | 167 | return 0; |
| 167 | 168 | ||
| 168 | if (!(ipv6_addr_type(&sin6->sin6_addr) & IPV6_ADDR_LINKLOCAL) && | 169 | if (!(ipv6_addr_type(&sin6->sin6_addr) & IPV6_ADDR_LINKLOCAL)) |
| 169 | !(ipv6_addr_type(&sin6->sin6_addr) & IPV6_ADDR_SITELOCAL)) | ||
| 170 | return 0; | 170 | return 0; |
| 171 | 171 | ||
| 172 | len = (buf + buflen) - delim - 1; | 172 | len = (buf + buflen) - delim - 1; |
diff --git a/net/sunrpc/auth_gss/auth_gss.c b/net/sunrpc/auth_gss/auth_gss.c index f7a7f8380e38..0cfccc2a0297 100644 --- a/net/sunrpc/auth_gss/auth_gss.c +++ b/net/sunrpc/auth_gss/auth_gss.c | |||
| @@ -206,8 +206,14 @@ gss_fill_context(const void *p, const void *end, struct gss_cl_ctx *ctx, struct | |||
| 206 | ctx->gc_win = window_size; | 206 | ctx->gc_win = window_size; |
| 207 | /* gssd signals an error by passing ctx->gc_win = 0: */ | 207 | /* gssd signals an error by passing ctx->gc_win = 0: */ |
| 208 | if (ctx->gc_win == 0) { | 208 | if (ctx->gc_win == 0) { |
| 209 | /* in which case, p points to an error code which we ignore */ | 209 | /* |
| 210 | p = ERR_PTR(-EACCES); | 210 | * in which case, p points to an error code. Anything other |
| 211 | * than -EKEYEXPIRED gets converted to -EACCES. | ||
| 212 | */ | ||
| 213 | p = simple_get_bytes(p, end, &ret, sizeof(ret)); | ||
| 214 | if (!IS_ERR(p)) | ||
| 215 | p = (ret == -EKEYEXPIRED) ? ERR_PTR(-EKEYEXPIRED) : | ||
| 216 | ERR_PTR(-EACCES); | ||
| 211 | goto err; | 217 | goto err; |
| 212 | } | 218 | } |
| 213 | /* copy the opaque wire context */ | 219 | /* copy the opaque wire context */ |
| @@ -646,6 +652,7 @@ gss_pipe_downcall(struct file *filp, const char __user *src, size_t mlen) | |||
| 646 | err = PTR_ERR(p); | 652 | err = PTR_ERR(p); |
| 647 | switch (err) { | 653 | switch (err) { |
| 648 | case -EACCES: | 654 | case -EACCES: |
| 655 | case -EKEYEXPIRED: | ||
| 649 | gss_msg->msg.errno = err; | 656 | gss_msg->msg.errno = err; |
| 650 | err = mlen; | 657 | err = mlen; |
| 651 | break; | 658 | break; |
diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c index 9ea45383480e..8d63f8fd29b7 100644 --- a/net/sunrpc/rpc_pipe.c +++ b/net/sunrpc/rpc_pipe.c | |||
| @@ -999,19 +999,14 @@ rpc_fill_super(struct super_block *sb, void *data, int silent) | |||
| 999 | inode = rpc_get_inode(sb, S_IFDIR | 0755); | 999 | inode = rpc_get_inode(sb, S_IFDIR | 0755); |
| 1000 | if (!inode) | 1000 | if (!inode) |
| 1001 | return -ENOMEM; | 1001 | return -ENOMEM; |
| 1002 | root = d_alloc_root(inode); | 1002 | sb->s_root = root = d_alloc_root(inode); |
| 1003 | if (!root) { | 1003 | if (!root) { |
| 1004 | iput(inode); | 1004 | iput(inode); |
| 1005 | return -ENOMEM; | 1005 | return -ENOMEM; |
| 1006 | } | 1006 | } |
| 1007 | if (rpc_populate(root, files, RPCAUTH_lockd, RPCAUTH_RootEOF, NULL)) | 1007 | if (rpc_populate(root, files, RPCAUTH_lockd, RPCAUTH_RootEOF, NULL)) |
| 1008 | goto out; | 1008 | return -ENOMEM; |
| 1009 | sb->s_root = root; | ||
| 1010 | return 0; | 1009 | return 0; |
| 1011 | out: | ||
| 1012 | d_genocide(root); | ||
| 1013 | dput(root); | ||
| 1014 | return -ENOMEM; | ||
| 1015 | } | 1010 | } |
| 1016 | 1011 | ||
| 1017 | static int | 1012 | static int |
diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c index 538ca433a56c..8420a4205b76 100644 --- a/net/sunrpc/svc.c +++ b/net/sunrpc/svc.c | |||
| @@ -133,7 +133,7 @@ svc_pool_map_choose_mode(void) | |||
| 133 | return SVC_POOL_PERNODE; | 133 | return SVC_POOL_PERNODE; |
| 134 | } | 134 | } |
| 135 | 135 | ||
| 136 | node = any_online_node(node_online_map); | 136 | node = first_online_node; |
| 137 | if (nr_cpus_node(node) > 2) { | 137 | if (nr_cpus_node(node) > 2) { |
| 138 | /* | 138 | /* |
| 139 | * Non-trivial SMP, or CONFIG_NUMA on | 139 | * Non-trivial SMP, or CONFIG_NUMA on |
| @@ -506,6 +506,10 @@ svc_init_buffer(struct svc_rqst *rqstp, unsigned int size) | |||
| 506 | { | 506 | { |
| 507 | unsigned int pages, arghi; | 507 | unsigned int pages, arghi; |
| 508 | 508 | ||
| 509 | /* bc_xprt uses fore channel allocated buffers */ | ||
| 510 | if (svc_is_backchannel(rqstp)) | ||
| 511 | return 1; | ||
| 512 | |||
| 509 | pages = size / PAGE_SIZE + 1; /* extra page as we hold both request and reply. | 513 | pages = size / PAGE_SIZE + 1; /* extra page as we hold both request and reply. |
| 510 | * We assume one is at most one page | 514 | * We assume one is at most one page |
| 511 | */ | 515 | */ |
diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c index 7d1f9e928f69..8f0f1fb3dc52 100644 --- a/net/sunrpc/svc_xprt.c +++ b/net/sunrpc/svc_xprt.c | |||
| @@ -173,11 +173,13 @@ static struct svc_xprt *__svc_xpo_create(struct svc_xprt_class *xcl, | |||
| 173 | .sin_addr.s_addr = htonl(INADDR_ANY), | 173 | .sin_addr.s_addr = htonl(INADDR_ANY), |
| 174 | .sin_port = htons(port), | 174 | .sin_port = htons(port), |
| 175 | }; | 175 | }; |
| 176 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | ||
| 176 | struct sockaddr_in6 sin6 = { | 177 | struct sockaddr_in6 sin6 = { |
| 177 | .sin6_family = AF_INET6, | 178 | .sin6_family = AF_INET6, |
| 178 | .sin6_addr = IN6ADDR_ANY_INIT, | 179 | .sin6_addr = IN6ADDR_ANY_INIT, |
| 179 | .sin6_port = htons(port), | 180 | .sin6_port = htons(port), |
| 180 | }; | 181 | }; |
| 182 | #endif /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */ | ||
| 181 | struct sockaddr *sap; | 183 | struct sockaddr *sap; |
| 182 | size_t len; | 184 | size_t len; |
| 183 | 185 | ||
| @@ -186,10 +188,12 @@ static struct svc_xprt *__svc_xpo_create(struct svc_xprt_class *xcl, | |||
| 186 | sap = (struct sockaddr *)&sin; | 188 | sap = (struct sockaddr *)&sin; |
| 187 | len = sizeof(sin); | 189 | len = sizeof(sin); |
| 188 | break; | 190 | break; |
| 191 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | ||
| 189 | case PF_INET6: | 192 | case PF_INET6: |
| 190 | sap = (struct sockaddr *)&sin6; | 193 | sap = (struct sockaddr *)&sin6; |
| 191 | len = sizeof(sin6); | 194 | len = sizeof(sin6); |
| 192 | break; | 195 | break; |
| 196 | #endif /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */ | ||
| 193 | default: | 197 | default: |
| 194 | return ERR_PTR(-EAFNOSUPPORT); | 198 | return ERR_PTR(-EAFNOSUPPORT); |
| 195 | } | 199 | } |
| @@ -231,7 +235,10 @@ int svc_create_xprt(struct svc_serv *serv, const char *xprt_name, | |||
| 231 | err: | 235 | err: |
| 232 | spin_unlock(&svc_xprt_class_lock); | 236 | spin_unlock(&svc_xprt_class_lock); |
| 233 | dprintk("svc: transport %s not found\n", xprt_name); | 237 | dprintk("svc: transport %s not found\n", xprt_name); |
| 234 | return -ENOENT; | 238 | |
| 239 | /* This errno is exposed to user space. Provide a reasonable | ||
| 240 | * perror msg for a bad transport. */ | ||
| 241 | return -EPROTONOSUPPORT; | ||
| 235 | } | 242 | } |
| 236 | EXPORT_SYMBOL_GPL(svc_create_xprt); | 243 | EXPORT_SYMBOL_GPL(svc_create_xprt); |
| 237 | 244 | ||
| @@ -699,8 +706,10 @@ int svc_recv(struct svc_rqst *rqstp, long timeout) | |||
| 699 | spin_unlock_bh(&pool->sp_lock); | 706 | spin_unlock_bh(&pool->sp_lock); |
| 700 | 707 | ||
| 701 | len = 0; | 708 | len = 0; |
| 702 | if (test_bit(XPT_LISTENER, &xprt->xpt_flags) && | 709 | if (test_bit(XPT_CLOSE, &xprt->xpt_flags)) { |
| 703 | !test_bit(XPT_CLOSE, &xprt->xpt_flags)) { | 710 | dprintk("svc_recv: found XPT_CLOSE\n"); |
| 711 | svc_delete_xprt(xprt); | ||
| 712 | } else if (test_bit(XPT_LISTENER, &xprt->xpt_flags)) { | ||
| 704 | struct svc_xprt *newxpt; | 713 | struct svc_xprt *newxpt; |
| 705 | newxpt = xprt->xpt_ops->xpo_accept(xprt); | 714 | newxpt = xprt->xpt_ops->xpo_accept(xprt); |
| 706 | if (newxpt) { | 715 | if (newxpt) { |
| @@ -726,7 +735,7 @@ int svc_recv(struct svc_rqst *rqstp, long timeout) | |||
| 726 | svc_xprt_received(newxpt); | 735 | svc_xprt_received(newxpt); |
| 727 | } | 736 | } |
| 728 | svc_xprt_received(xprt); | 737 | svc_xprt_received(xprt); |
| 729 | } else if (!test_bit(XPT_CLOSE, &xprt->xpt_flags)) { | 738 | } else { |
| 730 | dprintk("svc: server %p, pool %u, transport %p, inuse=%d\n", | 739 | dprintk("svc: server %p, pool %u, transport %p, inuse=%d\n", |
| 731 | rqstp, pool->sp_id, xprt, | 740 | rqstp, pool->sp_id, xprt, |
| 732 | atomic_read(&xprt->xpt_ref.refcount)); | 741 | atomic_read(&xprt->xpt_ref.refcount)); |
| @@ -739,11 +748,6 @@ int svc_recv(struct svc_rqst *rqstp, long timeout) | |||
| 739 | dprintk("svc: got len=%d\n", len); | 748 | dprintk("svc: got len=%d\n", len); |
| 740 | } | 749 | } |
| 741 | 750 | ||
| 742 | if (test_bit(XPT_CLOSE, &xprt->xpt_flags)) { | ||
| 743 | dprintk("svc_recv: found XPT_CLOSE\n"); | ||
| 744 | svc_delete_xprt(xprt); | ||
| 745 | } | ||
| 746 | |||
| 747 | /* No data, incomplete (TCP) read, or accept() */ | 751 | /* No data, incomplete (TCP) read, or accept() */ |
| 748 | if (len == 0 || len == -EAGAIN) { | 752 | if (len == 0 || len == -EAGAIN) { |
| 749 | rqstp->rq_res.len = 0; | 753 | rqstp->rq_res.len = 0; |
| @@ -889,11 +893,8 @@ void svc_delete_xprt(struct svc_xprt *xprt) | |||
| 889 | if (test_bit(XPT_TEMP, &xprt->xpt_flags)) | 893 | if (test_bit(XPT_TEMP, &xprt->xpt_flags)) |
| 890 | serv->sv_tmpcnt--; | 894 | serv->sv_tmpcnt--; |
| 891 | 895 | ||
| 892 | for (dr = svc_deferred_dequeue(xprt); dr; | 896 | while ((dr = svc_deferred_dequeue(xprt)) != NULL) |
| 893 | dr = svc_deferred_dequeue(xprt)) { | ||
| 894 | svc_xprt_put(xprt); | ||
| 895 | kfree(dr); | 897 | kfree(dr); |
| 896 | } | ||
| 897 | 898 | ||
| 898 | svc_xprt_put(xprt); | 899 | svc_xprt_put(xprt); |
| 899 | spin_unlock_bh(&serv->sv_lock); | 900 | spin_unlock_bh(&serv->sv_lock); |
diff --git a/net/sunrpc/svcauth_unix.c b/net/sunrpc/svcauth_unix.c index d8c041114497..afdcb0459a83 100644 --- a/net/sunrpc/svcauth_unix.c +++ b/net/sunrpc/svcauth_unix.c | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
| 16 | #define RPCDBG_FACILITY RPCDBG_AUTH | 16 | #define RPCDBG_FACILITY RPCDBG_AUTH |
| 17 | 17 | ||
| 18 | #include <linux/sunrpc/clnt.h> | ||
| 18 | 19 | ||
| 19 | /* | 20 | /* |
| 20 | * AUTHUNIX and AUTHNULL credentials are both handled here. | 21 | * AUTHUNIX and AUTHNULL credentials are both handled here. |
| @@ -187,10 +188,13 @@ static int ip_map_parse(struct cache_detail *cd, | |||
| 187 | * for scratch: */ | 188 | * for scratch: */ |
| 188 | char *buf = mesg; | 189 | char *buf = mesg; |
| 189 | int len; | 190 | int len; |
| 190 | int b1, b2, b3, b4, b5, b6, b7, b8; | ||
| 191 | char c; | ||
| 192 | char class[8]; | 191 | char class[8]; |
| 193 | struct in6_addr addr; | 192 | union { |
| 193 | struct sockaddr sa; | ||
| 194 | struct sockaddr_in s4; | ||
| 195 | struct sockaddr_in6 s6; | ||
| 196 | } address; | ||
| 197 | struct sockaddr_in6 sin6; | ||
| 194 | int err; | 198 | int err; |
| 195 | 199 | ||
| 196 | struct ip_map *ipmp; | 200 | struct ip_map *ipmp; |
| @@ -209,24 +213,24 @@ static int ip_map_parse(struct cache_detail *cd, | |||
| 209 | len = qword_get(&mesg, buf, mlen); | 213 | len = qword_get(&mesg, buf, mlen); |
| 210 | if (len <= 0) return -EINVAL; | 214 | if (len <= 0) return -EINVAL; |
| 211 | 215 | ||
| 212 | if (sscanf(buf, "%u.%u.%u.%u%c", &b1, &b2, &b3, &b4, &c) == 4) { | 216 | if (rpc_pton(buf, len, &address.sa, sizeof(address)) == 0) |
| 213 | addr.s6_addr32[0] = 0; | ||
| 214 | addr.s6_addr32[1] = 0; | ||
| 215 | addr.s6_addr32[2] = htonl(0xffff); | ||
| 216 | addr.s6_addr32[3] = | ||
| 217 | htonl((((((b1<<8)|b2)<<8)|b3)<<8)|b4); | ||
| 218 | } else if (sscanf(buf, "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x%c", | ||
| 219 | &b1, &b2, &b3, &b4, &b5, &b6, &b7, &b8, &c) == 8) { | ||
| 220 | addr.s6_addr16[0] = htons(b1); | ||
| 221 | addr.s6_addr16[1] = htons(b2); | ||
| 222 | addr.s6_addr16[2] = htons(b3); | ||
| 223 | addr.s6_addr16[3] = htons(b4); | ||
| 224 | addr.s6_addr16[4] = htons(b5); | ||
| 225 | addr.s6_addr16[5] = htons(b6); | ||
| 226 | addr.s6_addr16[6] = htons(b7); | ||
| 227 | addr.s6_addr16[7] = htons(b8); | ||
| 228 | } else | ||
| 229 | return -EINVAL; | 217 | return -EINVAL; |
| 218 | switch (address.sa.sa_family) { | ||
| 219 | case AF_INET: | ||
| 220 | /* Form a mapped IPv4 address in sin6 */ | ||
| 221 | memset(&sin6, 0, sizeof(sin6)); | ||
| 222 | sin6.sin6_family = AF_INET6; | ||
| 223 | sin6.sin6_addr.s6_addr32[2] = htonl(0xffff); | ||
| 224 | sin6.sin6_addr.s6_addr32[3] = address.s4.sin_addr.s_addr; | ||
| 225 | break; | ||
| 226 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | ||
| 227 | case AF_INET6: | ||
| 228 | memcpy(&sin6, &address.s6, sizeof(sin6)); | ||
| 229 | break; | ||
| 230 | #endif | ||
| 231 | default: | ||
| 232 | return -EINVAL; | ||
| 233 | } | ||
| 230 | 234 | ||
| 231 | expiry = get_expiry(&mesg); | 235 | expiry = get_expiry(&mesg); |
| 232 | if (expiry ==0) | 236 | if (expiry ==0) |
| @@ -243,7 +247,8 @@ static int ip_map_parse(struct cache_detail *cd, | |||
| 243 | } else | 247 | } else |
| 244 | dom = NULL; | 248 | dom = NULL; |
| 245 | 249 | ||
| 246 | ipmp = ip_map_lookup(class, &addr); | 250 | /* IPv6 scope IDs are ignored for now */ |
| 251 | ipmp = ip_map_lookup(class, &sin6.sin6_addr); | ||
| 247 | if (ipmp) { | 252 | if (ipmp) { |
| 248 | err = ip_map_update(ipmp, | 253 | err = ip_map_update(ipmp, |
| 249 | container_of(dom, struct unix_domain, h), | 254 | container_of(dom, struct unix_domain, h), |
| @@ -619,7 +624,7 @@ static int unix_gid_show(struct seq_file *m, | |||
| 619 | else | 624 | else |
| 620 | glen = 0; | 625 | glen = 0; |
| 621 | 626 | ||
| 622 | seq_printf(m, "%d %d:", ug->uid, glen); | 627 | seq_printf(m, "%u %d:", ug->uid, glen); |
| 623 | for (i = 0; i < glen; i++) | 628 | for (i = 0; i < glen; i++) |
| 624 | seq_printf(m, " %d", GROUP_AT(ug->gi, i)); | 629 | seq_printf(m, " %d", GROUP_AT(ug->gi, i)); |
| 625 | seq_printf(m, "\n"); | 630 | seq_printf(m, "\n"); |
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c index 870929e08e5d..a29f259204e6 100644 --- a/net/sunrpc/svcsock.c +++ b/net/sunrpc/svcsock.c | |||
| @@ -968,6 +968,7 @@ static int svc_tcp_recv_record(struct svc_sock *svsk, struct svc_rqst *rqstp) | |||
| 968 | return len; | 968 | return len; |
| 969 | err_delete: | 969 | err_delete: |
| 970 | set_bit(XPT_CLOSE, &svsk->sk_xprt.xpt_flags); | 970 | set_bit(XPT_CLOSE, &svsk->sk_xprt.xpt_flags); |
| 971 | svc_xprt_received(&svsk->sk_xprt); | ||
| 971 | err_again: | 972 | err_again: |
| 972 | return -EAGAIN; | 973 | return -EAGAIN; |
| 973 | } | 974 | } |
| @@ -1357,7 +1358,7 @@ int svc_addsock(struct svc_serv *serv, const int fd, char *name_return, | |||
| 1357 | 1358 | ||
| 1358 | if (!so) | 1359 | if (!so) |
| 1359 | return err; | 1360 | return err; |
| 1360 | if (so->sk->sk_family != AF_INET) | 1361 | if ((so->sk->sk_family != PF_INET) && (so->sk->sk_family != PF_INET6)) |
| 1361 | err = -EAFNOSUPPORT; | 1362 | err = -EAFNOSUPPORT; |
| 1362 | else if (so->sk->sk_protocol != IPPROTO_TCP && | 1363 | else if (so->sk->sk_protocol != IPPROTO_TCP && |
| 1363 | so->sk->sk_protocol != IPPROTO_UDP) | 1364 | so->sk->sk_protocol != IPPROTO_UDP) |
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index 4f55ab7ec1b1..75ab08eac66b 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c | |||
| @@ -1911,6 +1911,11 @@ static void xs_tcp_setup_socket(struct rpc_xprt *xprt, | |||
| 1911 | case -EALREADY: | 1911 | case -EALREADY: |
| 1912 | xprt_clear_connecting(xprt); | 1912 | xprt_clear_connecting(xprt); |
| 1913 | return; | 1913 | return; |
| 1914 | case -EINVAL: | ||
| 1915 | /* Happens, for instance, if the user specified a link | ||
| 1916 | * local IPv6 address without a scope-id. | ||
| 1917 | */ | ||
| 1918 | goto out; | ||
| 1914 | } | 1919 | } |
| 1915 | out_eagain: | 1920 | out_eagain: |
| 1916 | status = -EAGAIN; | 1921 | status = -EAGAIN; |
| @@ -2099,7 +2104,7 @@ static void xs_tcp_print_stats(struct rpc_xprt *xprt, struct seq_file *seq) | |||
| 2099 | * we allocate pages instead doing a kmalloc like rpc_malloc is because we want | 2104 | * we allocate pages instead doing a kmalloc like rpc_malloc is because we want |
| 2100 | * to use the server side send routines. | 2105 | * to use the server side send routines. |
| 2101 | */ | 2106 | */ |
| 2102 | void *bc_malloc(struct rpc_task *task, size_t size) | 2107 | static void *bc_malloc(struct rpc_task *task, size_t size) |
| 2103 | { | 2108 | { |
| 2104 | struct page *page; | 2109 | struct page *page; |
| 2105 | struct rpc_buffer *buf; | 2110 | struct rpc_buffer *buf; |
| @@ -2119,7 +2124,7 @@ void *bc_malloc(struct rpc_task *task, size_t size) | |||
| 2119 | /* | 2124 | /* |
| 2120 | * Free the space allocated in the bc_alloc routine | 2125 | * Free the space allocated in the bc_alloc routine |
| 2121 | */ | 2126 | */ |
| 2122 | void bc_free(void *buffer) | 2127 | static void bc_free(void *buffer) |
| 2123 | { | 2128 | { |
| 2124 | struct rpc_buffer *buf; | 2129 | struct rpc_buffer *buf; |
| 2125 | 2130 | ||
