|
@@ -1451,44 +1451,42 @@ int svc_addsock(struct svc_serv *serv, const int fd, char *name_return,
|
|
|
int err = 0;
|
|
|
struct socket *so = sockfd_lookup(fd, &err);
|
|
|
struct svc_sock *svsk = NULL;
|
|
|
+ struct sockaddr_storage addr;
|
|
|
+ struct sockaddr *sin = (struct sockaddr *)&addr;
|
|
|
+ int salen;
|
|
|
|
|
|
if (!so)
|
|
|
return err;
|
|
|
+ err = -EAFNOSUPPORT;
|
|
|
if ((so->sk->sk_family != PF_INET) && (so->sk->sk_family != PF_INET6))
|
|
|
- err = -EAFNOSUPPORT;
|
|
|
- else if (so->sk->sk_protocol != IPPROTO_TCP &&
|
|
|
+ goto out;
|
|
|
+ err = -EPROTONOSUPPORT;
|
|
|
+ if (so->sk->sk_protocol != IPPROTO_TCP &&
|
|
|
so->sk->sk_protocol != IPPROTO_UDP)
|
|
|
- err = -EPROTONOSUPPORT;
|
|
|
- else if (so->state > SS_UNCONNECTED)
|
|
|
- err = -EISCONN;
|
|
|
- else {
|
|
|
- if (!try_module_get(THIS_MODULE))
|
|
|
- err = -ENOENT;
|
|
|
- else {
|
|
|
- svsk = svc_setup_socket(serv, so, SVC_SOCK_DEFAULTS);
|
|
|
- if (IS_ERR(svsk))
|
|
|
- err = PTR_ERR(svsk);
|
|
|
- }
|
|
|
- if (err == 0) {
|
|
|
- struct sockaddr_storage addr;
|
|
|
- struct sockaddr *sin = (struct sockaddr *)&addr;
|
|
|
- int salen;
|
|
|
- if (kernel_getsockname(svsk->sk_sock, sin, &salen) == 0)
|
|
|
- svc_xprt_set_local(&svsk->sk_xprt, sin, salen);
|
|
|
- clear_bit(XPT_TEMP, &svsk->sk_xprt.xpt_flags);
|
|
|
- spin_lock_bh(&serv->sv_lock);
|
|
|
- list_add(&svsk->sk_xprt.xpt_list, &serv->sv_permsocks);
|
|
|
- spin_unlock_bh(&serv->sv_lock);
|
|
|
- svc_xprt_received(&svsk->sk_xprt);
|
|
|
- err = 0;
|
|
|
- } else
|
|
|
- module_put(THIS_MODULE);
|
|
|
- }
|
|
|
- if (err) {
|
|
|
- sockfd_put(so);
|
|
|
- return err;
|
|
|
+ goto out;
|
|
|
+ err = -EISCONN;
|
|
|
+ if (so->state > SS_UNCONNECTED)
|
|
|
+ goto out;
|
|
|
+ err = -ENOENT;
|
|
|
+ if (!try_module_get(THIS_MODULE))
|
|
|
+ goto out;
|
|
|
+ svsk = svc_setup_socket(serv, so, SVC_SOCK_DEFAULTS);
|
|
|
+ if (IS_ERR(svsk)) {
|
|
|
+ module_put(THIS_MODULE);
|
|
|
+ err = PTR_ERR(svsk);
|
|
|
+ goto out;
|
|
|
}
|
|
|
+ if (kernel_getsockname(svsk->sk_sock, sin, &salen) == 0)
|
|
|
+ svc_xprt_set_local(&svsk->sk_xprt, sin, salen);
|
|
|
+ clear_bit(XPT_TEMP, &svsk->sk_xprt.xpt_flags);
|
|
|
+ spin_lock_bh(&serv->sv_lock);
|
|
|
+ list_add(&svsk->sk_xprt.xpt_list, &serv->sv_permsocks);
|
|
|
+ spin_unlock_bh(&serv->sv_lock);
|
|
|
+ svc_xprt_received(&svsk->sk_xprt);
|
|
|
return svc_one_sock_name(svsk, name_return, len);
|
|
|
+out:
|
|
|
+ sockfd_put(so);
|
|
|
+ return err;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(svc_addsock);
|
|
|
|
|
@@ -1567,11 +1565,12 @@ static struct svc_xprt *svc_create_socket(struct svc_serv *serv,
|
|
|
}
|
|
|
|
|
|
svsk = svc_setup_socket(serv, sock, flags);
|
|
|
- if (!IS_ERR(svsk)) {
|
|
|
- svc_xprt_set_local(&svsk->sk_xprt, newsin, newlen);
|
|
|
- return (struct svc_xprt *)svsk;
|
|
|
+ if (IS_ERR(svsk)) {
|
|
|
+ error = PTR_ERR(svsk);
|
|
|
+ goto bummer;
|
|
|
}
|
|
|
- error = PTR_ERR(svsk);
|
|
|
+ svc_xprt_set_local(&svsk->sk_xprt, newsin, newlen);
|
|
|
+ return (struct svc_xprt *)svsk;
|
|
|
bummer:
|
|
|
dprintk("svc: svc_create_socket error = %d\n", -error);
|
|
|
sock_release(sock);
|