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
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