Loading net/sunrpc/svcsock.c +34 −35 Original line number Original line 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; int err = 0; struct socket *so = sockfd_lookup(fd, &err); struct socket *so = sockfd_lookup(fd, &err); struct svc_sock *svsk = NULL; struct svc_sock *svsk = NULL; struct sockaddr_storage addr; struct sockaddr *sin = (struct sockaddr *)&addr; int salen; if (!so) if (!so) return err; return err; if ((so->sk->sk_family != PF_INET) && (so->sk->sk_family != PF_INET6)) err = -EAFNOSUPPORT; err = -EAFNOSUPPORT; else if (so->sk->sk_protocol != IPPROTO_TCP && if ((so->sk->sk_family != PF_INET) && (so->sk->sk_family != PF_INET6)) so->sk->sk_protocol != IPPROTO_UDP) goto out; err = -EPROTONOSUPPORT; 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; err = -EISCONN; else { if (so->state > SS_UNCONNECTED) if (!try_module_get(THIS_MODULE)) goto out; err = -ENOENT; err = -ENOENT; else { if (!try_module_get(THIS_MODULE)) goto out; svsk = svc_setup_socket(serv, so, SVC_SOCK_DEFAULTS); 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); 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) if (kernel_getsockname(svsk->sk_sock, sin, &salen) == 0) svc_xprt_set_local(&svsk->sk_xprt, sin, salen); svc_xprt_set_local(&svsk->sk_xprt, sin, salen); clear_bit(XPT_TEMP, &svsk->sk_xprt.xpt_flags); 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); list_add(&svsk->sk_xprt.xpt_list, &serv->sv_permsocks); spin_unlock_bh(&serv->sv_lock); spin_unlock_bh(&serv->sv_lock); svc_xprt_received(&svsk->sk_xprt); svc_xprt_received(&svsk->sk_xprt); err = 0; return svc_one_sock_name(svsk, name_return, len); } else out: module_put(THIS_MODULE); } if (err) { sockfd_put(so); sockfd_put(so); return err; return err; } } return svc_one_sock_name(svsk, name_return, len); } EXPORT_SYMBOL_GPL(svc_addsock); 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); 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); svc_xprt_set_local(&svsk->sk_xprt, newsin, newlen); return (struct svc_xprt *)svsk; return (struct svc_xprt *)svsk; } error = PTR_ERR(svsk); bummer: bummer: dprintk("svc: svc_create_socket error = %d\n", -error); dprintk("svc: svc_create_socket error = %d\n", -error); sock_release(sock); sock_release(sock); Loading Loading
net/sunrpc/svcsock.c +34 −35 Original line number Original line 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; int err = 0; struct socket *so = sockfd_lookup(fd, &err); struct socket *so = sockfd_lookup(fd, &err); struct svc_sock *svsk = NULL; struct svc_sock *svsk = NULL; struct sockaddr_storage addr; struct sockaddr *sin = (struct sockaddr *)&addr; int salen; if (!so) if (!so) return err; return err; if ((so->sk->sk_family != PF_INET) && (so->sk->sk_family != PF_INET6)) err = -EAFNOSUPPORT; err = -EAFNOSUPPORT; else if (so->sk->sk_protocol != IPPROTO_TCP && if ((so->sk->sk_family != PF_INET) && (so->sk->sk_family != PF_INET6)) so->sk->sk_protocol != IPPROTO_UDP) goto out; err = -EPROTONOSUPPORT; 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; err = -EISCONN; else { if (so->state > SS_UNCONNECTED) if (!try_module_get(THIS_MODULE)) goto out; err = -ENOENT; err = -ENOENT; else { if (!try_module_get(THIS_MODULE)) goto out; svsk = svc_setup_socket(serv, so, SVC_SOCK_DEFAULTS); 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); 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) if (kernel_getsockname(svsk->sk_sock, sin, &salen) == 0) svc_xprt_set_local(&svsk->sk_xprt, sin, salen); svc_xprt_set_local(&svsk->sk_xprt, sin, salen); clear_bit(XPT_TEMP, &svsk->sk_xprt.xpt_flags); 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); list_add(&svsk->sk_xprt.xpt_list, &serv->sv_permsocks); spin_unlock_bh(&serv->sv_lock); spin_unlock_bh(&serv->sv_lock); svc_xprt_received(&svsk->sk_xprt); svc_xprt_received(&svsk->sk_xprt); err = 0; return svc_one_sock_name(svsk, name_return, len); } else out: module_put(THIS_MODULE); } if (err) { sockfd_put(so); sockfd_put(so); return err; return err; } } return svc_one_sock_name(svsk, name_return, len); } EXPORT_SYMBOL_GPL(svc_addsock); 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); 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); svc_xprt_set_local(&svsk->sk_xprt, newsin, newlen); return (struct svc_xprt *)svsk; return (struct svc_xprt *)svsk; } error = PTR_ERR(svsk); bummer: bummer: dprintk("svc: svc_create_socket error = %d\n", -error); dprintk("svc: svc_create_socket error = %d\n", -error); sock_release(sock); sock_release(sock); Loading