mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-29 05:44:11 +00:00
[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: Chuck Lever <chuck.lever@oracle.com> Cc: Aurelien Charbon <aurelien.charbon@ext.bull.net> Signed-off-by: Neil Brown <neilb@suse.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
95756482c9
commit
77f1f67a1a
1 changed files with 8 additions and 8 deletions
|
@ -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,
|
||||||
|
|
||||||
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,
|
||||||
}
|
}
|
||||||
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,
|
||||||
};
|
};
|
||||||
|
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue