Loading net/sunrpc/svcsock.c +34 −35 Original line number Diff line number Diff line Loading @@ -1451,28 +1451,31 @@ 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; if ((so->sk->sk_family != PF_INET) && (so->sk->sk_family != PF_INET6)) err = -EAFNOSUPPORT; else if (so->sk->sk_protocol != IPPROTO_TCP && so->sk->sk_protocol != IPPROTO_UDP) if ((so->sk->sk_family != PF_INET) && (so->sk->sk_family != PF_INET6)) goto out; err = -EPROTONOSUPPORT; else if (so->state > SS_UNCONNECTED) if (so->sk->sk_protocol != IPPROTO_TCP && so->sk->sk_protocol != IPPROTO_UDP) goto out; err = -EISCONN; else { if (!try_module_get(THIS_MODULE)) if (so->state > SS_UNCONNECTED) goto out; err = -ENOENT; else { if (!try_module_get(THIS_MODULE)) goto out; svsk = svc_setup_socket(serv, so, SVC_SOCK_DEFAULTS); if (IS_ERR(svsk)) if (IS_ERR(svsk)) { module_put(THIS_MODULE); err = PTR_ERR(svsk); goto out; } 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); Loading @@ -1480,16 +1483,11 @@ int svc_addsock(struct svc_serv *serv, const int fd, char *name_return, 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) { return svc_one_sock_name(svsk, name_return, len); out: sockfd_put(so); return err; } return svc_one_sock_name(svsk, name_return, len); } EXPORT_SYMBOL_GPL(svc_addsock); /* Loading Loading @@ -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)) { if (IS_ERR(svsk)) { error = PTR_ERR(svsk); goto bummer; } svc_xprt_set_local(&svsk->sk_xprt, newsin, newlen); return (struct svc_xprt *)svsk; } error = PTR_ERR(svsk); bummer: dprintk("svc: svc_create_socket error = %d\n", -error); sock_release(sock); Loading Loading
net/sunrpc/svcsock.c +34 −35 Original line number Diff line number Diff line Loading @@ -1451,28 +1451,31 @@ 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; if ((so->sk->sk_family != PF_INET) && (so->sk->sk_family != PF_INET6)) err = -EAFNOSUPPORT; else if (so->sk->sk_protocol != IPPROTO_TCP && so->sk->sk_protocol != IPPROTO_UDP) if ((so->sk->sk_family != PF_INET) && (so->sk->sk_family != PF_INET6)) goto out; err = -EPROTONOSUPPORT; else if (so->state > SS_UNCONNECTED) if (so->sk->sk_protocol != IPPROTO_TCP && so->sk->sk_protocol != IPPROTO_UDP) goto out; err = -EISCONN; else { if (!try_module_get(THIS_MODULE)) if (so->state > SS_UNCONNECTED) goto out; err = -ENOENT; else { if (!try_module_get(THIS_MODULE)) goto out; svsk = svc_setup_socket(serv, so, SVC_SOCK_DEFAULTS); if (IS_ERR(svsk)) if (IS_ERR(svsk)) { module_put(THIS_MODULE); err = PTR_ERR(svsk); goto out; } 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); Loading @@ -1480,16 +1483,11 @@ int svc_addsock(struct svc_serv *serv, const int fd, char *name_return, 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) { return svc_one_sock_name(svsk, name_return, len); out: sockfd_put(so); return err; } return svc_one_sock_name(svsk, name_return, len); } EXPORT_SYMBOL_GPL(svc_addsock); /* Loading Loading @@ -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)) { if (IS_ERR(svsk)) { error = PTR_ERR(svsk); goto bummer; } svc_xprt_set_local(&svsk->sk_xprt, newsin, newlen); return (struct svc_xprt *)svsk; } error = PTR_ERR(svsk); bummer: dprintk("svc: svc_create_socket error = %d\n", -error); sock_release(sock); Loading