You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'nfs-for-2.6.40' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6
* 'nfs-for-2.6.40' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6: SUNRPC: Support for RPC over AF_LOCAL transports SUNRPC: Remove obsolete comment SUNRPC: Use AF_LOCAL for rpcbind upcalls SUNRPC: Clean up use of curly braces in switch cases NFS: Revert NFSROOT default mount options SUNRPC: Rename xs_encode_tcp_fragment_header() nfs,rcu: convert call_rcu(nfs_free_delegation_callback) to kfree_rcu() nfs41: Correct offset for LAYOUTCOMMIT NFS: nfs_update_inode: print current and new inode size in debug output NFSv4.1: Fix the handling of NFS4ERR_SEQ_MISORDERED errors NFSv4: Handle expired stateids when the lease is still valid SUNRPC: Deal with the lack of a SYN_SENT sk->sk_state_change callback...
This commit is contained in:
+16
-13
@@ -13,10 +13,6 @@
|
||||
* 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. */
|
||||
|
||||
+83
-14
@@ -16,6 +16,7 @@
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/socket.h>
|
||||
#include <linux/un.h>
|
||||
#include <linux/in.h>
|
||||
#include <linux/in6.h>
|
||||
#include <linux/kernel.h>
|
||||
@@ -32,6 +33,8 @@
|
||||
# define RPCDBG_FACILITY RPCDBG_BIND
|
||||
#endif
|
||||
|
||||
#define RPCBIND_SOCK_PATHNAME "/var/run/rpcbind.sock"
|
||||
|
||||
#define RPCBIND_PROGRAM (100000u)
|
||||
#define RPCBIND_PORT (111u)
|
||||
|
||||
@@ -158,20 +161,69 @@ static void rpcb_map_release(void *data)
|
||||
kfree(map);
|
||||
}
|
||||
|
||||
static const struct sockaddr_in rpcb_inaddr_loopback = {
|
||||
.sin_family = AF_INET,
|
||||
.sin_addr.s_addr = htonl(INADDR_LOOPBACK),
|
||||
.sin_port = htons(RPCBIND_PORT),
|
||||
};
|
||||
/*
|
||||
* Returns zero on success, otherwise a negative errno value
|
||||
* is returned.
|
||||
*/
|
||||
static int rpcb_create_local_unix(void)
|
||||
{
|
||||
static const struct sockaddr_un rpcb_localaddr_rpcbind = {
|
||||
.sun_family = AF_LOCAL,
|
||||
.sun_path = RPCBIND_SOCK_PATHNAME,
|
||||
};
|
||||
struct rpc_create_args args = {
|
||||
.net = &init_net,
|
||||
.protocol = XPRT_TRANSPORT_LOCAL,
|
||||
.address = (struct sockaddr *)&rpcb_localaddr_rpcbind,
|
||||
.addrsize = sizeof(rpcb_localaddr_rpcbind),
|
||||
.servername = "localhost",
|
||||
.program = &rpcb_program,
|
||||
.version = RPCBVERS_2,
|
||||
.authflavor = RPC_AUTH_NULL,
|
||||
};
|
||||
struct rpc_clnt *clnt, *clnt4;
|
||||
int result = 0;
|
||||
|
||||
static DEFINE_MUTEX(rpcb_create_local_mutex);
|
||||
/*
|
||||
* Because we requested an RPC PING at transport creation time,
|
||||
* this works only if the user space portmapper is rpcbind, and
|
||||
* it's listening on AF_LOCAL on the named socket.
|
||||
*/
|
||||
clnt = rpc_create(&args);
|
||||
if (IS_ERR(clnt)) {
|
||||
dprintk("RPC: failed to create AF_LOCAL rpcbind "
|
||||
"client (errno %ld).\n", PTR_ERR(clnt));
|
||||
result = -PTR_ERR(clnt);
|
||||
goto out;
|
||||
}
|
||||
|
||||
clnt4 = rpc_bind_new_program(clnt, &rpcb_program, RPCBVERS_4);
|
||||
if (IS_ERR(clnt4)) {
|
||||
dprintk("RPC: failed to bind second program to "
|
||||
"rpcbind v4 client (errno %ld).\n",
|
||||
PTR_ERR(clnt4));
|
||||
clnt4 = NULL;
|
||||
}
|
||||
|
||||
/* Protected by rpcb_create_local_mutex */
|
||||
rpcb_local_clnt = clnt;
|
||||
rpcb_local_clnt4 = clnt4;
|
||||
|
||||
out:
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns zero on success, otherwise a negative errno value
|
||||
* is returned.
|
||||
*/
|
||||
static int rpcb_create_local(void)
|
||||
static int rpcb_create_local_net(void)
|
||||
{
|
||||
static const struct sockaddr_in rpcb_inaddr_loopback = {
|
||||
.sin_family = AF_INET,
|
||||
.sin_addr.s_addr = htonl(INADDR_LOOPBACK),
|
||||
.sin_port = htons(RPCBIND_PORT),
|
||||
};
|
||||
struct rpc_create_args args = {
|
||||
.net = &init_net,
|
||||
.protocol = XPRT_TRANSPORT_TCP,
|
||||
@@ -186,13 +238,6 @@ static int rpcb_create_local(void)
|
||||
struct rpc_clnt *clnt, *clnt4;
|
||||
int result = 0;
|
||||
|
||||
if (rpcb_local_clnt)
|
||||
return result;
|
||||
|
||||
mutex_lock(&rpcb_create_local_mutex);
|
||||
if (rpcb_local_clnt)
|
||||
goto out;
|
||||
|
||||
clnt = rpc_create(&args);
|
||||
if (IS_ERR(clnt)) {
|
||||
dprintk("RPC: failed to create local rpcbind "
|
||||
@@ -214,9 +259,33 @@ static int rpcb_create_local(void)
|
||||
clnt4 = NULL;
|
||||
}
|
||||
|
||||
/* Protected by rpcb_create_local_mutex */
|
||||
rpcb_local_clnt = clnt;
|
||||
rpcb_local_clnt4 = clnt4;
|
||||
|
||||
out:
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns zero on success, otherwise a negative errno value
|
||||
* is returned.
|
||||
*/
|
||||
static int rpcb_create_local(void)
|
||||
{
|
||||
static DEFINE_MUTEX(rpcb_create_local_mutex);
|
||||
int result = 0;
|
||||
|
||||
if (rpcb_local_clnt)
|
||||
return result;
|
||||
|
||||
mutex_lock(&rpcb_create_local_mutex);
|
||||
if (rpcb_local_clnt)
|
||||
goto out;
|
||||
|
||||
if (rpcb_create_local_unix() != 0)
|
||||
result = rpcb_create_local_net();
|
||||
|
||||
out:
|
||||
mutex_unlock(&rpcb_create_local_mutex);
|
||||
return result;
|
||||
|
||||
@@ -942,6 +942,8 @@ static void svc_unregister(const struct svc_serv *serv)
|
||||
if (progp->pg_vers[i]->vs_hidden)
|
||||
continue;
|
||||
|
||||
dprintk("svc: attempting to unregister %sv%u\n",
|
||||
progp->pg_name, i);
|
||||
__svc_unregister(progp->pg_prog, i, progp->pg_name);
|
||||
}
|
||||
}
|
||||
|
||||
+417
-18
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user