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
nexedi
linux
Commits
a2dd3793
Commit
a2dd3793
authored
Apr 11, 2015
by
Al Viro
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'dh/afs' into for-davem
parents
d8725c86
53d5864b
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
166 additions
and
35 deletions
+166
-35
fs/afs/misc.c
fs/afs/misc.c
+15
-1
fs/afs/rxrpc.c
fs/afs/rxrpc.c
+1
-4
include/rxrpc/packet.h
include/rxrpc/packet.h
+2
-1
net/rxrpc/ar-input.c
net/rxrpc/ar-input.c
+22
-1
net/rxrpc/ar-internal.h
net/rxrpc/ar-internal.h
+2
-0
net/rxrpc/ar-local.c
net/rxrpc/ar-local.c
+98
-0
net/rxrpc/ar-output.c
net/rxrpc/ar-output.c
+26
-28
No files found.
fs/afs/misc.c
View file @
a2dd3793
...
...
@@ -22,9 +22,12 @@
int
afs_abort_to_error
(
u32
abort_code
)
{
switch
(
abort_code
)
{
/* low errno codes inserted into abort namespace */
case
13
:
return
-
EACCES
;
case
27
:
return
-
EFBIG
;
case
30
:
return
-
EROFS
;
/* VICE "special error" codes; 101 - 111 */
case
VSALVAGE
:
return
-
EIO
;
case
VNOVNODE
:
return
-
ENOENT
;
case
VNOVOL
:
return
-
ENOMEDIUM
;
...
...
@@ -36,11 +39,18 @@ int afs_abort_to_error(u32 abort_code)
case
VOVERQUOTA
:
return
-
EDQUOT
;
case
VBUSY
:
return
-
EBUSY
;
case
VMOVED
:
return
-
ENXIO
;
case
0x2f6df0a
:
return
-
EWOULDBLOCK
;
/* Unified AFS error table; ET "uae" == 0x2f6df00 */
case
0x2f6df00
:
return
-
EPERM
;
case
0x2f6df01
:
return
-
ENOENT
;
case
0x2f6df04
:
return
-
EIO
;
case
0x2f6df0a
:
return
-
EAGAIN
;
case
0x2f6df0b
:
return
-
ENOMEM
;
case
0x2f6df0c
:
return
-
EACCES
;
case
0x2f6df0f
:
return
-
EBUSY
;
case
0x2f6df10
:
return
-
EEXIST
;
case
0x2f6df11
:
return
-
EXDEV
;
case
0x2f6df12
:
return
-
ENODEV
;
case
0x2f6df13
:
return
-
ENOTDIR
;
case
0x2f6df14
:
return
-
EISDIR
;
case
0x2f6df15
:
return
-
EINVAL
;
...
...
@@ -54,8 +64,12 @@ int afs_abort_to_error(u32 abort_code)
case
0x2f6df23
:
return
-
ENAMETOOLONG
;
case
0x2f6df24
:
return
-
ENOLCK
;
case
0x2f6df26
:
return
-
ENOTEMPTY
;
case
0x2f6df28
:
return
-
EWOULDBLOCK
;
case
0x2f6df69
:
return
-
ENOTCONN
;
case
0x2f6df6c
:
return
-
ETIMEDOUT
;
case
0x2f6df78
:
return
-
EDQUOT
;
/* RXKAD abort codes; from include/rxrpc/packet.h. ET "RXK" == 0x1260B00 */
case
RXKADINCONSISTENCY
:
return
-
EPROTO
;
case
RXKADPACKETSHORT
:
return
-
EPROTO
;
case
RXKADLEVELFAIL
:
return
-
EKEYREJECTED
;
...
...
fs/afs/rxrpc.c
View file @
a2dd3793
...
...
@@ -770,15 +770,12 @@ static int afs_deliver_cm_op_id(struct afs_call *call, struct sk_buff *skb,
void
afs_send_empty_reply
(
struct
afs_call
*
call
)
{
struct
msghdr
msg
;
struct
kvec
iov
[
1
];
_enter
(
""
);
iov
[
0
].
iov_base
=
NULL
;
iov
[
0
].
iov_len
=
0
;
msg
.
msg_name
=
NULL
;
msg
.
msg_namelen
=
0
;
iov_iter_kvec
(
&
msg
.
msg_iter
,
WRITE
|
ITER_KVEC
,
iov
,
0
,
0
);
/* WTF? */
iov_iter_kvec
(
&
msg
.
msg_iter
,
WRITE
|
ITER_KVEC
,
NULL
,
0
,
0
);
msg
.
msg_control
=
NULL
;
msg
.
msg_controllen
=
0
;
msg
.
msg_flags
=
0
;
...
...
include/rxrpc/packet.h
View file @
a2dd3793
...
...
@@ -47,7 +47,8 @@ struct rxrpc_header {
#define RXRPC_PACKET_TYPE_CHALLENGE 6
/* connection security challenge (SRVR->CLNT) */
#define RXRPC_PACKET_TYPE_RESPONSE 7
/* connection secutity response (CLNT->SRVR) */
#define RXRPC_PACKET_TYPE_DEBUG 8
/* debug info request */
#define RXRPC_N_PACKET_TYPES 9
/* number of packet types (incl type 0) */
#define RXRPC_PACKET_TYPE_VERSION 13
/* version string request */
#define RXRPC_N_PACKET_TYPES 14
/* number of packet types (incl type 0) */
uint8_t
flags
;
/* packet flags */
#define RXRPC_CLIENT_INITIATED 0x01
/* signifies a packet generated by a client */
...
...
net/rxrpc/ar-input.c
View file @
a2dd3793
...
...
@@ -28,7 +28,7 @@
const
char
*
rxrpc_pkts
[]
=
{
"?00"
,
"DATA"
,
"ACK"
,
"BUSY"
,
"ABORT"
,
"ACKALL"
,
"CHALL"
,
"RESP"
,
"DEBUG"
,
"?09"
,
"?10"
,
"?11"
,
"?12"
,
"
?13
"
,
"?14"
,
"?15"
"?09"
,
"?10"
,
"?11"
,
"?12"
,
"
VERSION
"
,
"?14"
,
"?15"
};
/*
...
...
@@ -593,6 +593,20 @@ static void rxrpc_post_packet_to_conn(struct rxrpc_connection *conn,
rxrpc_queue_conn
(
conn
);
}
/*
* post endpoint-level events to the local endpoint
* - this includes debug and version messages
*/
static
void
rxrpc_post_packet_to_local
(
struct
rxrpc_local
*
local
,
struct
sk_buff
*
skb
)
{
_enter
(
"%p,%p"
,
local
,
skb
);
atomic_inc
(
&
local
->
usage
);
skb_queue_tail
(
&
local
->
event_queue
,
skb
);
rxrpc_queue_work
(
&
local
->
event_processor
);
}
static
struct
rxrpc_connection
*
rxrpc_conn_from_local
(
struct
rxrpc_local
*
local
,
struct
sk_buff
*
skb
,
struct
rxrpc_skb_priv
*
sp
)
...
...
@@ -699,6 +713,11 @@ void rxrpc_data_ready(struct sock *sk)
goto
bad_message
;
}
if
(
sp
->
hdr
.
type
==
RXRPC_PACKET_TYPE_VERSION
)
{
rxrpc_post_packet_to_local
(
local
,
skb
);
goto
out
;
}
if
(
sp
->
hdr
.
type
==
RXRPC_PACKET_TYPE_DATA
&&
(
sp
->
hdr
.
callNumber
==
0
||
sp
->
hdr
.
seq
==
0
))
goto
bad_message
;
...
...
@@ -731,6 +750,8 @@ void rxrpc_data_ready(struct sock *sk)
else
goto
cant_route_call
;
}
out:
rxrpc_put_local
(
local
);
return
;
...
...
net/rxrpc/ar-internal.h
View file @
a2dd3793
...
...
@@ -152,11 +152,13 @@ struct rxrpc_local {
struct
work_struct
destroyer
;
/* endpoint destroyer */
struct
work_struct
acceptor
;
/* incoming call processor */
struct
work_struct
rejecter
;
/* packet reject writer */
struct
work_struct
event_processor
;
/* endpoint event processor */
struct
list_head
services
;
/* services listening on this endpoint */
struct
list_head
link
;
/* link in endpoint list */
struct
rw_semaphore
defrag_sem
;
/* control re-enablement of IP DF bit */
struct
sk_buff_head
accept_queue
;
/* incoming calls awaiting acceptance */
struct
sk_buff_head
reject_queue
;
/* packets awaiting rejection */
struct
sk_buff_head
event_queue
;
/* endpoint event packets awaiting processing */
spinlock_t
lock
;
/* access lock */
rwlock_t
services_lock
;
/* lock for services list */
atomic_t
usage
;
...
...
net/rxrpc/ar-local.c
View file @
a2dd3793
...
...
@@ -13,16 +13,22 @@
#include <linux/net.h>
#include <linux/skbuff.h>
#include <linux/slab.h>
#include <linux/udp.h>
#include <linux/ip.h>
#include <net/sock.h>
#include <net/af_rxrpc.h>
#include <generated/utsrelease.h>
#include "ar-internal.h"
static
const
char
rxrpc_version_string
[
65
]
=
"linux-"
UTS_RELEASE
" AF_RXRPC"
;
static
LIST_HEAD
(
rxrpc_locals
);
DEFINE_RWLOCK
(
rxrpc_local_lock
);
static
DECLARE_RWSEM
(
rxrpc_local_sem
);
static
DECLARE_WAIT_QUEUE_HEAD
(
rxrpc_local_wq
);
static
void
rxrpc_destroy_local
(
struct
work_struct
*
work
);
static
void
rxrpc_process_local_events
(
struct
work_struct
*
work
);
/*
* allocate a new local
...
...
@@ -37,11 +43,13 @@ struct rxrpc_local *rxrpc_alloc_local(struct sockaddr_rxrpc *srx)
INIT_WORK
(
&
local
->
destroyer
,
&
rxrpc_destroy_local
);
INIT_WORK
(
&
local
->
acceptor
,
&
rxrpc_accept_incoming_calls
);
INIT_WORK
(
&
local
->
rejecter
,
&
rxrpc_reject_packets
);
INIT_WORK
(
&
local
->
event_processor
,
&
rxrpc_process_local_events
);
INIT_LIST_HEAD
(
&
local
->
services
);
INIT_LIST_HEAD
(
&
local
->
link
);
init_rwsem
(
&
local
->
defrag_sem
);
skb_queue_head_init
(
&
local
->
accept_queue
);
skb_queue_head_init
(
&
local
->
reject_queue
);
skb_queue_head_init
(
&
local
->
event_queue
);
spin_lock_init
(
&
local
->
lock
);
rwlock_init
(
&
local
->
services_lock
);
atomic_set
(
&
local
->
usage
,
1
);
...
...
@@ -264,10 +272,12 @@ static void rxrpc_destroy_local(struct work_struct *work)
ASSERT
(
list_empty
(
&
local
->
services
));
ASSERT
(
!
work_pending
(
&
local
->
acceptor
));
ASSERT
(
!
work_pending
(
&
local
->
rejecter
));
ASSERT
(
!
work_pending
(
&
local
->
event_processor
));
/* finish cleaning up the local descriptor */
rxrpc_purge_queue
(
&
local
->
accept_queue
);
rxrpc_purge_queue
(
&
local
->
reject_queue
);
rxrpc_purge_queue
(
&
local
->
event_queue
);
kernel_sock_shutdown
(
local
->
socket
,
SHUT_RDWR
);
sock_release
(
local
->
socket
);
...
...
@@ -308,3 +318,91 @@ void __exit rxrpc_destroy_all_locals(void)
_leave
(
""
);
}
/*
* Reply to a version request
*/
static
void
rxrpc_send_version_request
(
struct
rxrpc_local
*
local
,
struct
rxrpc_header
*
hdr
,
struct
sk_buff
*
skb
)
{
struct
sockaddr_in
sin
;
struct
msghdr
msg
;
struct
kvec
iov
[
2
];
size_t
len
;
int
ret
;
_enter
(
""
);
sin
.
sin_family
=
AF_INET
;
sin
.
sin_port
=
udp_hdr
(
skb
)
->
source
;
sin
.
sin_addr
.
s_addr
=
ip_hdr
(
skb
)
->
saddr
;
msg
.
msg_name
=
&
sin
;
msg
.
msg_namelen
=
sizeof
(
sin
);
msg
.
msg_control
=
NULL
;
msg
.
msg_controllen
=
0
;
msg
.
msg_flags
=
0
;
hdr
->
seq
=
0
;
hdr
->
serial
=
0
;
hdr
->
type
=
RXRPC_PACKET_TYPE_VERSION
;
hdr
->
flags
=
RXRPC_LAST_PACKET
|
(
~
hdr
->
flags
&
RXRPC_CLIENT_INITIATED
);
hdr
->
userStatus
=
0
;
hdr
->
_rsvd
=
0
;
iov
[
0
].
iov_base
=
hdr
;
iov
[
0
].
iov_len
=
sizeof
(
*
hdr
);
iov
[
1
].
iov_base
=
(
char
*
)
rxrpc_version_string
;
iov
[
1
].
iov_len
=
sizeof
(
rxrpc_version_string
);
len
=
iov
[
0
].
iov_len
+
iov
[
1
].
iov_len
;
_proto
(
"Tx VERSION (reply)"
);
ret
=
kernel_sendmsg
(
local
->
socket
,
&
msg
,
iov
,
2
,
len
);
if
(
ret
<
0
)
_debug
(
"sendmsg failed: %d"
,
ret
);
_leave
(
""
);
}
/*
* Process event packets targetted at a local endpoint.
*/
static
void
rxrpc_process_local_events
(
struct
work_struct
*
work
)
{
struct
rxrpc_local
*
local
=
container_of
(
work
,
struct
rxrpc_local
,
event_processor
);
struct
sk_buff
*
skb
;
char
v
;
_enter
(
""
);
atomic_inc
(
&
local
->
usage
);
while
((
skb
=
skb_dequeue
(
&
local
->
event_queue
)))
{
struct
rxrpc_skb_priv
*
sp
=
rxrpc_skb
(
skb
);
kdebug
(
"{%d},{%u}"
,
local
->
debug_id
,
sp
->
hdr
.
type
);
switch
(
sp
->
hdr
.
type
)
{
case
RXRPC_PACKET_TYPE_VERSION
:
if
(
skb_copy_bits
(
skb
,
0
,
&
v
,
1
)
<
0
)
return
;
_proto
(
"Rx VERSION { %02x }"
,
v
);
if
(
v
==
0
)
rxrpc_send_version_request
(
local
,
&
sp
->
hdr
,
skb
);
break
;
default:
/* Just ignore anything we don't understand */
break
;
}
rxrpc_put_local
(
local
);
rxrpc_free_skb
(
skb
);
}
rxrpc_put_local
(
local
);
_leave
(
""
);
}
net/rxrpc/ar-output.c
View file @
a2dd3793
...
...
@@ -542,11 +542,7 @@ static int rxrpc_send_data(struct rxrpc_sock *rx,
call
->
tx_pending
=
NULL
;
copied
=
0
;
if
(
len
>
iov_iter_count
(
&
msg
->
msg_iter
))
len
=
iov_iter_count
(
&
msg
->
msg_iter
);
while
(
len
)
{
int
copy
;
do
{
if
(
!
skb
)
{
size_t
size
,
chunk
,
max
,
space
;
...
...
@@ -568,8 +564,8 @@ static int rxrpc_send_data(struct rxrpc_sock *rx,
max
&=
~
(
call
->
conn
->
size_align
-
1UL
);
chunk
=
max
;
if
(
chunk
>
len
&&
!
more
)
chunk
=
len
;
if
(
chunk
>
iov_iter_count
(
&
msg
->
msg_iter
)
&&
!
more
)
chunk
=
iov_iter_count
(
&
msg
->
msg_iter
)
;
space
=
chunk
+
call
->
conn
->
size_align
;
space
&=
~
(
call
->
conn
->
size_align
-
1UL
);
...
...
@@ -612,23 +608,23 @@ static int rxrpc_send_data(struct rxrpc_sock *rx,
sp
=
rxrpc_skb
(
skb
);
/* append next segment of data to the current buffer */
copy
=
skb_tailroom
(
skb
);
ASSERTCMP
(
copy
,
>
,
0
);
if
(
copy
>
len
)
copy
=
len
;
if
(
copy
>
sp
->
remain
)
copy
=
sp
->
remain
;
_debug
(
"add"
);
ret
=
skb_add_data
(
skb
,
&
msg
->
msg_iter
,
copy
);
_debug
(
"added"
);
if
(
ret
<
0
)
goto
efault
;
sp
->
remain
-=
copy
;
skb
->
mark
+
=
copy
;
copied
+=
copy
;
len
-=
copy
;
if
(
iov_iter_count
(
&
msg
->
msg_iter
)
>
0
)
{
int
copy
=
skb_tailroom
(
skb
);
ASSERTCMP
(
copy
,
>
,
0
);
if
(
copy
>
iov_iter_count
(
&
msg
->
msg_iter
))
copy
=
iov_iter_count
(
&
msg
->
msg_iter
);
if
(
copy
>
sp
->
remain
)
copy
=
sp
->
remain
;
_debug
(
"add"
);
ret
=
skb_add_data
(
skb
,
&
msg
->
msg_iter
,
copy
);
_debug
(
"added"
);
if
(
ret
<
0
)
goto
efault
;
sp
->
remain
-
=
copy
;
skb
->
mark
+=
copy
;
copied
+=
copy
;
}
/* check for the far side aborting the call or a network error
* occurring */
...
...
@@ -636,7 +632,8 @@ static int rxrpc_send_data(struct rxrpc_sock *rx,
goto
call_aborted
;
/* add the packet to the send queue if it's now full */
if
(
sp
->
remain
<=
0
||
(
!
len
&&
!
more
))
{
if
(
sp
->
remain
<=
0
||
(
iov_iter_count
(
&
msg
->
msg_iter
)
==
0
&&
!
more
))
{
struct
rxrpc_connection
*
conn
=
call
->
conn
;
uint32_t
seq
;
size_t
pad
;
...
...
@@ -666,7 +663,7 @@ static int rxrpc_send_data(struct rxrpc_sock *rx,
sp
->
hdr
.
serviceId
=
conn
->
service_id
;
sp
->
hdr
.
flags
=
conn
->
out_clientflag
;
if
(
len
==
0
&&
!
more
)
if
(
iov_iter_count
(
&
msg
->
msg_iter
)
==
0
&&
!
more
)
sp
->
hdr
.
flags
|=
RXRPC_LAST_PACKET
;
else
if
(
CIRC_SPACE
(
call
->
acks_head
,
call
->
acks_tail
,
call
->
acks_winsz
)
>
1
)
...
...
@@ -682,10 +679,11 @@ static int rxrpc_send_data(struct rxrpc_sock *rx,
memcpy
(
skb
->
head
,
&
sp
->
hdr
,
sizeof
(
struct
rxrpc_header
));
rxrpc_queue_packet
(
call
,
skb
,
!
iov_iter_count
(
&
msg
->
msg_iter
)
&&
!
more
);
rxrpc_queue_packet
(
call
,
skb
,
iov_iter_count
(
&
msg
->
msg_iter
)
==
0
&&
!
more
);
skb
=
NULL
;
}
}
}
while
(
iov_iter_count
(
&
msg
->
msg_iter
)
>
0
);
success:
ret
=
copied
;
...
...
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