Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid
[sfrench/cifs-2.6.git] / net / sunrpc / clnt.c
index 8d83f9d487130bb7789fe0dc53201ec3aedc5a95..8c9141583d6f135714eac27c100e4bc9c3426631 100644 (file)
  *     and need to be refreshed, or when a packet was damaged in transit.
  *     This may be have to be moved to the VFS layer.
  *
- *  NB: BSD uses a more intelligent approach to guessing when a request
- *  or reply has been lost by keeping the RTO estimate for each procedure.
- *  We currently make do with a constant timeout value.
- *
  *  Copyright (C) 1992,1993 Rick Sladkey <jrs@world.std.com>
  *  Copyright (C) 1995,1996 Olaf Kirch <okir@monad.swb.de>
  */
@@ -32,7 +28,9 @@
 #include <linux/slab.h>
 #include <linux/utsname.h>
 #include <linux/workqueue.h>
+#include <linux/in.h>
 #include <linux/in6.h>
+#include <linux/un.h>
 
 #include <linux/sunrpc/clnt.h>
 #include <linux/sunrpc/rpc_pipe_fs.h>
@@ -298,22 +296,27 @@ struct rpc_clnt *rpc_create(struct rpc_create_args *args)
         * up a string representation of the passed-in address.
         */
        if (args->servername == NULL) {
+               struct sockaddr_un *sun =
+                               (struct sockaddr_un *)args->address;
+               struct sockaddr_in *sin =
+                               (struct sockaddr_in *)args->address;
+               struct sockaddr_in6 *sin6 =
+                               (struct sockaddr_in6 *)args->address;
+
                servername[0] = '\0';
                switch (args->address->sa_family) {
-               case AF_INET: {
-                       struct sockaddr_in *sin =
-                                       (struct sockaddr_in *)args->address;
+               case AF_LOCAL:
+                       snprintf(servername, sizeof(servername), "%s",
+                                sun->sun_path);
+                       break;
+               case AF_INET:
                        snprintf(servername, sizeof(servername), "%pI4",
                                 &sin->sin_addr.s_addr);
                        break;
-               }
-               case AF_INET6: {
-                       struct sockaddr_in6 *sin =
-                                       (struct sockaddr_in6 *)args->address;
+               case AF_INET6:
                        snprintf(servername, sizeof(servername), "%pI6",
-                                &sin->sin6_addr);
+                                &sin6->sin6_addr);
                        break;
-               }
                default:
                        /* caller wants default server name, but
                         * address family isn't recognized. */
@@ -1058,7 +1061,7 @@ call_allocate(struct rpc_task *task)
 
        dprintk("RPC: %5u rpc_buffer allocation failed\n", task->tk_pid);
 
-       if (RPC_IS_ASYNC(task) || !signalled()) {
+       if (RPC_IS_ASYNC(task) || !fatal_signal_pending(current)) {
                task->tk_action = call_allocate;
                rpc_delay(task, HZ>>4);
                return;
@@ -1172,6 +1175,9 @@ call_bind_status(struct rpc_task *task)
                        status = -EOPNOTSUPP;
                        break;
                }
+               if (task->tk_rebind_retry == 0)
+                       break;
+               task->tk_rebind_retry--;
                rpc_delay(task, 3*HZ);
                goto retry_timeout;
        case -ETIMEDOUT: