Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
976a6f92
Commit
976a6f92
authored
Aug 10, 2009
by
Trond Myklebust
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'patches_cel-for-2.6.32' into nfs-for-2.6.32
parents
e576e05a
c05988cd
Changes
16
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
1022 additions
and
585 deletions
+1022
-585
fs/lockd/host.c
fs/lockd/host.c
+1
-13
fs/lockd/mon.c
fs/lockd/mon.c
+5
-39
fs/nfs/internal.h
fs/nfs/internal.h
+1
-22
fs/nfs/mount_clnt.c
fs/nfs/mount_clnt.c
+79
-0
fs/nfs/nfs4namespace.c
fs/nfs/nfs4namespace.c
+4
-4
fs/nfs/super.c
fs/nfs/super.c
+87
-160
fs/nfsd/nfsctl.c
fs/nfsd/nfsctl.c
+7
-14
include/linux/sunrpc/clnt.h
include/linux/sunrpc/clnt.h
+38
-0
include/linux/sunrpc/msg_prot.h
include/linux/sunrpc/msg_prot.h
+16
-1
include/linux/sunrpc/xprt.h
include/linux/sunrpc/xprt.h
+0
-2
net/sunrpc/Makefile
net/sunrpc/Makefile
+1
-1
net/sunrpc/addr.c
net/sunrpc/addr.c
+364
-0
net/sunrpc/rpcb_clnt.c
net/sunrpc/rpcb_clnt.c
+280
-140
net/sunrpc/timer.c
net/sunrpc/timer.c
+29
-16
net/sunrpc/xprtrdma/transport.c
net/sunrpc/xprtrdma/transport.c
+13
-35
net/sunrpc/xprtsock.c
net/sunrpc/xprtsock.c
+97
-138
No files found.
fs/lockd/host.c
View file @
976a6f92
...
...
@@ -87,18 +87,6 @@ static unsigned int nlm_hash_address(const struct sockaddr *sap)
return
hash
&
(
NLM_HOST_NRHASH
-
1
);
}
static
void
nlm_clear_port
(
struct
sockaddr
*
sap
)
{
switch
(
sap
->
sa_family
)
{
case
AF_INET
:
((
struct
sockaddr_in
*
)
sap
)
->
sin_port
=
0
;
break
;
case
AF_INET6
:
((
struct
sockaddr_in6
*
)
sap
)
->
sin6_port
=
0
;
break
;
}
}
/*
* Common host lookup routine for server & client
*/
...
...
@@ -177,7 +165,7 @@ static struct nlm_host *nlm_lookup_host(struct nlm_lookup_host_info *ni)
host
->
h_addrbuf
=
nsm
->
sm_addrbuf
;
memcpy
(
nlm_addr
(
host
),
ni
->
sap
,
ni
->
salen
);
host
->
h_addrlen
=
ni
->
salen
;
nlm_clear_port
(
nlm_addr
(
host
)
);
rpc_set_port
(
nlm_addr
(
host
),
0
);
memcpy
(
nlm_srcaddr
(
host
),
ni
->
src_sap
,
ni
->
src_len
);
host
->
h_version
=
ni
->
version
;
host
->
h_proto
=
ni
->
protocol
;
...
...
fs/lockd/mon.c
View file @
976a6f92
...
...
@@ -61,43 +61,6 @@ static inline struct sockaddr *nsm_addr(const struct nsm_handle *nsm)
return
(
struct
sockaddr
*
)
&
nsm
->
sm_addr
;
}
static
void
nsm_display_ipv4_address
(
const
struct
sockaddr
*
sap
,
char
*
buf
,
const
size_t
len
)
{
const
struct
sockaddr_in
*
sin
=
(
struct
sockaddr_in
*
)
sap
;
snprintf
(
buf
,
len
,
"%pI4"
,
&
sin
->
sin_addr
.
s_addr
);
}
static
void
nsm_display_ipv6_address
(
const
struct
sockaddr
*
sap
,
char
*
buf
,
const
size_t
len
)
{
const
struct
sockaddr_in6
*
sin6
=
(
struct
sockaddr_in6
*
)
sap
;
if
(
ipv6_addr_v4mapped
(
&
sin6
->
sin6_addr
))
snprintf
(
buf
,
len
,
"%pI4"
,
&
sin6
->
sin6_addr
.
s6_addr32
[
3
]);
else
if
(
sin6
->
sin6_scope_id
!=
0
)
snprintf
(
buf
,
len
,
"%pI6%%%u"
,
&
sin6
->
sin6_addr
,
sin6
->
sin6_scope_id
);
else
snprintf
(
buf
,
len
,
"%pI6"
,
&
sin6
->
sin6_addr
);
}
static
void
nsm_display_address
(
const
struct
sockaddr
*
sap
,
char
*
buf
,
const
size_t
len
)
{
switch
(
sap
->
sa_family
)
{
case
AF_INET
:
nsm_display_ipv4_address
(
sap
,
buf
,
len
);
break
;
case
AF_INET6
:
nsm_display_ipv6_address
(
sap
,
buf
,
len
);
break
;
default:
snprintf
(
buf
,
len
,
"unsupported address family"
);
break
;
}
}
static
struct
rpc_clnt
*
nsm_create
(
void
)
{
struct
sockaddr_in
sin
=
{
...
...
@@ -307,8 +270,11 @@ static struct nsm_handle *nsm_create_handle(const struct sockaddr *sap,
memcpy
(
nsm_addr
(
new
),
sap
,
salen
);
new
->
sm_addrlen
=
salen
;
nsm_init_private
(
new
);
nsm_display_address
((
const
struct
sockaddr
*
)
&
new
->
sm_addr
,
new
->
sm_addrbuf
,
sizeof
(
new
->
sm_addrbuf
));
if
(
rpc_ntop
(
nsm_addr
(
new
),
new
->
sm_addrbuf
,
sizeof
(
new
->
sm_addrbuf
))
==
0
)
(
void
)
snprintf
(
new
->
sm_addrbuf
,
sizeof
(
new
->
sm_addrbuf
),
"unsupported address family"
);
memcpy
(
new
->
sm_name
,
hostname
,
hostname_len
);
new
->
sm_name
[
hostname_len
]
=
'\0'
;
...
...
fs/nfs/internal.h
View file @
976a6f92
...
...
@@ -102,6 +102,7 @@ struct nfs_mount_request {
};
extern
int
nfs_mount
(
struct
nfs_mount_request
*
info
);
extern
void
nfs_umount
(
const
struct
nfs_mount_request
*
info
);
/* client.c */
extern
struct
rpc_program
nfs_program
;
...
...
@@ -213,7 +214,6 @@ void nfs_zap_acl_cache(struct inode *inode);
extern
int
nfs_wait_bit_killable
(
void
*
word
);
/* super.c */
void
nfs_parse_ip_address
(
char
*
,
size_t
,
struct
sockaddr
*
,
size_t
*
);
extern
struct
file_system_type
nfs_xdev_fs_type
;
#ifdef CONFIG_NFS_V4
extern
struct
file_system_type
nfs4_xdev_fs_type
;
...
...
@@ -374,24 +374,3 @@ unsigned int nfs_page_array_len(unsigned int base, size_t len)
return
((
unsigned
long
)
len
+
(
unsigned
long
)
base
+
PAGE_SIZE
-
1
)
>>
PAGE_SHIFT
;
}
#define IPV6_SCOPE_DELIMITER '%'
/*
* Set the port number in an address. Be agnostic about the address
* family.
*/
static
inline
void
nfs_set_port
(
struct
sockaddr
*
sap
,
unsigned
short
port
)
{
struct
sockaddr_in
*
ap
=
(
struct
sockaddr_in
*
)
sap
;
struct
sockaddr_in6
*
ap6
=
(
struct
sockaddr_in6
*
)
sap
;
switch
(
sap
->
sa_family
)
{
case
AF_INET
:
ap
->
sin_port
=
htons
(
port
);
break
;
case
AF_INET6
:
ap6
->
sin6_port
=
htons
(
port
);
break
;
}
}
fs/nfs/mount_clnt.c
View file @
976a6f92
...
...
@@ -209,6 +209,71 @@ int nfs_mount(struct nfs_mount_request *info)
goto
out
;
}
/**
* nfs_umount - Notify a server that we have unmounted this export
* @info: pointer to umount request arguments
*
* MOUNTPROC_UMNT is advisory, so we set a short timeout, and always
* use UDP.
*/
void
nfs_umount
(
const
struct
nfs_mount_request
*
info
)
{
static
const
struct
rpc_timeout
nfs_umnt_timeout
=
{
.
to_initval
=
1
*
HZ
,
.
to_maxval
=
3
*
HZ
,
.
to_retries
=
2
,
};
struct
rpc_create_args
args
=
{
.
protocol
=
IPPROTO_UDP
,
.
address
=
info
->
sap
,
.
addrsize
=
info
->
salen
,
.
timeout
=
&
nfs_umnt_timeout
,
.
servername
=
info
->
hostname
,
.
program
=
&
mnt_program
,
.
version
=
info
->
version
,
.
authflavor
=
RPC_AUTH_UNIX
,
.
flags
=
RPC_CLNT_CREATE_NOPING
,
};
struct
mountres
result
;
struct
rpc_message
msg
=
{
.
rpc_argp
=
info
->
dirpath
,
.
rpc_resp
=
&
result
,
};
struct
rpc_clnt
*
clnt
;
int
status
;
if
(
info
->
noresvport
)
args
.
flags
|=
RPC_CLNT_CREATE_NONPRIVPORT
;
clnt
=
rpc_create
(
&
args
);
if
(
unlikely
(
IS_ERR
(
clnt
)))
goto
out_clnt_err
;
dprintk
(
"NFS: sending UMNT request for %s:%s
\n
"
,
(
info
->
hostname
?
info
->
hostname
:
"server"
),
info
->
dirpath
);
if
(
info
->
version
==
NFS_MNT3_VERSION
)
msg
.
rpc_proc
=
&
clnt
->
cl_procinfo
[
MOUNTPROC3_UMNT
];
else
msg
.
rpc_proc
=
&
clnt
->
cl_procinfo
[
MOUNTPROC_UMNT
];
status
=
rpc_call_sync
(
clnt
,
&
msg
,
0
);
rpc_shutdown_client
(
clnt
);
if
(
unlikely
(
status
<
0
))
goto
out_call_err
;
return
;
out_clnt_err:
dprintk
(
"NFS: failed to create UMNT RPC client, status=%ld
\n
"
,
PTR_ERR
(
clnt
));
return
;
out_call_err:
dprintk
(
"NFS: UMNT request failed, status=%d
\n
"
,
status
);
}
/*
* XDR encode/decode functions for MOUNT
*/
...
...
@@ -407,6 +472,13 @@ static struct rpc_procinfo mnt_procedures[] = {
.
p_statidx
=
MOUNTPROC_MNT
,
.
p_name
=
"MOUNT"
,
},
[
MOUNTPROC_UMNT
]
=
{
.
p_proc
=
MOUNTPROC_UMNT
,
.
p_encode
=
(
kxdrproc_t
)
mnt_enc_dirpath
,
.
p_arglen
=
MNT_enc_dirpath_sz
,
.
p_statidx
=
MOUNTPROC_UMNT
,
.
p_name
=
"UMOUNT"
,
},
};
static
struct
rpc_procinfo
mnt3_procedures
[]
=
{
...
...
@@ -419,6 +491,13 @@ static struct rpc_procinfo mnt3_procedures[] = {
.
p_statidx
=
MOUNTPROC3_MNT
,
.
p_name
=
"MOUNT"
,
},
[
MOUNTPROC3_UMNT
]
=
{
.
p_proc
=
MOUNTPROC3_UMNT
,
.
p_encode
=
(
kxdrproc_t
)
mnt_enc_dirpath
,
.
p_arglen
=
MNT_enc_dirpath_sz
,
.
p_statidx
=
MOUNTPROC3_UMNT
,
.
p_name
=
"UMOUNT"
,
},
};
...
...
fs/nfs/nfs4namespace.c
View file @
976a6f92
...
...
@@ -121,11 +121,11 @@ static struct vfsmount *try_location(struct nfs_clone_mount *mountdata,
if
(
memchr
(
buf
->
data
,
IPV6_SCOPE_DELIMITER
,
buf
->
len
))
continue
;
nfs_parse_ip_address
(
buf
->
data
,
buf
->
len
,
mountdata
->
addr
,
&
mountdata
->
addrlen
);
if
(
mountdata
->
addr
->
sa_family
==
AF_UNSPEC
)
mountdata
->
addrlen
=
rpc_pton
(
buf
->
data
,
buf
->
len
,
mountdata
->
addr
,
mountdata
->
addrlen
);
if
(
mountdata
->
addr
len
==
0
)
continue
;
nfs
_set_port
(
mountdata
->
addr
,
NFS_PORT
);
rpc
_set_port
(
mountdata
->
addr
,
NFS_PORT
);
memcpy
(
page2
,
buf
->
data
,
buf
->
len
);
page2
[
buf
->
len
]
=
'\0'
;
...
...
fs/nfs/super.c
View file @
976a6f92
This diff is collapsed.
Click to expand it.
fs/nfsd/nfsctl.c
View file @
976a6f92
...
...
@@ -37,6 +37,7 @@
#include <linux/nfsd/xdr.h>
#include <linux/nfsd/syscall.h>
#include <linux/lockd/lockd.h>
#include <linux/sunrpc/clnt.h>
#include <asm/uaccess.h>
#include <net/ipv6.h>
...
...
@@ -490,22 +491,18 @@ static ssize_t write_getfd(struct file *file, char *buf, size_t size)
*
* Input:
* buf: '\n'-terminated C string containing a
* presentation format IP
v4
address
* presentation format IP address
* size: length of C string in @buf
* Output:
* On success: returns zero if all specified locks were released;
* returns one if one or more locks were not released
* On error: return code is negative errno value
*
* Note: Only AF_INET client addresses are passed in
*/
static
ssize_t
write_unlock_ip
(
struct
file
*
file
,
char
*
buf
,
size_t
size
)
{
struct
sockaddr_in
sin
=
{
.
sin_family
=
AF_INET
,
};
int
b1
,
b2
,
b3
,
b4
;
char
c
;
struct
sockaddr_storage
address
;
struct
sockaddr
*
sap
=
(
struct
sockaddr
*
)
&
address
;
size_t
salen
=
sizeof
(
address
);
char
*
fo_path
;
/* sanity check */
...
...
@@ -519,14 +516,10 @@ static ssize_t write_unlock_ip(struct file *file, char *buf, size_t size)
if
(
qword_get
(
&
buf
,
fo_path
,
size
)
<
0
)
return
-
EINVAL
;
/* get ipv4 address */
if
(
sscanf
(
fo_path
,
"%u.%u.%u.%u%c"
,
&
b1
,
&
b2
,
&
b3
,
&
b4
,
&
c
)
!=
4
)
return
-
EINVAL
;
if
(
b1
>
255
||
b2
>
255
||
b3
>
255
||
b4
>
255
)
if
(
rpc_pton
(
fo_path
,
size
,
sap
,
salen
)
==
0
)
return
-
EINVAL
;
sin
.
sin_addr
.
s_addr
=
htonl
((
b1
<<
24
)
|
(
b2
<<
16
)
|
(
b3
<<
8
)
|
b4
);
return
nlmsvc_unlock_all_by_ip
(
(
struct
sockaddr
*
)
&
sin
);
return
nlmsvc_unlock_all_by_ip
(
sap
);
}
/**
...
...
include/linux/sunrpc/clnt.h
View file @
976a6f92
...
...
@@ -9,6 +9,10 @@
#ifndef _LINUX_SUNRPC_CLNT_H
#define _LINUX_SUNRPC_CLNT_H
#include <linux/socket.h>
#include <linux/in.h>
#include <linux/in6.h>
#include <linux/sunrpc/msg_prot.h>
#include <linux/sunrpc/sched.h>
#include <linux/sunrpc/xprt.h>
...
...
@@ -151,5 +155,39 @@ void rpc_force_rebind(struct rpc_clnt *);
size_t
rpc_peeraddr
(
struct
rpc_clnt
*
,
struct
sockaddr
*
,
size_t
);
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
*
);
size_t
rpc_uaddr2sockaddr
(
const
char
*
,
const
size_t
,
struct
sockaddr
*
,
const
size_t
);
static
inline
unsigned
short
rpc_get_port
(
const
struct
sockaddr
*
sap
)
{
switch
(
sap
->
sa_family
)
{
case
AF_INET
:
return
ntohs
(((
struct
sockaddr_in
*
)
sap
)
->
sin_port
);
case
AF_INET6
:
return
ntohs
(((
struct
sockaddr_in6
*
)
sap
)
->
sin6_port
);
}
return
0
;
}
static
inline
void
rpc_set_port
(
struct
sockaddr
*
sap
,
const
unsigned
short
port
)
{
switch
(
sap
->
sa_family
)
{
case
AF_INET
:
((
struct
sockaddr_in
*
)
sap
)
->
sin_port
=
htons
(
port
);
break
;
case
AF_INET6
:
((
struct
sockaddr_in6
*
)
sap
)
->
sin6_port
=
htons
(
port
);
break
;
}
}
#define IPV6_SCOPE_DELIMITER '%'
#define IPV6_SCOPE_ID_LEN sizeof("%nnnnnnnnnn")
#endif
/* __KERNEL__ */
#endif
/* _LINUX_SUNRPC_CLNT_H */
include/linux/sunrpc/msg_prot.h
View file @
976a6f92
...
...
@@ -189,7 +189,22 @@ typedef __be32 rpc_fraghdr;
* Additionally, the two alternative forms specified in Section 2.2 of
* [RFC2373] are also acceptable.
*/
#define RPCBIND_MAXUADDRLEN (56u)
#include <linux/inet.h>
/* Maximum size of the port number part of a universal address */
#define RPCBIND_MAXUADDRPLEN sizeof(".255.255")
/* Maximum size of an IPv4 universal address */
#define RPCBIND_MAXUADDR4LEN \
(INET_ADDRSTRLEN + RPCBIND_MAXUADDRPLEN)
/* Maximum size of an IPv6 universal address */
#define RPCBIND_MAXUADDR6LEN \
(INET6_ADDRSTRLEN + RPCBIND_MAXUADDRPLEN)
/* Assume INET6_ADDRSTRLEN will always be larger than INET_ADDRSTRLEN... */
#define RPCBIND_MAXUADDRLEN RPCBIND_MAXUADDR6LEN
#endif
/* __KERNEL__ */
#endif
/* _LINUX_SUNRPC_MSGPROT_H_ */
include/linux/sunrpc/xprt.h
View file @
976a6f92
...
...
@@ -38,10 +38,8 @@ enum rpc_display_format_t {
RPC_DISPLAY_ADDR
=
0
,
RPC_DISPLAY_PORT
,
RPC_DISPLAY_PROTO
,
RPC_DISPLAY_ALL
,
RPC_DISPLAY_HEX_ADDR
,
RPC_DISPLAY_HEX_PORT
,
RPC_DISPLAY_UNIVERSAL_ADDR
,
RPC_DISPLAY_NETID
,
RPC_DISPLAY_MAX
,
};
...
...
net/sunrpc/Makefile
View file @
976a6f92
...
...
@@ -10,7 +10,7 @@ obj-$(CONFIG_SUNRPC_XPRT_RDMA) += xprtrdma/
sunrpc-y
:=
clnt.o xprt.o socklib.o xprtsock.o sched.o
\
auth.o auth_null.o auth_unix.o auth_generic.o
\
svc.o svcsock.o svcauth.o svcauth_unix.o
\
rpcb_clnt.o timer.o xdr.o
\
addr.o
rpcb_clnt.o timer.o xdr.o
\
sunrpc_syms.o cache.o rpc_pipe.o
\
svc_xprt.o
sunrpc-$(CONFIG_NFS_V4_1)
+=
backchannel_rqst.o bc_svc.o
...
...
net/sunrpc/addr.c
0 → 100644
View file @
976a6f92
/*
* Copyright 2009, Oracle. All rights reserved.
*
* Convert socket addresses to presentation addresses and universal
* addresses, and vice versa.
*
* Universal addresses are introduced by RFC 1833 and further refined by
* recent RFCs describing NFSv4. The universal address format is part
* of the external (network) interface provided by rpcbind version 3
* and 4, and by NFSv4. Such an address is a string containing a
* presentation format IP address followed by a port number in
* "hibyte.lobyte" format.
*
* IPv6 addresses can also include a scope ID, typically denoted by
* a '%' followed by a device name or a non-negative integer. Refer to
* RFC 4291, Section 2.2 for details on IPv6 presentation formats.
*/
#include <net/ipv6.h>
#include <linux/sunrpc/clnt.h>
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
static
size_t
rpc_ntop6_noscopeid
(
const
struct
sockaddr
*
sap
,
char
*
buf
,
const
int
buflen
)
{
const
struct
sockaddr_in6
*
sin6
=
(
struct
sockaddr_in6
*
)
sap
;
const
struct
in6_addr
*
addr
=
&
sin6
->
sin6_addr
;
/*
* RFC 4291, Section 2.2.2
*
* Shorthanded ANY address
*/
if
(
ipv6_addr_any
(
addr
))
return
snprintf
(
buf
,
buflen
,
"::"
);
/*
* RFC 4291, Section 2.2.2
*
* Shorthanded loopback address
*/
if
(
ipv6_addr_loopback
(
addr
))
return
snprintf
(
buf
,
buflen
,
"::1"
);
/*
* RFC 4291, Section 2.2.3
*
* Special presentation address format for mapped v4
* addresses.
*/
if
(
ipv6_addr_v4mapped
(
addr
))
return
snprintf
(
buf
,
buflen
,
"::ffff:%pI4"
,
&
addr
->
s6_addr32
[
3
]);
/*
* RFC 4291, Section 2.2.1
*
* To keep the result as short as possible, especially
* since we don't shorthand, we don't want leading zeros
* in each halfword, so avoid %pI6.
*/
return
snprintf
(
buf
,
buflen
,
"%x:%x:%x:%x:%x:%x:%x:%x"
,
ntohs
(
addr
->
s6_addr16
[
0
]),
ntohs
(
addr
->
s6_addr16
[
1
]),
ntohs
(
addr
->
s6_addr16
[
2
]),
ntohs
(
addr
->
s6_addr16
[
3
]),
ntohs
(
addr
->
s6_addr16
[
4
]),
ntohs
(
addr
->
s6_addr16
[
5
]),
ntohs
(
addr
->
s6_addr16
[
6
]),
ntohs
(
addr
->
s6_addr16
[
7
]));
}
static
size_t
rpc_ntop6
(
const
struct
sockaddr
*
sap
,
char
*
buf
,
const
size_t
buflen
)
{
const
struct
sockaddr_in6
*
sin6
=
(
struct
sockaddr_in6
*
)
sap
;
char
scopebuf
[
IPV6_SCOPE_ID_LEN
];
size_t
len
;
int
rc
;
len
=
rpc_ntop6_noscopeid
(
sap
,
buf
,
buflen
);
if
(
unlikely
(
len
==
0
))
return
len
;
if
(
!
(
ipv6_addr_type
(
&
sin6
->
sin6_addr
)
&
IPV6_ADDR_LINKLOCAL
)
&&
!
(
ipv6_addr_type
(
&
sin6
->
sin6_addr
)
&
IPV6_ADDR_SITELOCAL
))
return
len
;
rc
=
snprintf
(
scopebuf
,
sizeof
(
scopebuf
),
"%c%u"
,
IPV6_SCOPE_DELIMITER
,
sin6
->
sin6_scope_id
);
if
(
unlikely
((
size_t
)
rc
>
sizeof
(
scopebuf
)))
return
0
;
len
+=
rc
;
if
(
unlikely
(
len
>
buflen
))
return
0
;
strcat
(
buf
,
scopebuf
);
return
len
;
}
#else
/* !(defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)) */
static
size_t
rpc_ntop6_noscopeid
(
const
struct
sockaddr
*
sap
,
char
*
buf
,
const
int
buflen
)
{
return
0
;
}
static
size_t
rpc_ntop6
(
const
struct
sockaddr
*
sap
,
char
*
buf
,
const
size_t
buflen
)
{
return
0
;
}
#endif
/* !(defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)) */
static
int
rpc_ntop4
(
const
struct
sockaddr
*
sap
,
char
*
buf
,
const
size_t
buflen
)
{
const
struct
sockaddr_in
*
sin
=
(
struct
sockaddr_in
*
)
sap
;
return
snprintf
(
buf
,
buflen
,
"%pI4"
,
&
sin
->
sin_addr
);
}
/**
* rpc_ntop - construct a presentation address in @buf
* @sap: socket address
* @buf: construction area
* @buflen: size of @buf, in bytes
*
* Plants a %NUL-terminated string in @buf and returns the length
* of the string, excluding the %NUL. Otherwise zero is returned.
*/
size_t
rpc_ntop
(
const
struct
sockaddr
*
sap
,
char
*
buf
,
const
size_t
buflen
)
{
switch
(
sap
->
sa_family
)
{
case
AF_INET
:
return
rpc_ntop4
(
sap
,
buf
,
buflen
);
case
AF_INET6
:
return
rpc_ntop6
(
sap
,
buf
,
buflen
);
}
return
0
;
}
EXPORT_SYMBOL_GPL
(
rpc_ntop
);
static
size_t
rpc_pton4
(
const
char
*
buf
,
const
size_t
buflen
,
struct
sockaddr
*
sap
,
const
size_t
salen
)
{
struct
sockaddr_in
*
sin
=
(
struct
sockaddr_in
*
)
sap
;
u8
*
addr
=
(
u8
*
)
&
sin
->
sin_addr
.
s_addr
;
if
(
buflen
>
INET_ADDRSTRLEN
||
salen
<
sizeof
(
struct
sockaddr_in
))
return
0
;
memset
(
sap
,
0
,
sizeof
(
struct
sockaddr_in
));
if
(
in4_pton
(
buf
,
buflen
,
addr
,
'\0'
,
NULL
)
==
0
)
return
0
;
sin
->
sin_family
=
AF_INET
;
return
sizeof
(
struct
sockaddr_in
);;
}
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
static
int
rpc_parse_scope_id
(
const
char
*
buf
,
const
size_t
buflen
,
const
char
*
delim
,
struct
sockaddr_in6
*
sin6
)
{
char
*
p
;
size_t
len
;
if
((
buf
+
buflen
)
==
delim
)
return
1
;
if
(
*
delim
!=
IPV6_SCOPE_DELIMITER
)
return
0
;
if
(
!
(
ipv6_addr_type
(
&
sin6
->
sin6_addr
)
&
IPV6_ADDR_LINKLOCAL
)
&&
!
(
ipv6_addr_type
(
&
sin6
->
sin6_addr
)
&
IPV6_ADDR_SITELOCAL
))
return
0
;
len
=
(
buf
+
buflen
)
-
delim
-
1
;
p
=
kstrndup
(
delim
+
1
,
len
,
GFP_KERNEL
);
if
(
p
)
{
unsigned
long
scope_id
=
0
;
struct
net_device
*
dev
;
dev
=
dev_get_by_name
(
&
init_net
,
p
);
if
(
dev
!=
NULL
)
{
scope_id
=
dev
->
ifindex
;
dev_put
(
dev
);
}
else
{
if
(
strict_strtoul
(
p
,
10
,
&
scope_id
)
==
0
)
{
kfree
(
p
);
return
0
;
}
}
kfree
(
p
);
sin6
->
sin6_scope_id
=
scope_id
;
return
1
;
}
return
0
;
}
static
size_t
rpc_pton6
(
const
char
*
buf
,
const
size_t
buflen
,
struct
sockaddr
*
sap
,
const
size_t
salen
)
{
struct
sockaddr_in6
*
sin6
=
(
struct
sockaddr_in6
*
)
sap
;
u8
*
addr
=
(
u8
*
)
&
sin6
->
sin6_addr
.
in6_u
;
const
char
*
delim
;
if
(
buflen
>
(
INET6_ADDRSTRLEN
+
IPV6_SCOPE_ID_LEN
)
||
salen
<
sizeof
(
struct
sockaddr_in6
))
return
0
;
memset
(
sap
,
0
,
sizeof
(
struct
sockaddr_in6
));
if
(
in6_pton
(
buf
,
buflen
,
addr
,
IPV6_SCOPE_DELIMITER
,
&
delim
)
==
0
)
return
0
;
if
(
!
rpc_parse_scope_id
(
buf
,
buflen
,
delim
,
sin6
))
return
0
;
sin6
->
sin6_family
=
AF_INET6
;
return
sizeof
(
struct
sockaddr_in6
);
}
#else
static
size_t
rpc_pton6
(
const
char
*
buf
,
const
size_t
buflen
,
struct
sockaddr
*
sap
,
const
size_t
salen
)
{
return
0
;
}
#endif
/**
* rpc_pton - Construct a sockaddr in @sap
* @buf: C string containing presentation format IP address
* @buflen: length of presentation address in bytes
* @sap: buffer into which to plant socket address
* @salen: size of buffer in bytes
*
* Returns the size of the socket address if successful; otherwise
* zero is returned.
*
* Plants a socket address in @sap and returns the size of the
* socket address, if successful. Returns zero if an error
* occurred.
*/
size_t
rpc_pton
(
const
char
*
buf
,
const
size_t
buflen
,
struct
sockaddr
*
sap
,
const
size_t
salen
)
{
unsigned
int
i
;
for
(
i
=
0
;
i
<
buflen
;
i
++
)
if
(
buf
[
i
]
==
':'
)
return
rpc_pton6
(
buf
,
buflen
,
sap
,
salen
);
return
rpc_pton4
(
buf
,
buflen
,
sap
,
salen
);
}
EXPORT_SYMBOL_GPL
(
rpc_pton
);
/**
* rpc_sockaddr2uaddr - Construct a universal address string from @sap.
* @sap: socket address
*
* 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
portbuf
[
RPCBIND_MAXUADDRPLEN
];
char
addrbuf
[
RPCBIND_MAXUADDRLEN
];
unsigned
short
port
;
switch
(
sap
->
sa_family
)
{
case
AF_INET
:
if
(
rpc_ntop4
(
sap
,
addrbuf
,
sizeof
(
addrbuf
))
==
0
)
return
NULL
;
port
=
ntohs
(((
struct
sockaddr_in
*
)
sap
)
->
sin_port
);
break
;
case
AF_INET6
:
if
(
rpc_ntop6_noscopeid
(
sap
,
addrbuf
,
sizeof
(
addrbuf
))
==
0
)
return
NULL
;
port
=
ntohs
(((
struct
sockaddr_in6
*
)
sap
)
->
sin6_port
);
break
;
default:
return
NULL
;
}
if
(
snprintf
(
portbuf
,
sizeof
(
portbuf
),
".%u.%u"
,
port
>>
8
,
port
&
0xff
)
>
(
int
)
sizeof
(
portbuf
))
return
NULL
;
if
(
strlcat
(
addrbuf
,
portbuf
,
sizeof
(
addrbuf
))
>
sizeof
(
addrbuf
))
return
NULL
;
return
kstrdup
(
addrbuf
,
GFP_KERNEL
);
}
EXPORT_SYMBOL_GPL
(
rpc_sockaddr2uaddr
);
/**
* rpc_uaddr2sockaddr - convert a universal address to a socket address.
* @uaddr: C string containing universal address to convert
* @uaddr_len: length of universal address string
* @sap: buffer into which to plant socket address
* @salen: size of buffer
*
* Returns the size of the socket address if successful; otherwise
* zero is returned.
*/
size_t
rpc_uaddr2sockaddr
(
const
char
*
uaddr
,
const
size_t
uaddr_len
,
struct
sockaddr
*
sap
,
const
size_t
salen
)
{
char
*
c
,
buf
[
RPCBIND_MAXUADDRLEN
];
unsigned
long
portlo
,
porthi
;
unsigned
short
port
;
if
(
uaddr_len
>
sizeof
(
buf
))
return
0
;
memcpy
(
buf
,
uaddr
,
uaddr_len
);
buf
[
uaddr_len
]
=
'\n'
;
buf
[
uaddr_len
+
1
]
=
'\0'
;
c
=
strrchr
(
buf
,
'.'
);
if
(
unlikely
(
c
==
NULL
))
return
0
;
if
(
unlikely
(
strict_strtoul
(
c
+
1
,
10
,
&
portlo
)
!=
0
))
return
0
;
if
(
unlikely
(
portlo
>
255
))
return
0
;
c
[
0
]
=
'\n'
;
c
[
1
]
=
'\0'
;
c
=
strrchr
(
buf
,
'.'
);
if
(
unlikely
(
c
==
NULL
))
return
0
;
if
(
unlikely
(
strict_strtoul
(
c
+
1
,
10
,
&
porthi
)
!=
0
))
return
0
;
if
(
unlikely
(
porthi
>
255
))
return
0
;
port
=
(
unsigned
short
)((
porthi
<<
8
)
|
portlo
);
c
[
0
]
=
'\0'
;
if
(
rpc_pton
(
buf
,
strlen
(
buf
),
sap
,
salen
)
==
0
)
return
0
;
switch
(
sap
->
sa_family
)
{
case
AF_INET
:
((
struct
sockaddr_in
*
)
sap
)
->
sin_port
=
htons
(
port
);
return
sizeof
(
struct
sockaddr_in
);
case
AF_INET6
:
((
struct
sockaddr_in6
*
)
sap
)
->
sin6_port
=
htons
(
port
);
return
sizeof
(
struct
sockaddr_in6
);
}
return
0
;
}
EXPORT_SYMBOL_GPL
(
rpc_uaddr2sockaddr
);
net/sunrpc/rpcb_clnt.c
View file @
976a6f92
This diff is collapsed.
Click to expand it.
net/sunrpc/timer.c
View file @
976a6f92
...
...
@@ -25,8 +25,13 @@
#define RPC_RTO_INIT (HZ/5)
#define RPC_RTO_MIN (HZ/10)
void
rpc_init_rtt
(
struct
rpc_rtt
*
rt
,
unsigned
long
timeo
)
/**
* rpc_init_rtt - Initialize an RPC RTT estimator context
* @rt: context to initialize
* @timeo: initial timeout value, in jiffies
*
*/
void
rpc_init_rtt
(
struct
rpc_rtt
*
rt
,
unsigned
long
timeo
)
{
unsigned
long
init
=
0
;
unsigned
i
;
...
...
@@ -43,12 +48,16 @@ rpc_init_rtt(struct rpc_rtt *rt, unsigned long timeo)
}
EXPORT_SYMBOL_GPL
(
rpc_init_rtt
);
/*
/**
* rpc_update_rtt - Update an RPC RTT estimator context
* @rt: context to update
* @timer: timer array index (request type)
* @m: recent actual RTT, in jiffies
*
* NB: When computing the smoothed RTT and standard deviation,
* be careful not to produce negative intermediate results.
*/
void
rpc_update_rtt
(
struct
rpc_rtt
*
rt
,
unsigned
timer
,
long
m
)
void
rpc_update_rtt
(
struct
rpc_rtt
*
rt
,
unsigned
timer
,
long
m
)
{
long
*
srtt
,
*
sdrtt
;
...
...
@@ -79,21 +88,25 @@ rpc_update_rtt(struct rpc_rtt *rt, unsigned timer, long m)
}
EXPORT_SYMBOL_GPL
(
rpc_update_rtt
);
/*
* Estimate rto for an nfs rpc sent via. an unreliable datagram.
* Use the mean and mean deviation of rtt for the appropriate type of rpc
* for the frequent rpcs and a default for the others.
* The justification for doing "other" this way is that these rpcs
* happen so infrequently that timer est. would probably be stale.
* Also, since many of these rpcs are
* non-idempotent, a conservative timeout is desired.
/**
* rpc_calc_rto - Provide an estimated timeout value
* @rt: context to use for calculation
* @timer: timer array index (request type)
*
* Estimate RTO for an NFS RPC sent via an unreliable datagram. Use
* the mean and mean deviation of RTT for the appropriate type of RPC
* for frequently issued RPCs, and a fixed default for the others.
*
* The justification for doing "other" this way is that these RPCs
* happen so infrequently that timer estimation would probably be
* stale. Also, since many of these RPCs are non-idempotent, a
* conservative timeout is desired.
*
* getattr, lookup,
* read, write, commit - A+4D
* other - timeo
*/
unsigned
long
rpc_calc_rto
(
struct
rpc_rtt
*
rt
,
unsigned
timer
)
unsigned
long
rpc_calc_rto
(
struct
rpc_rtt
*
rt
,
unsigned
timer
)
{
unsigned
long
res
;
...
...
net/sunrpc/xprtrdma/transport.c
View file @
976a6f92
...
...
@@ -168,47 +168,25 @@ static struct rpc_xprt_ops xprt_rdma_procs; /* forward reference */
static
void
xprt_rdma_format_addresses
(
struct
rpc_xprt
*
xprt
)
{
struct
sockaddr
_in
*
addr
=
(
struct
sockaddr_in
*
)
struct
sockaddr
*
sap
=
(
struct
sockaddr
*
)
&
rpcx_to_rdmad
(
xprt
).
addr
;
char
*
buf
;
struct
sockaddr_in
*
sin
=
(
struct
sockaddr_in
*
)
sap
;
char
buf
[
64
];
buf
=
kzalloc
(
20
,
GFP_KERNEL
);
if
(
buf
)
snprintf
(
buf
,
20
,
"%pI4"
,
&
addr
->
sin_addr
.
s_addr
);
xprt
->
address_strings
[
RPC_DISPLAY_ADDR
]
=
buf
;
(
void
)
rpc_ntop
(
sap
,
buf
,
sizeof
(
buf
));
xprt
->
address_strings
[
RPC_DISPLAY_ADDR
]
=
kstrdup
(
buf
,
GFP_KERNEL
);
buf
=
kzalloc
(
8
,
GFP_KERNEL
);
if
(
buf
)
snprintf
(
buf
,
8
,
"%u"
,
ntohs
(
addr
->
sin_port
));
xprt
->
address_strings
[
RPC_DISPLAY_PORT
]
=
buf
;
(
void
)
snprintf
(
buf
,
sizeof
(
buf
),
"%u"
,
rpc_get_port
(
sap
));
xprt
->
address_strings
[
RPC_DISPLAY_PORT
]
=
kstrdup
(
buf
,
GFP_KERNEL
);
xprt
->
address_strings
[
RPC_DISPLAY_PROTO
]
=
"rdma"
;
buf
=
kzalloc
(
48
,
GFP_KERNEL
);
if
(
buf
)
snprintf
(
buf
,
48
,
"addr=%pI4 port=%u proto=%s"
,
&
addr
->
sin_addr
.
s_addr
,
ntohs
(
addr
->
sin_port
),
"rdma"
);
xprt
->
address_strings
[
RPC_DISPLAY_ALL
]
=
buf
;
buf
=
kzalloc
(
10
,
GFP_KERNEL
);
if
(
buf
)
snprintf
(
buf
,
10
,
"%02x%02x%02x%02x"
,
NIPQUAD
(
addr
->
sin_addr
.
s_addr
));
xprt
->
address_strings
[
RPC_DISPLAY_HEX_ADDR
]
=
buf
;
buf
=
kzalloc
(
8
,
GFP_KERNEL
);
if
(
buf
)
snprintf
(
buf
,
8
,
"%4hx"
,
ntohs
(
addr
->
sin_port
));
xprt
->
address_strings
[
RPC_DISPLAY_HEX_PORT
]
=
buf
;
buf
=
kzalloc
(
30
,
GFP_KERNEL
);
if
(
buf
)
snprintf
(
buf
,
30
,
"%pI4.%u.%u"
,
&
addr
->
sin_addr
.
s_addr
,
ntohs
(
addr
->
sin_port
)
>>
8
,
ntohs
(
addr
->
sin_port
)
&
0xff
);
xprt
->
address_strings
[
RPC_DISPLAY_UNIVERSAL_ADDR
]
=
buf
;
(
void
)
snprintf
(
buf
,
sizeof
(
buf
),
"%02x%02x%02x%02x"
,
NIPQUAD
(
sin
->
sin_addr
.
s_addr
));
xprt
->
address_strings
[
RPC_DISPLAY_HEX_ADDR
]
=
kstrdup
(
buf
,
GFP_KERNEL
);
(
void
)
snprintf
(
buf
,
sizeof
(
buf
),
"%4hx"
,
rpc_get_port
(
sap
));
xprt
->
address_strings
[
RPC_DISPLAY_HEX_PORT
]
=
kstrdup
(
buf
,
GFP_KERNEL
);
/* netid */
xprt
->
address_strings
[
RPC_DISPLAY_NETID
]
=
"rdma"
;
...
...
net/sunrpc/xprtsock.c
View file @
976a6f92
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment