Commit 77f1f67a authored by Chuck Lever's avatar Chuck Lever Committed by Linus Torvalds

[PATCH] knfsd: SUNRPC: fix up svc_create_socket() to take a sockaddr struct + length

Replace existing svc_create_socket() API to allow callers to pass addresses
larger than a sockaddr_in.
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
Cc: Aurelien Charbon <aurelien.charbon@ext.bull.net>
Signed-off-by: default avatarNeil Brown <neilb@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 95756482
...@@ -1700,7 +1700,7 @@ EXPORT_SYMBOL_GPL(svc_addsock); ...@@ -1700,7 +1700,7 @@ EXPORT_SYMBOL_GPL(svc_addsock);
* Create socket for RPC service. * Create socket for RPC service.
*/ */
static int svc_create_socket(struct svc_serv *serv, int protocol, static int svc_create_socket(struct svc_serv *serv, int protocol,
struct sockaddr_in *sin, int flags) struct sockaddr *sin, int len, int flags)
{ {
struct svc_sock *svsk; struct svc_sock *svsk;
struct socket *sock; struct socket *sock;
...@@ -1710,8 +1710,7 @@ static int svc_create_socket(struct svc_serv *serv, int protocol, ...@@ -1710,8 +1710,7 @@ static int svc_create_socket(struct svc_serv *serv, int protocol,
dprintk("svc: svc_create_socket(%s, %d, %s)\n", dprintk("svc: svc_create_socket(%s, %d, %s)\n",
serv->sv_program->pg_name, protocol, serv->sv_program->pg_name, protocol,
__svc_print_addr((struct sockaddr *) sin, buf, __svc_print_addr(sin, buf, sizeof(buf)));
sizeof(buf)));
if (protocol != IPPROTO_UDP && protocol != IPPROTO_TCP) { if (protocol != IPPROTO_UDP && protocol != IPPROTO_TCP) {
printk(KERN_WARNING "svc: only UDP and TCP " printk(KERN_WARNING "svc: only UDP and TCP "
...@@ -1720,15 +1719,15 @@ static int svc_create_socket(struct svc_serv *serv, int protocol, ...@@ -1720,15 +1719,15 @@ static int svc_create_socket(struct svc_serv *serv, int protocol,
} }
type = (protocol == IPPROTO_UDP)? SOCK_DGRAM : SOCK_STREAM; type = (protocol == IPPROTO_UDP)? SOCK_DGRAM : SOCK_STREAM;
if ((error = sock_create_kern(PF_INET, type, protocol, &sock)) < 0) error = sock_create_kern(sin->sa_family, type, protocol, &sock);
if (error < 0)
return error; return error;
svc_reclassify_socket(sock); svc_reclassify_socket(sock);
if (type == SOCK_STREAM) if (type == SOCK_STREAM)
sock->sk->sk_reuse = 1; /* allow address reuse */ sock->sk->sk_reuse = 1; /* allow address reuse */
error = kernel_bind(sock, (struct sockaddr *) sin, error = kernel_bind(sock, sin, len);
sizeof(*sin));
if (error < 0) if (error < 0)
goto bummer; goto bummer;
...@@ -1818,7 +1817,8 @@ int svc_makesock(struct svc_serv *serv, int protocol, unsigned short port, ...@@ -1818,7 +1817,8 @@ int svc_makesock(struct svc_serv *serv, int protocol, unsigned short port,
}; };
dprintk("svc: creating socket proto = %d\n", protocol); dprintk("svc: creating socket proto = %d\n", protocol);
return svc_create_socket(serv, protocol, &sin, flags); return svc_create_socket(serv, protocol, (struct sockaddr *) &sin,
sizeof(sin), flags);
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment