Commit d77385f2 authored by Trond Myklebust's avatar Trond Myklebust

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: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 45402c38
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#ifndef _LINUX_SUNRPC_CLNT_H #ifndef _LINUX_SUNRPC_CLNT_H
#define _LINUX_SUNRPC_CLNT_H #define _LINUX_SUNRPC_CLNT_H
#include <linux/types.h>
#include <linux/socket.h> #include <linux/socket.h>
#include <linux/in.h> #include <linux/in.h>
#include <linux/in6.h> #include <linux/in6.h>
...@@ -161,7 +162,7 @@ const char *rpc_peeraddr2str(struct rpc_clnt *, enum rpc_display_format_t); ...@@ -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_ntop(const struct sockaddr *, char *, const size_t);
size_t rpc_pton(const char *, const size_t, size_t rpc_pton(const char *, const size_t,
struct sockaddr *, 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, size_t rpc_uaddr2sockaddr(const char *, const size_t,
struct sockaddr *, const size_t); struct sockaddr *, const size_t);
......
...@@ -255,12 +255,13 @@ EXPORT_SYMBOL_GPL(rpc_pton); ...@@ -255,12 +255,13 @@ EXPORT_SYMBOL_GPL(rpc_pton);
/** /**
* rpc_sockaddr2uaddr - Construct a universal address string from @sap. * rpc_sockaddr2uaddr - Construct a universal address string from @sap.
* @sap: socket address * @sap: socket address
* @gfp_flags: allocation mode
* *
* Returns a %NUL-terminated string in dynamically allocated memory; * Returns a %NUL-terminated string in dynamically allocated memory;
* otherwise NULL is returned if an error occurred. Caller must * otherwise NULL is returned if an error occurred. Caller must
* free the returned string. * 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 portbuf[RPCBIND_MAXUADDRPLEN];
char addrbuf[RPCBIND_MAXUADDRLEN]; char addrbuf[RPCBIND_MAXUADDRLEN];
...@@ -288,7 +289,7 @@ char *rpc_sockaddr2uaddr(const struct sockaddr *sap) ...@@ -288,7 +289,7 @@ char *rpc_sockaddr2uaddr(const struct sockaddr *sap)
if (strlcat(addrbuf, portbuf, sizeof(addrbuf)) > sizeof(addrbuf)) if (strlcat(addrbuf, portbuf, sizeof(addrbuf)) > sizeof(addrbuf))
return NULL; return NULL;
return kstrdup(addrbuf, GFP_KERNEL); return kstrdup(addrbuf, gfp_flags);
} }
EXPORT_SYMBOL_GPL(rpc_sockaddr2uaddr); EXPORT_SYMBOL_GPL(rpc_sockaddr2uaddr);
......
...@@ -410,7 +410,7 @@ static int rpcb_register_inet4(const struct sockaddr *sap, ...@@ -410,7 +410,7 @@ static int rpcb_register_inet4(const struct sockaddr *sap,
unsigned short port = ntohs(sin->sin_port); unsigned short port = ntohs(sin->sin_port);
int result; int result;
map->r_addr = rpc_sockaddr2uaddr(sap); map->r_addr = rpc_sockaddr2uaddr(sap, GFP_KERNEL);
dprintk("RPC: %sregistering [%u, %u, %s, '%s'] with " dprintk("RPC: %sregistering [%u, %u, %s, '%s'] with "
"local rpcbind\n", (port ? "" : "un"), "local rpcbind\n", (port ? "" : "un"),
...@@ -437,7 +437,7 @@ static int rpcb_register_inet6(const struct sockaddr *sap, ...@@ -437,7 +437,7 @@ static int rpcb_register_inet6(const struct sockaddr *sap,
unsigned short port = ntohs(sin6->sin6_port); unsigned short port = ntohs(sin6->sin6_port);
int result; int result;
map->r_addr = rpc_sockaddr2uaddr(sap); map->r_addr = rpc_sockaddr2uaddr(sap, GFP_KERNEL);
dprintk("RPC: %sregistering [%u, %u, %s, '%s'] with " dprintk("RPC: %sregistering [%u, %u, %s, '%s'] with "
"local rpcbind\n", (port ? "" : "un"), "local rpcbind\n", (port ? "" : "un"),
...@@ -686,7 +686,7 @@ void rpcb_getport_async(struct rpc_task *task) ...@@ -686,7 +686,7 @@ void rpcb_getport_async(struct rpc_task *task)
case RPCBVERS_4: case RPCBVERS_4:
case RPCBVERS_3: case RPCBVERS_3:
map->r_netid = rpc_peeraddr2str(clnt, RPC_DISPLAY_NETID); 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 = ""; map->r_owner = "";
break; break;
case RPCBVERS_2: case RPCBVERS_2:
......
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