Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
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 @@ out_mnt_err:
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