forked from Minki/linux
SUNRPC: Fix rpc_sockaddr2uaddr
rpc_sockaddr2uaddr is only used by net/sunrpc/rpcb_clnt.c, where it is used in a non-blockable context in at least one case. Add non-blocking capability by adding a gfp_t argument Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
45402c38ee
commit
d77385f238
@ -9,6 +9,7 @@
|
||||
#ifndef _LINUX_SUNRPC_CLNT_H
|
||||
#define _LINUX_SUNRPC_CLNT_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/socket.h>
|
||||
#include <linux/in.h>
|
||||
#include <linux/in6.h>
|
||||
@ -161,7 +162,7 @@ const char *rpc_peeraddr2str(struct rpc_clnt *, enum rpc_display_format_t);
|
||||
size_t rpc_ntop(const struct sockaddr *, char *, const size_t);
|
||||
size_t rpc_pton(const char *, const size_t,
|
||||
struct sockaddr *, const size_t);
|
||||
char * rpc_sockaddr2uaddr(const struct sockaddr *);
|
||||
char * rpc_sockaddr2uaddr(const struct sockaddr *, gfp_t);
|
||||
size_t rpc_uaddr2sockaddr(const char *, const size_t,
|
||||
struct sockaddr *, const size_t);
|
||||
|
||||
|
@ -255,12 +255,13 @@ EXPORT_SYMBOL_GPL(rpc_pton);
|
||||
/**
|
||||
* rpc_sockaddr2uaddr - Construct a universal address string from @sap.
|
||||
* @sap: socket address
|
||||
* @gfp_flags: allocation mode
|
||||
*
|
||||
* Returns a %NUL-terminated string in dynamically allocated memory;
|
||||
* otherwise NULL is returned if an error occurred. Caller must
|
||||
* free the returned string.
|
||||
*/
|
||||
char *rpc_sockaddr2uaddr(const struct sockaddr *sap)
|
||||
char *rpc_sockaddr2uaddr(const struct sockaddr *sap, gfp_t gfp_flags)
|
||||
{
|
||||
char portbuf[RPCBIND_MAXUADDRPLEN];
|
||||
char addrbuf[RPCBIND_MAXUADDRLEN];
|
||||
@ -288,7 +289,7 @@ char *rpc_sockaddr2uaddr(const struct sockaddr *sap)
|
||||
if (strlcat(addrbuf, portbuf, sizeof(addrbuf)) > sizeof(addrbuf))
|
||||
return NULL;
|
||||
|
||||
return kstrdup(addrbuf, GFP_KERNEL);
|
||||
return kstrdup(addrbuf, gfp_flags);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rpc_sockaddr2uaddr);
|
||||
|
||||
|
@ -410,7 +410,7 @@ static int rpcb_register_inet4(const struct sockaddr *sap,
|
||||
unsigned short port = ntohs(sin->sin_port);
|
||||
int result;
|
||||
|
||||
map->r_addr = rpc_sockaddr2uaddr(sap);
|
||||
map->r_addr = rpc_sockaddr2uaddr(sap, GFP_KERNEL);
|
||||
|
||||
dprintk("RPC: %sregistering [%u, %u, %s, '%s'] with "
|
||||
"local rpcbind\n", (port ? "" : "un"),
|
||||
@ -437,7 +437,7 @@ static int rpcb_register_inet6(const struct sockaddr *sap,
|
||||
unsigned short port = ntohs(sin6->sin6_port);
|
||||
int result;
|
||||
|
||||
map->r_addr = rpc_sockaddr2uaddr(sap);
|
||||
map->r_addr = rpc_sockaddr2uaddr(sap, GFP_KERNEL);
|
||||
|
||||
dprintk("RPC: %sregistering [%u, %u, %s, '%s'] with "
|
||||
"local rpcbind\n", (port ? "" : "un"),
|
||||
@ -686,7 +686,7 @@ void rpcb_getport_async(struct rpc_task *task)
|
||||
case RPCBVERS_4:
|
||||
case RPCBVERS_3:
|
||||
map->r_netid = rpc_peeraddr2str(clnt, RPC_DISPLAY_NETID);
|
||||
map->r_addr = rpc_sockaddr2uaddr(sap);
|
||||
map->r_addr = rpc_sockaddr2uaddr(sap, GFP_ATOMIC);
|
||||
map->r_owner = "";
|
||||
break;
|
||||
case RPCBVERS_2:
|
||||
|
Loading…
Reference in New Issue
Block a user