SUNRPC: Fix rpc_sockaddr2uaddr
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Mon, 17 Oct 2011 23:08:10 +0000 (16:08 -0700)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Tue, 18 Oct 2011 16:13:32 +0000 (09:13 -0700)
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>
include/linux/sunrpc/clnt.h
net/sunrpc/addr.c
net/sunrpc/rpcb_clnt.c

index db7bcaf..d926fd1 100644 (file)
@@ -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);
 
index 4195233..23cd19d 100644 (file)
@@ -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);
 
index e45d2fb..f588b85 100644 (file)
@@ -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: