Skip to content

Commit 792438e

Browse files
committed
Merge tag 'rxrpc-rewrite-20160830-1' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs
David Howells says: ==================== rxrpc: Preparation for removal of use of skbs from AFS Here's a set of patches that prepare the way for the removal of the use of sk_buffs from fs/afs (they'll be entirely retained within net/rxrpc): (1) Fix a potential NULL-pointer deref in rxrpc_abort_calls(). (2) Condense all the terminal call state machine states to a single one plus supplementary info. (3) Add a trace point for rxrpc call usage debugging. (4) Cleanups and missing headers. (5) Provide a way for AFS to ask about a call's peer address without having an sk_buff to query. (6) Use call->peer directly rather than going via call->conn (which might be NULL). (7) Pass struct socket * to various rxrpc kernel interface functions so they can use that directly rather than getting it from the rxrpc_call struct. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents cf4d13f + 4de48af commit 792438e

File tree

23 files changed

+470
-270
lines changed

23 files changed

+470
-270
lines changed

Documentation/networking/rxrpc.txt

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -725,15 +725,18 @@ The kernel interface functions are as follows:
725725

726726
(*) End a client call.
727727

728-
void rxrpc_kernel_end_call(struct rxrpc_call *call);
728+
void rxrpc_kernel_end_call(struct socket *sock,
729+
struct rxrpc_call *call);
729730

730731
This is used to end a previously begun call. The user_call_ID is expunged
731732
from AF_RXRPC's knowledge and will not be seen again in association with
732733
the specified call.
733734

734735
(*) Send data through a call.
735736

736-
int rxrpc_kernel_send_data(struct rxrpc_call *call, struct msghdr *msg,
737+
int rxrpc_kernel_send_data(struct socket *sock,
738+
struct rxrpc_call *call,
739+
struct msghdr *msg,
737740
size_t len);
738741

739742
This is used to supply either the request part of a client call or the
@@ -747,7 +750,9 @@ The kernel interface functions are as follows:
747750

748751
(*) Abort a call.
749752

750-
void rxrpc_kernel_abort_call(struct rxrpc_call *call, u32 abort_code);
753+
void rxrpc_kernel_abort_call(struct socket *sock,
754+
struct rxrpc_call *call,
755+
u32 abort_code);
751756

752757
This is used to abort a call if it's still in an abortable state. The
753758
abort code specified will be placed in the ABORT message sent.
@@ -868,6 +873,13 @@ The kernel interface functions are as follows:
868873
This is used to allocate a null RxRPC key that can be used to indicate
869874
anonymous security for a particular domain.
870875

876+
(*) Get the peer address of a call.
877+
878+
void rxrpc_kernel_get_peer(struct socket *sock, struct rxrpc_call *call,
879+
struct sockaddr_rxrpc *_srx);
880+
881+
This is used to find the remote peer address of a call.
882+
871883

872884
=======================
873885
CONFIGURABLE PARAMETERS

fs/afs/cmservice.c

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,6 @@
1717
#include "internal.h"
1818
#include "afs_cm.h"
1919

20-
#if 0
21-
struct workqueue_struct *afs_cm_workqueue;
22-
#endif /* 0 */
23-
2420
static int afs_deliver_cb_init_call_back_state(struct afs_call *,
2521
struct sk_buff *, bool);
2622
static int afs_deliver_cb_init_call_back_state3(struct afs_call *,
@@ -171,9 +167,9 @@ static void SRXAFSCB_CallBack(struct work_struct *work)
171167
static int afs_deliver_cb_callback(struct afs_call *call, struct sk_buff *skb,
172168
bool last)
173169
{
170+
struct sockaddr_rxrpc srx;
174171
struct afs_callback *cb;
175172
struct afs_server *server;
176-
struct in_addr addr;
177173
__be32 *bp;
178174
u32 tmp;
179175
int ret, loop;
@@ -182,6 +178,7 @@ static int afs_deliver_cb_callback(struct afs_call *call, struct sk_buff *skb,
182178

183179
switch (call->unmarshall) {
184180
case 0:
181+
rxrpc_kernel_get_peer(afs_socket, call->rxcall, &srx);
185182
call->offset = 0;
186183
call->unmarshall++;
187184

@@ -282,13 +279,11 @@ static int afs_deliver_cb_callback(struct afs_call *call, struct sk_buff *skb,
282279
break;
283280
}
284281

285-
286282
call->state = AFS_CALL_REPLYING;
287283

288284
/* we'll need the file server record as that tells us which set of
289285
* vnodes to operate upon */
290-
memcpy(&addr, &ip_hdr(skb)->saddr, 4);
291-
server = afs_find_server(&addr);
286+
server = afs_find_server(&srx);
292287
if (!server)
293288
return -ENOTCONN;
294289
call->server = server;
@@ -319,12 +314,14 @@ static int afs_deliver_cb_init_call_back_state(struct afs_call *call,
319314
struct sk_buff *skb,
320315
bool last)
321316
{
317+
struct sockaddr_rxrpc srx;
322318
struct afs_server *server;
323-
struct in_addr addr;
324319
int ret;
325320

326321
_enter(",{%u},%d", skb->len, last);
327322

323+
rxrpc_kernel_get_peer(afs_socket, call->rxcall, &srx);
324+
328325
ret = afs_data_complete(call, skb, last);
329326
if (ret < 0)
330327
return ret;
@@ -334,8 +331,7 @@ static int afs_deliver_cb_init_call_back_state(struct afs_call *call,
334331

335332
/* we'll need the file server record as that tells us which set of
336333
* vnodes to operate upon */
337-
memcpy(&addr, &ip_hdr(skb)->saddr, 4);
338-
server = afs_find_server(&addr);
334+
server = afs_find_server(&srx);
339335
if (!server)
340336
return -ENOTCONN;
341337
call->server = server;
@@ -352,11 +348,13 @@ static int afs_deliver_cb_init_call_back_state3(struct afs_call *call,
352348
struct sk_buff *skb,
353349
bool last)
354350
{
351+
struct sockaddr_rxrpc srx;
355352
struct afs_server *server;
356-
struct in_addr addr;
357353

358354
_enter(",{%u},%d", skb->len, last);
359355

356+
rxrpc_kernel_get_peer(afs_socket, call->rxcall, &srx);
357+
360358
/* There are some arguments that we ignore */
361359
afs_data_consumed(call, skb);
362360
if (!last)
@@ -367,8 +365,7 @@ static int afs_deliver_cb_init_call_back_state3(struct afs_call *call,
367365

368366
/* we'll need the file server record as that tells us which set of
369367
* vnodes to operate upon */
370-
memcpy(&addr, &ip_hdr(skb)->saddr, 4);
371-
server = afs_find_server(&addr);
368+
server = afs_find_server(&srx);
372369
if (!server)
373370
return -ENOTCONN;
374371
call->server = server;
@@ -426,7 +423,6 @@ static void SRXAFSCB_ProbeUuid(struct work_struct *work)
426423

427424
_enter("");
428425

429-
430426
if (memcmp(r, &afs_uuid, sizeof(afs_uuid)) == 0)
431427
reply.match = htonl(0);
432428
else

fs/afs/internal.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include <linux/sched.h>
2121
#include <linux/fscache.h>
2222
#include <linux/backing-dev.h>
23+
#include <net/af_rxrpc.h>
2324

2425
#include "afs.h"
2526
#include "afs_vl.h"
@@ -607,6 +608,8 @@ extern void afs_proc_cell_remove(struct afs_cell *);
607608
/*
608609
* rxrpc.c
609610
*/
611+
extern struct socket *afs_socket;
612+
610613
extern int afs_open_socket(void);
611614
extern void afs_close_socket(void);
612615
extern void afs_data_consumed(struct afs_call *, struct sk_buff *);
@@ -654,7 +657,7 @@ do { \
654657

655658
extern struct afs_server *afs_lookup_server(struct afs_cell *,
656659
const struct in_addr *);
657-
extern struct afs_server *afs_find_server(const struct in_addr *);
660+
extern struct afs_server *afs_find_server(const struct sockaddr_rxrpc *);
658661
extern void afs_put_server(struct afs_server *);
659662
extern void __exit afs_purge_servers(void);
660663

fs/afs/main.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include <linux/init.h>
1515
#include <linux/completion.h>
1616
#include <linux/sched.h>
17+
#include <linux/random.h>
1718
#include "internal.h"
1819

1920
MODULE_DESCRIPTION("AFS Client File System");

fs/afs/rxrpc.c

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
#include "internal.h"
1717
#include "afs_cm.h"
1818

19-
static struct socket *afs_socket; /* my RxRPC socket */
19+
struct socket *afs_socket; /* my RxRPC socket */
2020
static struct workqueue_struct *afs_async_calls;
2121
static atomic_t afs_outstanding_calls;
2222
static atomic_t afs_outstanding_skbs;
@@ -207,7 +207,7 @@ static void afs_free_call(struct afs_call *call)
207207
static void afs_end_call_nofree(struct afs_call *call)
208208
{
209209
if (call->rxcall) {
210-
rxrpc_kernel_end_call(call->rxcall);
210+
rxrpc_kernel_end_call(afs_socket, call->rxcall);
211211
call->rxcall = NULL;
212212
}
213213
if (call->type->destructor)
@@ -325,8 +325,8 @@ static int afs_send_pages(struct afs_call *call, struct msghdr *msg,
325325
* returns from sending the request */
326326
if (first + loop >= last)
327327
call->state = AFS_CALL_AWAIT_REPLY;
328-
ret = rxrpc_kernel_send_data(call->rxcall, msg,
329-
to - offset);
328+
ret = rxrpc_kernel_send_data(afs_socket, call->rxcall,
329+
msg, to - offset);
330330
kunmap(pages[loop]);
331331
if (ret < 0)
332332
break;
@@ -406,7 +406,8 @@ int afs_make_call(struct in_addr *addr, struct afs_call *call, gfp_t gfp,
406406
* request */
407407
if (!call->send_pages)
408408
call->state = AFS_CALL_AWAIT_REPLY;
409-
ret = rxrpc_kernel_send_data(rxcall, &msg, call->request_size);
409+
ret = rxrpc_kernel_send_data(afs_socket, rxcall,
410+
&msg, call->request_size);
410411
if (ret < 0)
411412
goto error_do_abort;
412413

@@ -421,7 +422,7 @@ int afs_make_call(struct in_addr *addr, struct afs_call *call, gfp_t gfp,
421422
return wait_mode->wait(call);
422423

423424
error_do_abort:
424-
rxrpc_kernel_abort_call(rxcall, RX_USER_ABORT);
425+
rxrpc_kernel_abort_call(afs_socket, rxcall, RX_USER_ABORT);
425426
while ((skb = skb_dequeue(&call->rx_queue)))
426427
afs_free_skb(skb);
427428
error_kill_call:
@@ -509,7 +510,8 @@ static void afs_deliver_to_call(struct afs_call *call)
509510
if (call->state != AFS_CALL_AWAIT_REPLY)
510511
abort_code = RXGEN_SS_UNMARSHAL;
511512
do_abort:
512-
rxrpc_kernel_abort_call(call->rxcall,
513+
rxrpc_kernel_abort_call(afs_socket,
514+
call->rxcall,
513515
abort_code);
514516
call->error = ret;
515517
call->state = AFS_CALL_ERROR;
@@ -605,7 +607,7 @@ static int afs_wait_for_call_to_complete(struct afs_call *call)
605607
/* kill the call */
606608
if (call->state < AFS_CALL_COMPLETE) {
607609
_debug("call incomplete");
608-
rxrpc_kernel_abort_call(call->rxcall, RX_CALL_DEAD);
610+
rxrpc_kernel_abort_call(afs_socket, call->rxcall, RX_CALL_DEAD);
609611
while ((skb = skb_dequeue(&call->rx_queue)))
610612
afs_free_skb(skb);
611613
}
@@ -823,14 +825,15 @@ void afs_send_empty_reply(struct afs_call *call)
823825
msg.msg_flags = 0;
824826

825827
call->state = AFS_CALL_AWAIT_ACK;
826-
switch (rxrpc_kernel_send_data(call->rxcall, &msg, 0)) {
828+
switch (rxrpc_kernel_send_data(afs_socket, call->rxcall, &msg, 0)) {
827829
case 0:
828830
_leave(" [replied]");
829831
return;
830832

831833
case -ENOMEM:
832834
_debug("oom");
833-
rxrpc_kernel_abort_call(call->rxcall, RX_USER_ABORT);
835+
rxrpc_kernel_abort_call(afs_socket, call->rxcall,
836+
RX_USER_ABORT);
834837
default:
835838
afs_end_call(call);
836839
_leave(" [error]");
@@ -859,7 +862,7 @@ void afs_send_simple_reply(struct afs_call *call, const void *buf, size_t len)
859862
msg.msg_flags = 0;
860863

861864
call->state = AFS_CALL_AWAIT_ACK;
862-
n = rxrpc_kernel_send_data(call->rxcall, &msg, len);
865+
n = rxrpc_kernel_send_data(afs_socket, call->rxcall, &msg, len);
863866
if (n >= 0) {
864867
/* Success */
865868
_leave(" [replied]");
@@ -868,7 +871,8 @@ void afs_send_simple_reply(struct afs_call *call, const void *buf, size_t len)
868871

869872
if (n == -ENOMEM) {
870873
_debug("oom");
871-
rxrpc_kernel_abort_call(call->rxcall, RX_USER_ABORT);
874+
rxrpc_kernel_abort_call(afs_socket, call->rxcall,
875+
RX_USER_ABORT);
872876
}
873877
afs_end_call(call);
874878
_leave(" [error]");

fs/afs/server.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,13 +178,18 @@ struct afs_server *afs_lookup_server(struct afs_cell *cell,
178178
/*
179179
* look up a server by its IP address
180180
*/
181-
struct afs_server *afs_find_server(const struct in_addr *_addr)
181+
struct afs_server *afs_find_server(const struct sockaddr_rxrpc *srx)
182182
{
183183
struct afs_server *server = NULL;
184184
struct rb_node *p;
185-
struct in_addr addr = *_addr;
185+
struct in_addr addr = srx->transport.sin.sin_addr;
186186

187-
_enter("%pI4", &addr.s_addr);
187+
_enter("{%d,%pI4}", srx->transport.family, &addr.s_addr);
188+
189+
if (srx->transport.family != AF_INET) {
190+
WARN(true, "AFS does not yes support non-IPv4 addresses\n");
191+
return NULL;
192+
}
188193

189194
read_lock(&afs_servers_lock);
190195

include/net/af_rxrpc.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
#include <linux/skbuff.h>
1616
#include <linux/rxrpc.h>
1717

18+
struct key;
19+
struct sock;
20+
struct socket;
1821
struct rxrpc_call;
1922

2023
/*
@@ -39,15 +42,18 @@ struct rxrpc_call *rxrpc_kernel_begin_call(struct socket *,
3942
struct key *,
4043
unsigned long,
4144
gfp_t);
42-
int rxrpc_kernel_send_data(struct rxrpc_call *, struct msghdr *, size_t);
45+
int rxrpc_kernel_send_data(struct socket *, struct rxrpc_call *,
46+
struct msghdr *, size_t);
4347
void rxrpc_kernel_data_consumed(struct rxrpc_call *, struct sk_buff *);
44-
void rxrpc_kernel_abort_call(struct rxrpc_call *, u32);
45-
void rxrpc_kernel_end_call(struct rxrpc_call *);
48+
void rxrpc_kernel_abort_call(struct socket *, struct rxrpc_call *, u32);
49+
void rxrpc_kernel_end_call(struct socket *, struct rxrpc_call *);
4650
bool rxrpc_kernel_is_data_last(struct sk_buff *);
4751
u32 rxrpc_kernel_get_abort_code(struct sk_buff *);
4852
int rxrpc_kernel_get_error_number(struct sk_buff *);
4953
void rxrpc_kernel_free_skb(struct sk_buff *);
5054
struct rxrpc_call *rxrpc_kernel_accept_call(struct socket *, unsigned long);
5155
int rxrpc_kernel_reject_call(struct socket *);
56+
void rxrpc_kernel_get_peer(struct socket *, struct rxrpc_call *,
57+
struct sockaddr_rxrpc *);
5258

5359
#endif /* _NET_RXRPC_H */

include/trace/events/rxrpc.h

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,45 @@
1616

1717
#include <linux/tracepoint.h>
1818

19+
TRACE_EVENT(rxrpc_call,
20+
TP_PROTO(struct rxrpc_call *call, int op, int usage, int nskb,
21+
const void *where, const void *aux),
22+
23+
TP_ARGS(call, op, usage, nskb, where, aux),
24+
25+
TP_STRUCT__entry(
26+
__field(struct rxrpc_call *, call )
27+
__field(int, op )
28+
__field(int, usage )
29+
__field(int, nskb )
30+
__field(const void *, where )
31+
__field(const void *, aux )
32+
),
33+
34+
TP_fast_assign(
35+
__entry->call = call;
36+
__entry->op = op;
37+
__entry->usage = usage;
38+
__entry->nskb = nskb;
39+
__entry->where = where;
40+
__entry->aux = aux;
41+
),
42+
43+
TP_printk("c=%p %s u=%d s=%d p=%pSR a=%p",
44+
__entry->call,
45+
(__entry->op == 0 ? "NWc" :
46+
__entry->op == 1 ? "NWs" :
47+
__entry->op == 2 ? "SEE" :
48+
__entry->op == 3 ? "GET" :
49+
__entry->op == 4 ? "Gsb" :
50+
__entry->op == 5 ? "PUT" :
51+
"Psb"),
52+
__entry->usage,
53+
__entry->nskb,
54+
__entry->where,
55+
__entry->aux)
56+
);
57+
1958
TRACE_EVENT(rxrpc_skb,
2059
TP_PROTO(struct sk_buff *skb, int op, int usage, int mod_count,
2160
const void *where),

0 commit comments

Comments
 (0)