1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /* Maintain an RxRPC server socket to do AFS communications through
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
5*4882a593Smuzhiyun * Written by David Howells (dhowells@redhat.com)
6*4882a593Smuzhiyun */
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun #include <linux/slab.h>
9*4882a593Smuzhiyun #include <linux/sched/signal.h>
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun #include <net/sock.h>
12*4882a593Smuzhiyun #include <net/af_rxrpc.h>
13*4882a593Smuzhiyun #include "internal.h"
14*4882a593Smuzhiyun #include "afs_cm.h"
15*4882a593Smuzhiyun #include "protocol_yfs.h"
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun struct workqueue_struct *afs_async_calls;
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun static void afs_wake_up_call_waiter(struct sock *, struct rxrpc_call *, unsigned long);
20*4882a593Smuzhiyun static void afs_wake_up_async_call(struct sock *, struct rxrpc_call *, unsigned long);
21*4882a593Smuzhiyun static void afs_process_async_call(struct work_struct *);
22*4882a593Smuzhiyun static void afs_rx_new_call(struct sock *, struct rxrpc_call *, unsigned long);
23*4882a593Smuzhiyun static void afs_rx_discard_new_call(struct rxrpc_call *, unsigned long);
24*4882a593Smuzhiyun static int afs_deliver_cm_op_id(struct afs_call *);
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun /* asynchronous incoming call initial processing */
27*4882a593Smuzhiyun static const struct afs_call_type afs_RXCMxxxx = {
28*4882a593Smuzhiyun .name = "CB.xxxx",
29*4882a593Smuzhiyun .deliver = afs_deliver_cm_op_id,
30*4882a593Smuzhiyun };
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun /*
33*4882a593Smuzhiyun * open an RxRPC socket and bind it to be a server for callback notifications
34*4882a593Smuzhiyun * - the socket is left in blocking mode and non-blocking ops use MSG_DONTWAIT
35*4882a593Smuzhiyun */
afs_open_socket(struct afs_net * net)36*4882a593Smuzhiyun int afs_open_socket(struct afs_net *net)
37*4882a593Smuzhiyun {
38*4882a593Smuzhiyun struct sockaddr_rxrpc srx;
39*4882a593Smuzhiyun struct socket *socket;
40*4882a593Smuzhiyun int ret;
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun _enter("");
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun ret = sock_create_kern(net->net, AF_RXRPC, SOCK_DGRAM, PF_INET6, &socket);
45*4882a593Smuzhiyun if (ret < 0)
46*4882a593Smuzhiyun goto error_1;
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun socket->sk->sk_allocation = GFP_NOFS;
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun /* bind the callback manager's address to make this a server socket */
51*4882a593Smuzhiyun memset(&srx, 0, sizeof(srx));
52*4882a593Smuzhiyun srx.srx_family = AF_RXRPC;
53*4882a593Smuzhiyun srx.srx_service = CM_SERVICE;
54*4882a593Smuzhiyun srx.transport_type = SOCK_DGRAM;
55*4882a593Smuzhiyun srx.transport_len = sizeof(srx.transport.sin6);
56*4882a593Smuzhiyun srx.transport.sin6.sin6_family = AF_INET6;
57*4882a593Smuzhiyun srx.transport.sin6.sin6_port = htons(AFS_CM_PORT);
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun ret = rxrpc_sock_set_min_security_level(socket->sk,
60*4882a593Smuzhiyun RXRPC_SECURITY_ENCRYPT);
61*4882a593Smuzhiyun if (ret < 0)
62*4882a593Smuzhiyun goto error_2;
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun ret = kernel_bind(socket, (struct sockaddr *) &srx, sizeof(srx));
65*4882a593Smuzhiyun if (ret == -EADDRINUSE) {
66*4882a593Smuzhiyun srx.transport.sin6.sin6_port = 0;
67*4882a593Smuzhiyun ret = kernel_bind(socket, (struct sockaddr *) &srx, sizeof(srx));
68*4882a593Smuzhiyun }
69*4882a593Smuzhiyun if (ret < 0)
70*4882a593Smuzhiyun goto error_2;
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun srx.srx_service = YFS_CM_SERVICE;
73*4882a593Smuzhiyun ret = kernel_bind(socket, (struct sockaddr *) &srx, sizeof(srx));
74*4882a593Smuzhiyun if (ret < 0)
75*4882a593Smuzhiyun goto error_2;
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun /* Ideally, we'd turn on service upgrade here, but we can't because
78*4882a593Smuzhiyun * OpenAFS is buggy and leaks the userStatus field from packet to
79*4882a593Smuzhiyun * packet and between FS packets and CB packets - so if we try to do an
80*4882a593Smuzhiyun * upgrade on an FS packet, OpenAFS will leak that into the CB packet
81*4882a593Smuzhiyun * it sends back to us.
82*4882a593Smuzhiyun */
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun rxrpc_kernel_new_call_notification(socket, afs_rx_new_call,
85*4882a593Smuzhiyun afs_rx_discard_new_call);
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun ret = kernel_listen(socket, INT_MAX);
88*4882a593Smuzhiyun if (ret < 0)
89*4882a593Smuzhiyun goto error_2;
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun net->socket = socket;
92*4882a593Smuzhiyun afs_charge_preallocation(&net->charge_preallocation_work);
93*4882a593Smuzhiyun _leave(" = 0");
94*4882a593Smuzhiyun return 0;
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun error_2:
97*4882a593Smuzhiyun sock_release(socket);
98*4882a593Smuzhiyun error_1:
99*4882a593Smuzhiyun _leave(" = %d", ret);
100*4882a593Smuzhiyun return ret;
101*4882a593Smuzhiyun }
102*4882a593Smuzhiyun
103*4882a593Smuzhiyun /*
104*4882a593Smuzhiyun * close the RxRPC socket AFS was using
105*4882a593Smuzhiyun */
afs_close_socket(struct afs_net * net)106*4882a593Smuzhiyun void afs_close_socket(struct afs_net *net)
107*4882a593Smuzhiyun {
108*4882a593Smuzhiyun _enter("");
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun kernel_listen(net->socket, 0);
111*4882a593Smuzhiyun flush_workqueue(afs_async_calls);
112*4882a593Smuzhiyun
113*4882a593Smuzhiyun if (net->spare_incoming_call) {
114*4882a593Smuzhiyun afs_put_call(net->spare_incoming_call);
115*4882a593Smuzhiyun net->spare_incoming_call = NULL;
116*4882a593Smuzhiyun }
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun _debug("outstanding %u", atomic_read(&net->nr_outstanding_calls));
119*4882a593Smuzhiyun wait_var_event(&net->nr_outstanding_calls,
120*4882a593Smuzhiyun !atomic_read(&net->nr_outstanding_calls));
121*4882a593Smuzhiyun _debug("no outstanding calls");
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun kernel_sock_shutdown(net->socket, SHUT_RDWR);
124*4882a593Smuzhiyun flush_workqueue(afs_async_calls);
125*4882a593Smuzhiyun sock_release(net->socket);
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun _debug("dework");
128*4882a593Smuzhiyun _leave("");
129*4882a593Smuzhiyun }
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun /*
132*4882a593Smuzhiyun * Allocate a call.
133*4882a593Smuzhiyun */
afs_alloc_call(struct afs_net * net,const struct afs_call_type * type,gfp_t gfp)134*4882a593Smuzhiyun static struct afs_call *afs_alloc_call(struct afs_net *net,
135*4882a593Smuzhiyun const struct afs_call_type *type,
136*4882a593Smuzhiyun gfp_t gfp)
137*4882a593Smuzhiyun {
138*4882a593Smuzhiyun struct afs_call *call;
139*4882a593Smuzhiyun int o;
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun call = kzalloc(sizeof(*call), gfp);
142*4882a593Smuzhiyun if (!call)
143*4882a593Smuzhiyun return NULL;
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun call->type = type;
146*4882a593Smuzhiyun call->net = net;
147*4882a593Smuzhiyun call->debug_id = atomic_inc_return(&rxrpc_debug_id);
148*4882a593Smuzhiyun atomic_set(&call->usage, 1);
149*4882a593Smuzhiyun INIT_WORK(&call->async_work, afs_process_async_call);
150*4882a593Smuzhiyun init_waitqueue_head(&call->waitq);
151*4882a593Smuzhiyun spin_lock_init(&call->state_lock);
152*4882a593Smuzhiyun call->iter = &call->def_iter;
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun o = atomic_inc_return(&net->nr_outstanding_calls);
155*4882a593Smuzhiyun trace_afs_call(call, afs_call_trace_alloc, 1, o,
156*4882a593Smuzhiyun __builtin_return_address(0));
157*4882a593Smuzhiyun return call;
158*4882a593Smuzhiyun }
159*4882a593Smuzhiyun
160*4882a593Smuzhiyun /*
161*4882a593Smuzhiyun * Dispose of a reference on a call.
162*4882a593Smuzhiyun */
afs_put_call(struct afs_call * call)163*4882a593Smuzhiyun void afs_put_call(struct afs_call *call)
164*4882a593Smuzhiyun {
165*4882a593Smuzhiyun struct afs_net *net = call->net;
166*4882a593Smuzhiyun int n = atomic_dec_return(&call->usage);
167*4882a593Smuzhiyun int o = atomic_read(&net->nr_outstanding_calls);
168*4882a593Smuzhiyun
169*4882a593Smuzhiyun trace_afs_call(call, afs_call_trace_put, n, o,
170*4882a593Smuzhiyun __builtin_return_address(0));
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun ASSERTCMP(n, >=, 0);
173*4882a593Smuzhiyun if (n == 0) {
174*4882a593Smuzhiyun ASSERT(!work_pending(&call->async_work));
175*4882a593Smuzhiyun ASSERT(call->type->name != NULL);
176*4882a593Smuzhiyun
177*4882a593Smuzhiyun if (call->rxcall) {
178*4882a593Smuzhiyun rxrpc_kernel_end_call(net->socket, call->rxcall);
179*4882a593Smuzhiyun call->rxcall = NULL;
180*4882a593Smuzhiyun }
181*4882a593Smuzhiyun if (call->type->destructor)
182*4882a593Smuzhiyun call->type->destructor(call);
183*4882a593Smuzhiyun
184*4882a593Smuzhiyun afs_unuse_server_notime(call->net, call->server, afs_server_trace_put_call);
185*4882a593Smuzhiyun afs_put_addrlist(call->alist);
186*4882a593Smuzhiyun kfree(call->request);
187*4882a593Smuzhiyun
188*4882a593Smuzhiyun trace_afs_call(call, afs_call_trace_free, 0, o,
189*4882a593Smuzhiyun __builtin_return_address(0));
190*4882a593Smuzhiyun kfree(call);
191*4882a593Smuzhiyun
192*4882a593Smuzhiyun o = atomic_dec_return(&net->nr_outstanding_calls);
193*4882a593Smuzhiyun if (o == 0)
194*4882a593Smuzhiyun wake_up_var(&net->nr_outstanding_calls);
195*4882a593Smuzhiyun }
196*4882a593Smuzhiyun }
197*4882a593Smuzhiyun
afs_get_call(struct afs_call * call,enum afs_call_trace why)198*4882a593Smuzhiyun static struct afs_call *afs_get_call(struct afs_call *call,
199*4882a593Smuzhiyun enum afs_call_trace why)
200*4882a593Smuzhiyun {
201*4882a593Smuzhiyun int u = atomic_inc_return(&call->usage);
202*4882a593Smuzhiyun
203*4882a593Smuzhiyun trace_afs_call(call, why, u,
204*4882a593Smuzhiyun atomic_read(&call->net->nr_outstanding_calls),
205*4882a593Smuzhiyun __builtin_return_address(0));
206*4882a593Smuzhiyun return call;
207*4882a593Smuzhiyun }
208*4882a593Smuzhiyun
209*4882a593Smuzhiyun /*
210*4882a593Smuzhiyun * Queue the call for actual work.
211*4882a593Smuzhiyun */
afs_queue_call_work(struct afs_call * call)212*4882a593Smuzhiyun static void afs_queue_call_work(struct afs_call *call)
213*4882a593Smuzhiyun {
214*4882a593Smuzhiyun if (call->type->work) {
215*4882a593Smuzhiyun INIT_WORK(&call->work, call->type->work);
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun afs_get_call(call, afs_call_trace_work);
218*4882a593Smuzhiyun if (!queue_work(afs_wq, &call->work))
219*4882a593Smuzhiyun afs_put_call(call);
220*4882a593Smuzhiyun }
221*4882a593Smuzhiyun }
222*4882a593Smuzhiyun
223*4882a593Smuzhiyun /*
224*4882a593Smuzhiyun * allocate a call with flat request and reply buffers
225*4882a593Smuzhiyun */
afs_alloc_flat_call(struct afs_net * net,const struct afs_call_type * type,size_t request_size,size_t reply_max)226*4882a593Smuzhiyun struct afs_call *afs_alloc_flat_call(struct afs_net *net,
227*4882a593Smuzhiyun const struct afs_call_type *type,
228*4882a593Smuzhiyun size_t request_size, size_t reply_max)
229*4882a593Smuzhiyun {
230*4882a593Smuzhiyun struct afs_call *call;
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun call = afs_alloc_call(net, type, GFP_NOFS);
233*4882a593Smuzhiyun if (!call)
234*4882a593Smuzhiyun goto nomem_call;
235*4882a593Smuzhiyun
236*4882a593Smuzhiyun if (request_size) {
237*4882a593Smuzhiyun call->request_size = request_size;
238*4882a593Smuzhiyun call->request = kmalloc(request_size, GFP_NOFS);
239*4882a593Smuzhiyun if (!call->request)
240*4882a593Smuzhiyun goto nomem_free;
241*4882a593Smuzhiyun }
242*4882a593Smuzhiyun
243*4882a593Smuzhiyun if (reply_max) {
244*4882a593Smuzhiyun call->reply_max = reply_max;
245*4882a593Smuzhiyun call->buffer = kmalloc(reply_max, GFP_NOFS);
246*4882a593Smuzhiyun if (!call->buffer)
247*4882a593Smuzhiyun goto nomem_free;
248*4882a593Smuzhiyun }
249*4882a593Smuzhiyun
250*4882a593Smuzhiyun afs_extract_to_buf(call, call->reply_max);
251*4882a593Smuzhiyun call->operation_ID = type->op;
252*4882a593Smuzhiyun init_waitqueue_head(&call->waitq);
253*4882a593Smuzhiyun return call;
254*4882a593Smuzhiyun
255*4882a593Smuzhiyun nomem_free:
256*4882a593Smuzhiyun afs_put_call(call);
257*4882a593Smuzhiyun nomem_call:
258*4882a593Smuzhiyun return NULL;
259*4882a593Smuzhiyun }
260*4882a593Smuzhiyun
261*4882a593Smuzhiyun /*
262*4882a593Smuzhiyun * clean up a call with flat buffer
263*4882a593Smuzhiyun */
afs_flat_call_destructor(struct afs_call * call)264*4882a593Smuzhiyun void afs_flat_call_destructor(struct afs_call *call)
265*4882a593Smuzhiyun {
266*4882a593Smuzhiyun _enter("");
267*4882a593Smuzhiyun
268*4882a593Smuzhiyun kfree(call->request);
269*4882a593Smuzhiyun call->request = NULL;
270*4882a593Smuzhiyun kfree(call->buffer);
271*4882a593Smuzhiyun call->buffer = NULL;
272*4882a593Smuzhiyun }
273*4882a593Smuzhiyun
274*4882a593Smuzhiyun #define AFS_BVEC_MAX 8
275*4882a593Smuzhiyun
276*4882a593Smuzhiyun /*
277*4882a593Smuzhiyun * Load the given bvec with the next few pages.
278*4882a593Smuzhiyun */
afs_load_bvec(struct afs_call * call,struct msghdr * msg,struct bio_vec * bv,pgoff_t first,pgoff_t last,unsigned offset)279*4882a593Smuzhiyun static void afs_load_bvec(struct afs_call *call, struct msghdr *msg,
280*4882a593Smuzhiyun struct bio_vec *bv, pgoff_t first, pgoff_t last,
281*4882a593Smuzhiyun unsigned offset)
282*4882a593Smuzhiyun {
283*4882a593Smuzhiyun struct afs_operation *op = call->op;
284*4882a593Smuzhiyun struct page *pages[AFS_BVEC_MAX];
285*4882a593Smuzhiyun unsigned int nr, n, i, to, bytes = 0;
286*4882a593Smuzhiyun
287*4882a593Smuzhiyun nr = min_t(pgoff_t, last - first + 1, AFS_BVEC_MAX);
288*4882a593Smuzhiyun n = find_get_pages_contig(op->store.mapping, first, nr, pages);
289*4882a593Smuzhiyun ASSERTCMP(n, ==, nr);
290*4882a593Smuzhiyun
291*4882a593Smuzhiyun msg->msg_flags |= MSG_MORE;
292*4882a593Smuzhiyun for (i = 0; i < nr; i++) {
293*4882a593Smuzhiyun to = PAGE_SIZE;
294*4882a593Smuzhiyun if (first + i >= last) {
295*4882a593Smuzhiyun to = op->store.last_to;
296*4882a593Smuzhiyun msg->msg_flags &= ~MSG_MORE;
297*4882a593Smuzhiyun }
298*4882a593Smuzhiyun bv[i].bv_page = pages[i];
299*4882a593Smuzhiyun bv[i].bv_len = to - offset;
300*4882a593Smuzhiyun bv[i].bv_offset = offset;
301*4882a593Smuzhiyun bytes += to - offset;
302*4882a593Smuzhiyun offset = 0;
303*4882a593Smuzhiyun }
304*4882a593Smuzhiyun
305*4882a593Smuzhiyun iov_iter_bvec(&msg->msg_iter, WRITE, bv, nr, bytes);
306*4882a593Smuzhiyun }
307*4882a593Smuzhiyun
308*4882a593Smuzhiyun /*
309*4882a593Smuzhiyun * Advance the AFS call state when the RxRPC call ends the transmit phase.
310*4882a593Smuzhiyun */
afs_notify_end_request_tx(struct sock * sock,struct rxrpc_call * rxcall,unsigned long call_user_ID)311*4882a593Smuzhiyun static void afs_notify_end_request_tx(struct sock *sock,
312*4882a593Smuzhiyun struct rxrpc_call *rxcall,
313*4882a593Smuzhiyun unsigned long call_user_ID)
314*4882a593Smuzhiyun {
315*4882a593Smuzhiyun struct afs_call *call = (struct afs_call *)call_user_ID;
316*4882a593Smuzhiyun
317*4882a593Smuzhiyun afs_set_call_state(call, AFS_CALL_CL_REQUESTING, AFS_CALL_CL_AWAIT_REPLY);
318*4882a593Smuzhiyun }
319*4882a593Smuzhiyun
320*4882a593Smuzhiyun /*
321*4882a593Smuzhiyun * attach the data from a bunch of pages on an inode to a call
322*4882a593Smuzhiyun */
afs_send_pages(struct afs_call * call,struct msghdr * msg)323*4882a593Smuzhiyun static int afs_send_pages(struct afs_call *call, struct msghdr *msg)
324*4882a593Smuzhiyun {
325*4882a593Smuzhiyun struct afs_operation *op = call->op;
326*4882a593Smuzhiyun struct bio_vec bv[AFS_BVEC_MAX];
327*4882a593Smuzhiyun unsigned int bytes, nr, loop, offset;
328*4882a593Smuzhiyun pgoff_t first = op->store.first, last = op->store.last;
329*4882a593Smuzhiyun int ret;
330*4882a593Smuzhiyun
331*4882a593Smuzhiyun offset = op->store.first_offset;
332*4882a593Smuzhiyun op->store.first_offset = 0;
333*4882a593Smuzhiyun
334*4882a593Smuzhiyun do {
335*4882a593Smuzhiyun afs_load_bvec(call, msg, bv, first, last, offset);
336*4882a593Smuzhiyun trace_afs_send_pages(call, msg, first, last, offset);
337*4882a593Smuzhiyun
338*4882a593Smuzhiyun offset = 0;
339*4882a593Smuzhiyun bytes = msg->msg_iter.count;
340*4882a593Smuzhiyun nr = msg->msg_iter.nr_segs;
341*4882a593Smuzhiyun
342*4882a593Smuzhiyun ret = rxrpc_kernel_send_data(op->net->socket, call->rxcall, msg,
343*4882a593Smuzhiyun bytes, afs_notify_end_request_tx);
344*4882a593Smuzhiyun for (loop = 0; loop < nr; loop++)
345*4882a593Smuzhiyun put_page(bv[loop].bv_page);
346*4882a593Smuzhiyun if (ret < 0)
347*4882a593Smuzhiyun break;
348*4882a593Smuzhiyun
349*4882a593Smuzhiyun first += nr;
350*4882a593Smuzhiyun } while (first <= last);
351*4882a593Smuzhiyun
352*4882a593Smuzhiyun trace_afs_sent_pages(call, op->store.first, last, first, ret);
353*4882a593Smuzhiyun return ret;
354*4882a593Smuzhiyun }
355*4882a593Smuzhiyun
356*4882a593Smuzhiyun /*
357*4882a593Smuzhiyun * Initiate a call and synchronously queue up the parameters for dispatch. Any
358*4882a593Smuzhiyun * error is stored into the call struct, which the caller must check for.
359*4882a593Smuzhiyun */
afs_make_call(struct afs_addr_cursor * ac,struct afs_call * call,gfp_t gfp)360*4882a593Smuzhiyun void afs_make_call(struct afs_addr_cursor *ac, struct afs_call *call, gfp_t gfp)
361*4882a593Smuzhiyun {
362*4882a593Smuzhiyun struct sockaddr_rxrpc *srx = &ac->alist->addrs[ac->index];
363*4882a593Smuzhiyun struct rxrpc_call *rxcall;
364*4882a593Smuzhiyun struct msghdr msg;
365*4882a593Smuzhiyun struct kvec iov[1];
366*4882a593Smuzhiyun s64 tx_total_len;
367*4882a593Smuzhiyun int ret;
368*4882a593Smuzhiyun
369*4882a593Smuzhiyun _enter(",{%pISp},", &srx->transport);
370*4882a593Smuzhiyun
371*4882a593Smuzhiyun ASSERT(call->type != NULL);
372*4882a593Smuzhiyun ASSERT(call->type->name != NULL);
373*4882a593Smuzhiyun
374*4882a593Smuzhiyun _debug("____MAKE %p{%s,%x} [%d]____",
375*4882a593Smuzhiyun call, call->type->name, key_serial(call->key),
376*4882a593Smuzhiyun atomic_read(&call->net->nr_outstanding_calls));
377*4882a593Smuzhiyun
378*4882a593Smuzhiyun call->addr_ix = ac->index;
379*4882a593Smuzhiyun call->alist = afs_get_addrlist(ac->alist);
380*4882a593Smuzhiyun
381*4882a593Smuzhiyun /* Work out the length we're going to transmit. This is awkward for
382*4882a593Smuzhiyun * calls such as FS.StoreData where there's an extra injection of data
383*4882a593Smuzhiyun * after the initial fixed part.
384*4882a593Smuzhiyun */
385*4882a593Smuzhiyun tx_total_len = call->request_size;
386*4882a593Smuzhiyun if (call->send_pages) {
387*4882a593Smuzhiyun struct afs_operation *op = call->op;
388*4882a593Smuzhiyun
389*4882a593Smuzhiyun if (op->store.last == op->store.first) {
390*4882a593Smuzhiyun tx_total_len += op->store.last_to - op->store.first_offset;
391*4882a593Smuzhiyun } else {
392*4882a593Smuzhiyun /* It looks mathematically like you should be able to
393*4882a593Smuzhiyun * combine the following lines with the ones above, but
394*4882a593Smuzhiyun * unsigned arithmetic is fun when it wraps...
395*4882a593Smuzhiyun */
396*4882a593Smuzhiyun tx_total_len += PAGE_SIZE - op->store.first_offset;
397*4882a593Smuzhiyun tx_total_len += op->store.last_to;
398*4882a593Smuzhiyun tx_total_len += (op->store.last - op->store.first - 1) * PAGE_SIZE;
399*4882a593Smuzhiyun }
400*4882a593Smuzhiyun }
401*4882a593Smuzhiyun
402*4882a593Smuzhiyun /* If the call is going to be asynchronous, we need an extra ref for
403*4882a593Smuzhiyun * the call to hold itself so the caller need not hang on to its ref.
404*4882a593Smuzhiyun */
405*4882a593Smuzhiyun if (call->async) {
406*4882a593Smuzhiyun afs_get_call(call, afs_call_trace_get);
407*4882a593Smuzhiyun call->drop_ref = true;
408*4882a593Smuzhiyun }
409*4882a593Smuzhiyun
410*4882a593Smuzhiyun /* create a call */
411*4882a593Smuzhiyun rxcall = rxrpc_kernel_begin_call(call->net->socket, srx, call->key,
412*4882a593Smuzhiyun (unsigned long)call,
413*4882a593Smuzhiyun tx_total_len, gfp,
414*4882a593Smuzhiyun (call->async ?
415*4882a593Smuzhiyun afs_wake_up_async_call :
416*4882a593Smuzhiyun afs_wake_up_call_waiter),
417*4882a593Smuzhiyun call->upgrade,
418*4882a593Smuzhiyun (call->intr ? RXRPC_PREINTERRUPTIBLE :
419*4882a593Smuzhiyun RXRPC_UNINTERRUPTIBLE),
420*4882a593Smuzhiyun call->debug_id);
421*4882a593Smuzhiyun if (IS_ERR(rxcall)) {
422*4882a593Smuzhiyun ret = PTR_ERR(rxcall);
423*4882a593Smuzhiyun call->error = ret;
424*4882a593Smuzhiyun goto error_kill_call;
425*4882a593Smuzhiyun }
426*4882a593Smuzhiyun
427*4882a593Smuzhiyun call->rxcall = rxcall;
428*4882a593Smuzhiyun
429*4882a593Smuzhiyun if (call->max_lifespan)
430*4882a593Smuzhiyun rxrpc_kernel_set_max_life(call->net->socket, rxcall,
431*4882a593Smuzhiyun call->max_lifespan);
432*4882a593Smuzhiyun call->issue_time = ktime_get_real();
433*4882a593Smuzhiyun
434*4882a593Smuzhiyun /* send the request */
435*4882a593Smuzhiyun iov[0].iov_base = call->request;
436*4882a593Smuzhiyun iov[0].iov_len = call->request_size;
437*4882a593Smuzhiyun
438*4882a593Smuzhiyun msg.msg_name = NULL;
439*4882a593Smuzhiyun msg.msg_namelen = 0;
440*4882a593Smuzhiyun iov_iter_kvec(&msg.msg_iter, WRITE, iov, 1, call->request_size);
441*4882a593Smuzhiyun msg.msg_control = NULL;
442*4882a593Smuzhiyun msg.msg_controllen = 0;
443*4882a593Smuzhiyun msg.msg_flags = MSG_WAITALL | (call->send_pages ? MSG_MORE : 0);
444*4882a593Smuzhiyun
445*4882a593Smuzhiyun ret = rxrpc_kernel_send_data(call->net->socket, rxcall,
446*4882a593Smuzhiyun &msg, call->request_size,
447*4882a593Smuzhiyun afs_notify_end_request_tx);
448*4882a593Smuzhiyun if (ret < 0)
449*4882a593Smuzhiyun goto error_do_abort;
450*4882a593Smuzhiyun
451*4882a593Smuzhiyun if (call->send_pages) {
452*4882a593Smuzhiyun ret = afs_send_pages(call, &msg);
453*4882a593Smuzhiyun if (ret < 0)
454*4882a593Smuzhiyun goto error_do_abort;
455*4882a593Smuzhiyun }
456*4882a593Smuzhiyun
457*4882a593Smuzhiyun /* Note that at this point, we may have received the reply or an abort
458*4882a593Smuzhiyun * - and an asynchronous call may already have completed.
459*4882a593Smuzhiyun *
460*4882a593Smuzhiyun * afs_wait_for_call_to_complete(call, ac)
461*4882a593Smuzhiyun * must be called to synchronously clean up.
462*4882a593Smuzhiyun */
463*4882a593Smuzhiyun return;
464*4882a593Smuzhiyun
465*4882a593Smuzhiyun error_do_abort:
466*4882a593Smuzhiyun if (ret != -ECONNABORTED) {
467*4882a593Smuzhiyun rxrpc_kernel_abort_call(call->net->socket, rxcall,
468*4882a593Smuzhiyun RX_USER_ABORT, ret, "KSD");
469*4882a593Smuzhiyun } else {
470*4882a593Smuzhiyun iov_iter_kvec(&msg.msg_iter, READ, NULL, 0, 0);
471*4882a593Smuzhiyun rxrpc_kernel_recv_data(call->net->socket, rxcall,
472*4882a593Smuzhiyun &msg.msg_iter, false,
473*4882a593Smuzhiyun &call->abort_code, &call->service_id);
474*4882a593Smuzhiyun ac->abort_code = call->abort_code;
475*4882a593Smuzhiyun ac->responded = true;
476*4882a593Smuzhiyun }
477*4882a593Smuzhiyun call->error = ret;
478*4882a593Smuzhiyun trace_afs_call_done(call);
479*4882a593Smuzhiyun error_kill_call:
480*4882a593Smuzhiyun if (call->type->done)
481*4882a593Smuzhiyun call->type->done(call);
482*4882a593Smuzhiyun
483*4882a593Smuzhiyun /* We need to dispose of the extra ref we grabbed for an async call.
484*4882a593Smuzhiyun * The call, however, might be queued on afs_async_calls and we need to
485*4882a593Smuzhiyun * make sure we don't get any more notifications that might requeue it.
486*4882a593Smuzhiyun */
487*4882a593Smuzhiyun if (call->rxcall) {
488*4882a593Smuzhiyun rxrpc_kernel_end_call(call->net->socket, call->rxcall);
489*4882a593Smuzhiyun call->rxcall = NULL;
490*4882a593Smuzhiyun }
491*4882a593Smuzhiyun if (call->async) {
492*4882a593Smuzhiyun if (cancel_work_sync(&call->async_work))
493*4882a593Smuzhiyun afs_put_call(call);
494*4882a593Smuzhiyun afs_put_call(call);
495*4882a593Smuzhiyun }
496*4882a593Smuzhiyun
497*4882a593Smuzhiyun ac->error = ret;
498*4882a593Smuzhiyun call->state = AFS_CALL_COMPLETE;
499*4882a593Smuzhiyun _leave(" = %d", ret);
500*4882a593Smuzhiyun }
501*4882a593Smuzhiyun
502*4882a593Smuzhiyun /*
503*4882a593Smuzhiyun * deliver messages to a call
504*4882a593Smuzhiyun */
afs_deliver_to_call(struct afs_call * call)505*4882a593Smuzhiyun static void afs_deliver_to_call(struct afs_call *call)
506*4882a593Smuzhiyun {
507*4882a593Smuzhiyun enum afs_call_state state;
508*4882a593Smuzhiyun u32 abort_code, remote_abort = 0;
509*4882a593Smuzhiyun int ret;
510*4882a593Smuzhiyun
511*4882a593Smuzhiyun _enter("%s", call->type->name);
512*4882a593Smuzhiyun
513*4882a593Smuzhiyun while (state = READ_ONCE(call->state),
514*4882a593Smuzhiyun state == AFS_CALL_CL_AWAIT_REPLY ||
515*4882a593Smuzhiyun state == AFS_CALL_SV_AWAIT_OP_ID ||
516*4882a593Smuzhiyun state == AFS_CALL_SV_AWAIT_REQUEST ||
517*4882a593Smuzhiyun state == AFS_CALL_SV_AWAIT_ACK
518*4882a593Smuzhiyun ) {
519*4882a593Smuzhiyun if (state == AFS_CALL_SV_AWAIT_ACK) {
520*4882a593Smuzhiyun iov_iter_kvec(&call->def_iter, READ, NULL, 0, 0);
521*4882a593Smuzhiyun ret = rxrpc_kernel_recv_data(call->net->socket,
522*4882a593Smuzhiyun call->rxcall, &call->def_iter,
523*4882a593Smuzhiyun false, &remote_abort,
524*4882a593Smuzhiyun &call->service_id);
525*4882a593Smuzhiyun trace_afs_receive_data(call, &call->def_iter, false, ret);
526*4882a593Smuzhiyun
527*4882a593Smuzhiyun if (ret == -EINPROGRESS || ret == -EAGAIN)
528*4882a593Smuzhiyun return;
529*4882a593Smuzhiyun if (ret < 0 || ret == 1) {
530*4882a593Smuzhiyun if (ret == 1)
531*4882a593Smuzhiyun ret = 0;
532*4882a593Smuzhiyun goto call_complete;
533*4882a593Smuzhiyun }
534*4882a593Smuzhiyun return;
535*4882a593Smuzhiyun }
536*4882a593Smuzhiyun
537*4882a593Smuzhiyun ret = call->type->deliver(call);
538*4882a593Smuzhiyun state = READ_ONCE(call->state);
539*4882a593Smuzhiyun if (ret == 0 && call->unmarshalling_error)
540*4882a593Smuzhiyun ret = -EBADMSG;
541*4882a593Smuzhiyun switch (ret) {
542*4882a593Smuzhiyun case 0:
543*4882a593Smuzhiyun afs_queue_call_work(call);
544*4882a593Smuzhiyun if (state == AFS_CALL_CL_PROC_REPLY) {
545*4882a593Smuzhiyun if (call->op)
546*4882a593Smuzhiyun set_bit(AFS_SERVER_FL_MAY_HAVE_CB,
547*4882a593Smuzhiyun &call->op->server->flags);
548*4882a593Smuzhiyun goto call_complete;
549*4882a593Smuzhiyun }
550*4882a593Smuzhiyun ASSERTCMP(state, >, AFS_CALL_CL_PROC_REPLY);
551*4882a593Smuzhiyun goto done;
552*4882a593Smuzhiyun case -EINPROGRESS:
553*4882a593Smuzhiyun case -EAGAIN:
554*4882a593Smuzhiyun goto out;
555*4882a593Smuzhiyun case -ECONNABORTED:
556*4882a593Smuzhiyun ASSERTCMP(state, ==, AFS_CALL_COMPLETE);
557*4882a593Smuzhiyun goto done;
558*4882a593Smuzhiyun case -ENOTSUPP:
559*4882a593Smuzhiyun abort_code = RXGEN_OPCODE;
560*4882a593Smuzhiyun rxrpc_kernel_abort_call(call->net->socket, call->rxcall,
561*4882a593Smuzhiyun abort_code, ret, "KIV");
562*4882a593Smuzhiyun goto local_abort;
563*4882a593Smuzhiyun case -EIO:
564*4882a593Smuzhiyun pr_err("kAFS: Call %u in bad state %u\n",
565*4882a593Smuzhiyun call->debug_id, state);
566*4882a593Smuzhiyun fallthrough;
567*4882a593Smuzhiyun case -ENODATA:
568*4882a593Smuzhiyun case -EBADMSG:
569*4882a593Smuzhiyun case -EMSGSIZE:
570*4882a593Smuzhiyun case -ENOMEM:
571*4882a593Smuzhiyun case -EFAULT:
572*4882a593Smuzhiyun abort_code = RXGEN_CC_UNMARSHAL;
573*4882a593Smuzhiyun if (state != AFS_CALL_CL_AWAIT_REPLY)
574*4882a593Smuzhiyun abort_code = RXGEN_SS_UNMARSHAL;
575*4882a593Smuzhiyun rxrpc_kernel_abort_call(call->net->socket, call->rxcall,
576*4882a593Smuzhiyun abort_code, ret, "KUM");
577*4882a593Smuzhiyun goto local_abort;
578*4882a593Smuzhiyun default:
579*4882a593Smuzhiyun abort_code = RX_CALL_DEAD;
580*4882a593Smuzhiyun rxrpc_kernel_abort_call(call->net->socket, call->rxcall,
581*4882a593Smuzhiyun abort_code, ret, "KER");
582*4882a593Smuzhiyun goto local_abort;
583*4882a593Smuzhiyun }
584*4882a593Smuzhiyun }
585*4882a593Smuzhiyun
586*4882a593Smuzhiyun done:
587*4882a593Smuzhiyun if (call->type->done)
588*4882a593Smuzhiyun call->type->done(call);
589*4882a593Smuzhiyun out:
590*4882a593Smuzhiyun _leave("");
591*4882a593Smuzhiyun return;
592*4882a593Smuzhiyun
593*4882a593Smuzhiyun local_abort:
594*4882a593Smuzhiyun abort_code = 0;
595*4882a593Smuzhiyun call_complete:
596*4882a593Smuzhiyun afs_set_call_complete(call, ret, remote_abort);
597*4882a593Smuzhiyun state = AFS_CALL_COMPLETE;
598*4882a593Smuzhiyun goto done;
599*4882a593Smuzhiyun }
600*4882a593Smuzhiyun
601*4882a593Smuzhiyun /*
602*4882a593Smuzhiyun * Wait synchronously for a call to complete and clean up the call struct.
603*4882a593Smuzhiyun */
afs_wait_for_call_to_complete(struct afs_call * call,struct afs_addr_cursor * ac)604*4882a593Smuzhiyun long afs_wait_for_call_to_complete(struct afs_call *call,
605*4882a593Smuzhiyun struct afs_addr_cursor *ac)
606*4882a593Smuzhiyun {
607*4882a593Smuzhiyun long ret;
608*4882a593Smuzhiyun bool rxrpc_complete = false;
609*4882a593Smuzhiyun
610*4882a593Smuzhiyun DECLARE_WAITQUEUE(myself, current);
611*4882a593Smuzhiyun
612*4882a593Smuzhiyun _enter("");
613*4882a593Smuzhiyun
614*4882a593Smuzhiyun ret = call->error;
615*4882a593Smuzhiyun if (ret < 0)
616*4882a593Smuzhiyun goto out;
617*4882a593Smuzhiyun
618*4882a593Smuzhiyun add_wait_queue(&call->waitq, &myself);
619*4882a593Smuzhiyun for (;;) {
620*4882a593Smuzhiyun set_current_state(TASK_UNINTERRUPTIBLE);
621*4882a593Smuzhiyun
622*4882a593Smuzhiyun /* deliver any messages that are in the queue */
623*4882a593Smuzhiyun if (!afs_check_call_state(call, AFS_CALL_COMPLETE) &&
624*4882a593Smuzhiyun call->need_attention) {
625*4882a593Smuzhiyun call->need_attention = false;
626*4882a593Smuzhiyun __set_current_state(TASK_RUNNING);
627*4882a593Smuzhiyun afs_deliver_to_call(call);
628*4882a593Smuzhiyun continue;
629*4882a593Smuzhiyun }
630*4882a593Smuzhiyun
631*4882a593Smuzhiyun if (afs_check_call_state(call, AFS_CALL_COMPLETE))
632*4882a593Smuzhiyun break;
633*4882a593Smuzhiyun
634*4882a593Smuzhiyun if (!rxrpc_kernel_check_life(call->net->socket, call->rxcall)) {
635*4882a593Smuzhiyun /* rxrpc terminated the call. */
636*4882a593Smuzhiyun rxrpc_complete = true;
637*4882a593Smuzhiyun break;
638*4882a593Smuzhiyun }
639*4882a593Smuzhiyun
640*4882a593Smuzhiyun schedule();
641*4882a593Smuzhiyun }
642*4882a593Smuzhiyun
643*4882a593Smuzhiyun remove_wait_queue(&call->waitq, &myself);
644*4882a593Smuzhiyun __set_current_state(TASK_RUNNING);
645*4882a593Smuzhiyun
646*4882a593Smuzhiyun if (!afs_check_call_state(call, AFS_CALL_COMPLETE)) {
647*4882a593Smuzhiyun if (rxrpc_complete) {
648*4882a593Smuzhiyun afs_set_call_complete(call, call->error, call->abort_code);
649*4882a593Smuzhiyun } else {
650*4882a593Smuzhiyun /* Kill off the call if it's still live. */
651*4882a593Smuzhiyun _debug("call interrupted");
652*4882a593Smuzhiyun if (rxrpc_kernel_abort_call(call->net->socket, call->rxcall,
653*4882a593Smuzhiyun RX_USER_ABORT, -EINTR, "KWI"))
654*4882a593Smuzhiyun afs_set_call_complete(call, -EINTR, 0);
655*4882a593Smuzhiyun }
656*4882a593Smuzhiyun }
657*4882a593Smuzhiyun
658*4882a593Smuzhiyun spin_lock_bh(&call->state_lock);
659*4882a593Smuzhiyun ac->abort_code = call->abort_code;
660*4882a593Smuzhiyun ac->error = call->error;
661*4882a593Smuzhiyun spin_unlock_bh(&call->state_lock);
662*4882a593Smuzhiyun
663*4882a593Smuzhiyun ret = ac->error;
664*4882a593Smuzhiyun switch (ret) {
665*4882a593Smuzhiyun case 0:
666*4882a593Smuzhiyun ret = call->ret0;
667*4882a593Smuzhiyun call->ret0 = 0;
668*4882a593Smuzhiyun
669*4882a593Smuzhiyun fallthrough;
670*4882a593Smuzhiyun case -ECONNABORTED:
671*4882a593Smuzhiyun ac->responded = true;
672*4882a593Smuzhiyun break;
673*4882a593Smuzhiyun }
674*4882a593Smuzhiyun
675*4882a593Smuzhiyun out:
676*4882a593Smuzhiyun _debug("call complete");
677*4882a593Smuzhiyun afs_put_call(call);
678*4882a593Smuzhiyun _leave(" = %p", (void *)ret);
679*4882a593Smuzhiyun return ret;
680*4882a593Smuzhiyun }
681*4882a593Smuzhiyun
682*4882a593Smuzhiyun /*
683*4882a593Smuzhiyun * wake up a waiting call
684*4882a593Smuzhiyun */
afs_wake_up_call_waiter(struct sock * sk,struct rxrpc_call * rxcall,unsigned long call_user_ID)685*4882a593Smuzhiyun static void afs_wake_up_call_waiter(struct sock *sk, struct rxrpc_call *rxcall,
686*4882a593Smuzhiyun unsigned long call_user_ID)
687*4882a593Smuzhiyun {
688*4882a593Smuzhiyun struct afs_call *call = (struct afs_call *)call_user_ID;
689*4882a593Smuzhiyun
690*4882a593Smuzhiyun call->need_attention = true;
691*4882a593Smuzhiyun wake_up(&call->waitq);
692*4882a593Smuzhiyun }
693*4882a593Smuzhiyun
694*4882a593Smuzhiyun /*
695*4882a593Smuzhiyun * wake up an asynchronous call
696*4882a593Smuzhiyun */
afs_wake_up_async_call(struct sock * sk,struct rxrpc_call * rxcall,unsigned long call_user_ID)697*4882a593Smuzhiyun static void afs_wake_up_async_call(struct sock *sk, struct rxrpc_call *rxcall,
698*4882a593Smuzhiyun unsigned long call_user_ID)
699*4882a593Smuzhiyun {
700*4882a593Smuzhiyun struct afs_call *call = (struct afs_call *)call_user_ID;
701*4882a593Smuzhiyun int u;
702*4882a593Smuzhiyun
703*4882a593Smuzhiyun trace_afs_notify_call(rxcall, call);
704*4882a593Smuzhiyun call->need_attention = true;
705*4882a593Smuzhiyun
706*4882a593Smuzhiyun u = atomic_fetch_add_unless(&call->usage, 1, 0);
707*4882a593Smuzhiyun if (u != 0) {
708*4882a593Smuzhiyun trace_afs_call(call, afs_call_trace_wake, u + 1,
709*4882a593Smuzhiyun atomic_read(&call->net->nr_outstanding_calls),
710*4882a593Smuzhiyun __builtin_return_address(0));
711*4882a593Smuzhiyun
712*4882a593Smuzhiyun if (!queue_work(afs_async_calls, &call->async_work))
713*4882a593Smuzhiyun afs_put_call(call);
714*4882a593Smuzhiyun }
715*4882a593Smuzhiyun }
716*4882a593Smuzhiyun
717*4882a593Smuzhiyun /*
718*4882a593Smuzhiyun * Perform I/O processing on an asynchronous call. The work item carries a ref
719*4882a593Smuzhiyun * to the call struct that we either need to release or to pass on.
720*4882a593Smuzhiyun */
afs_process_async_call(struct work_struct * work)721*4882a593Smuzhiyun static void afs_process_async_call(struct work_struct *work)
722*4882a593Smuzhiyun {
723*4882a593Smuzhiyun struct afs_call *call = container_of(work, struct afs_call, async_work);
724*4882a593Smuzhiyun
725*4882a593Smuzhiyun _enter("");
726*4882a593Smuzhiyun
727*4882a593Smuzhiyun if (call->state < AFS_CALL_COMPLETE && call->need_attention) {
728*4882a593Smuzhiyun call->need_attention = false;
729*4882a593Smuzhiyun afs_deliver_to_call(call);
730*4882a593Smuzhiyun }
731*4882a593Smuzhiyun
732*4882a593Smuzhiyun afs_put_call(call);
733*4882a593Smuzhiyun _leave("");
734*4882a593Smuzhiyun }
735*4882a593Smuzhiyun
afs_rx_attach(struct rxrpc_call * rxcall,unsigned long user_call_ID)736*4882a593Smuzhiyun static void afs_rx_attach(struct rxrpc_call *rxcall, unsigned long user_call_ID)
737*4882a593Smuzhiyun {
738*4882a593Smuzhiyun struct afs_call *call = (struct afs_call *)user_call_ID;
739*4882a593Smuzhiyun
740*4882a593Smuzhiyun call->rxcall = rxcall;
741*4882a593Smuzhiyun }
742*4882a593Smuzhiyun
743*4882a593Smuzhiyun /*
744*4882a593Smuzhiyun * Charge the incoming call preallocation.
745*4882a593Smuzhiyun */
afs_charge_preallocation(struct work_struct * work)746*4882a593Smuzhiyun void afs_charge_preallocation(struct work_struct *work)
747*4882a593Smuzhiyun {
748*4882a593Smuzhiyun struct afs_net *net =
749*4882a593Smuzhiyun container_of(work, struct afs_net, charge_preallocation_work);
750*4882a593Smuzhiyun struct afs_call *call = net->spare_incoming_call;
751*4882a593Smuzhiyun
752*4882a593Smuzhiyun for (;;) {
753*4882a593Smuzhiyun if (!call) {
754*4882a593Smuzhiyun call = afs_alloc_call(net, &afs_RXCMxxxx, GFP_KERNEL);
755*4882a593Smuzhiyun if (!call)
756*4882a593Smuzhiyun break;
757*4882a593Smuzhiyun
758*4882a593Smuzhiyun call->drop_ref = true;
759*4882a593Smuzhiyun call->async = true;
760*4882a593Smuzhiyun call->state = AFS_CALL_SV_AWAIT_OP_ID;
761*4882a593Smuzhiyun init_waitqueue_head(&call->waitq);
762*4882a593Smuzhiyun afs_extract_to_tmp(call);
763*4882a593Smuzhiyun }
764*4882a593Smuzhiyun
765*4882a593Smuzhiyun if (rxrpc_kernel_charge_accept(net->socket,
766*4882a593Smuzhiyun afs_wake_up_async_call,
767*4882a593Smuzhiyun afs_rx_attach,
768*4882a593Smuzhiyun (unsigned long)call,
769*4882a593Smuzhiyun GFP_KERNEL,
770*4882a593Smuzhiyun call->debug_id) < 0)
771*4882a593Smuzhiyun break;
772*4882a593Smuzhiyun call = NULL;
773*4882a593Smuzhiyun }
774*4882a593Smuzhiyun net->spare_incoming_call = call;
775*4882a593Smuzhiyun }
776*4882a593Smuzhiyun
777*4882a593Smuzhiyun /*
778*4882a593Smuzhiyun * Discard a preallocated call when a socket is shut down.
779*4882a593Smuzhiyun */
afs_rx_discard_new_call(struct rxrpc_call * rxcall,unsigned long user_call_ID)780*4882a593Smuzhiyun static void afs_rx_discard_new_call(struct rxrpc_call *rxcall,
781*4882a593Smuzhiyun unsigned long user_call_ID)
782*4882a593Smuzhiyun {
783*4882a593Smuzhiyun struct afs_call *call = (struct afs_call *)user_call_ID;
784*4882a593Smuzhiyun
785*4882a593Smuzhiyun call->rxcall = NULL;
786*4882a593Smuzhiyun afs_put_call(call);
787*4882a593Smuzhiyun }
788*4882a593Smuzhiyun
789*4882a593Smuzhiyun /*
790*4882a593Smuzhiyun * Notification of an incoming call.
791*4882a593Smuzhiyun */
afs_rx_new_call(struct sock * sk,struct rxrpc_call * rxcall,unsigned long user_call_ID)792*4882a593Smuzhiyun static void afs_rx_new_call(struct sock *sk, struct rxrpc_call *rxcall,
793*4882a593Smuzhiyun unsigned long user_call_ID)
794*4882a593Smuzhiyun {
795*4882a593Smuzhiyun struct afs_net *net = afs_sock2net(sk);
796*4882a593Smuzhiyun
797*4882a593Smuzhiyun queue_work(afs_wq, &net->charge_preallocation_work);
798*4882a593Smuzhiyun }
799*4882a593Smuzhiyun
800*4882a593Smuzhiyun /*
801*4882a593Smuzhiyun * Grab the operation ID from an incoming cache manager call. The socket
802*4882a593Smuzhiyun * buffer is discarded on error or if we don't yet have sufficient data.
803*4882a593Smuzhiyun */
afs_deliver_cm_op_id(struct afs_call * call)804*4882a593Smuzhiyun static int afs_deliver_cm_op_id(struct afs_call *call)
805*4882a593Smuzhiyun {
806*4882a593Smuzhiyun int ret;
807*4882a593Smuzhiyun
808*4882a593Smuzhiyun _enter("{%zu}", iov_iter_count(call->iter));
809*4882a593Smuzhiyun
810*4882a593Smuzhiyun /* the operation ID forms the first four bytes of the request data */
811*4882a593Smuzhiyun ret = afs_extract_data(call, true);
812*4882a593Smuzhiyun if (ret < 0)
813*4882a593Smuzhiyun return ret;
814*4882a593Smuzhiyun
815*4882a593Smuzhiyun call->operation_ID = ntohl(call->tmp);
816*4882a593Smuzhiyun afs_set_call_state(call, AFS_CALL_SV_AWAIT_OP_ID, AFS_CALL_SV_AWAIT_REQUEST);
817*4882a593Smuzhiyun
818*4882a593Smuzhiyun /* ask the cache manager to route the call (it'll change the call type
819*4882a593Smuzhiyun * if successful) */
820*4882a593Smuzhiyun if (!afs_cm_incoming_call(call))
821*4882a593Smuzhiyun return -ENOTSUPP;
822*4882a593Smuzhiyun
823*4882a593Smuzhiyun trace_afs_cb_call(call);
824*4882a593Smuzhiyun
825*4882a593Smuzhiyun /* pass responsibility for the remainer of this message off to the
826*4882a593Smuzhiyun * cache manager op */
827*4882a593Smuzhiyun return call->type->deliver(call);
828*4882a593Smuzhiyun }
829*4882a593Smuzhiyun
830*4882a593Smuzhiyun /*
831*4882a593Smuzhiyun * Advance the AFS call state when an RxRPC service call ends the transmit
832*4882a593Smuzhiyun * phase.
833*4882a593Smuzhiyun */
afs_notify_end_reply_tx(struct sock * sock,struct rxrpc_call * rxcall,unsigned long call_user_ID)834*4882a593Smuzhiyun static void afs_notify_end_reply_tx(struct sock *sock,
835*4882a593Smuzhiyun struct rxrpc_call *rxcall,
836*4882a593Smuzhiyun unsigned long call_user_ID)
837*4882a593Smuzhiyun {
838*4882a593Smuzhiyun struct afs_call *call = (struct afs_call *)call_user_ID;
839*4882a593Smuzhiyun
840*4882a593Smuzhiyun afs_set_call_state(call, AFS_CALL_SV_REPLYING, AFS_CALL_SV_AWAIT_ACK);
841*4882a593Smuzhiyun }
842*4882a593Smuzhiyun
843*4882a593Smuzhiyun /*
844*4882a593Smuzhiyun * send an empty reply
845*4882a593Smuzhiyun */
afs_send_empty_reply(struct afs_call * call)846*4882a593Smuzhiyun void afs_send_empty_reply(struct afs_call *call)
847*4882a593Smuzhiyun {
848*4882a593Smuzhiyun struct afs_net *net = call->net;
849*4882a593Smuzhiyun struct msghdr msg;
850*4882a593Smuzhiyun
851*4882a593Smuzhiyun _enter("");
852*4882a593Smuzhiyun
853*4882a593Smuzhiyun rxrpc_kernel_set_tx_length(net->socket, call->rxcall, 0);
854*4882a593Smuzhiyun
855*4882a593Smuzhiyun msg.msg_name = NULL;
856*4882a593Smuzhiyun msg.msg_namelen = 0;
857*4882a593Smuzhiyun iov_iter_kvec(&msg.msg_iter, WRITE, NULL, 0, 0);
858*4882a593Smuzhiyun msg.msg_control = NULL;
859*4882a593Smuzhiyun msg.msg_controllen = 0;
860*4882a593Smuzhiyun msg.msg_flags = 0;
861*4882a593Smuzhiyun
862*4882a593Smuzhiyun switch (rxrpc_kernel_send_data(net->socket, call->rxcall, &msg, 0,
863*4882a593Smuzhiyun afs_notify_end_reply_tx)) {
864*4882a593Smuzhiyun case 0:
865*4882a593Smuzhiyun _leave(" [replied]");
866*4882a593Smuzhiyun return;
867*4882a593Smuzhiyun
868*4882a593Smuzhiyun case -ENOMEM:
869*4882a593Smuzhiyun _debug("oom");
870*4882a593Smuzhiyun rxrpc_kernel_abort_call(net->socket, call->rxcall,
871*4882a593Smuzhiyun RXGEN_SS_MARSHAL, -ENOMEM, "KOO");
872*4882a593Smuzhiyun fallthrough;
873*4882a593Smuzhiyun default:
874*4882a593Smuzhiyun _leave(" [error]");
875*4882a593Smuzhiyun return;
876*4882a593Smuzhiyun }
877*4882a593Smuzhiyun }
878*4882a593Smuzhiyun
879*4882a593Smuzhiyun /*
880*4882a593Smuzhiyun * send a simple reply
881*4882a593Smuzhiyun */
afs_send_simple_reply(struct afs_call * call,const void * buf,size_t len)882*4882a593Smuzhiyun void afs_send_simple_reply(struct afs_call *call, const void *buf, size_t len)
883*4882a593Smuzhiyun {
884*4882a593Smuzhiyun struct afs_net *net = call->net;
885*4882a593Smuzhiyun struct msghdr msg;
886*4882a593Smuzhiyun struct kvec iov[1];
887*4882a593Smuzhiyun int n;
888*4882a593Smuzhiyun
889*4882a593Smuzhiyun _enter("");
890*4882a593Smuzhiyun
891*4882a593Smuzhiyun rxrpc_kernel_set_tx_length(net->socket, call->rxcall, len);
892*4882a593Smuzhiyun
893*4882a593Smuzhiyun iov[0].iov_base = (void *) buf;
894*4882a593Smuzhiyun iov[0].iov_len = len;
895*4882a593Smuzhiyun msg.msg_name = NULL;
896*4882a593Smuzhiyun msg.msg_namelen = 0;
897*4882a593Smuzhiyun iov_iter_kvec(&msg.msg_iter, WRITE, iov, 1, len);
898*4882a593Smuzhiyun msg.msg_control = NULL;
899*4882a593Smuzhiyun msg.msg_controllen = 0;
900*4882a593Smuzhiyun msg.msg_flags = 0;
901*4882a593Smuzhiyun
902*4882a593Smuzhiyun n = rxrpc_kernel_send_data(net->socket, call->rxcall, &msg, len,
903*4882a593Smuzhiyun afs_notify_end_reply_tx);
904*4882a593Smuzhiyun if (n >= 0) {
905*4882a593Smuzhiyun /* Success */
906*4882a593Smuzhiyun _leave(" [replied]");
907*4882a593Smuzhiyun return;
908*4882a593Smuzhiyun }
909*4882a593Smuzhiyun
910*4882a593Smuzhiyun if (n == -ENOMEM) {
911*4882a593Smuzhiyun _debug("oom");
912*4882a593Smuzhiyun rxrpc_kernel_abort_call(net->socket, call->rxcall,
913*4882a593Smuzhiyun RXGEN_SS_MARSHAL, -ENOMEM, "KOO");
914*4882a593Smuzhiyun }
915*4882a593Smuzhiyun _leave(" [error]");
916*4882a593Smuzhiyun }
917*4882a593Smuzhiyun
918*4882a593Smuzhiyun /*
919*4882a593Smuzhiyun * Extract a piece of data from the received data socket buffers.
920*4882a593Smuzhiyun */
afs_extract_data(struct afs_call * call,bool want_more)921*4882a593Smuzhiyun int afs_extract_data(struct afs_call *call, bool want_more)
922*4882a593Smuzhiyun {
923*4882a593Smuzhiyun struct afs_net *net = call->net;
924*4882a593Smuzhiyun struct iov_iter *iter = call->iter;
925*4882a593Smuzhiyun enum afs_call_state state;
926*4882a593Smuzhiyun u32 remote_abort = 0;
927*4882a593Smuzhiyun int ret;
928*4882a593Smuzhiyun
929*4882a593Smuzhiyun _enter("{%s,%zu},%d", call->type->name, iov_iter_count(iter), want_more);
930*4882a593Smuzhiyun
931*4882a593Smuzhiyun ret = rxrpc_kernel_recv_data(net->socket, call->rxcall, iter,
932*4882a593Smuzhiyun want_more, &remote_abort,
933*4882a593Smuzhiyun &call->service_id);
934*4882a593Smuzhiyun if (ret == 0 || ret == -EAGAIN)
935*4882a593Smuzhiyun return ret;
936*4882a593Smuzhiyun
937*4882a593Smuzhiyun state = READ_ONCE(call->state);
938*4882a593Smuzhiyun if (ret == 1) {
939*4882a593Smuzhiyun switch (state) {
940*4882a593Smuzhiyun case AFS_CALL_CL_AWAIT_REPLY:
941*4882a593Smuzhiyun afs_set_call_state(call, state, AFS_CALL_CL_PROC_REPLY);
942*4882a593Smuzhiyun break;
943*4882a593Smuzhiyun case AFS_CALL_SV_AWAIT_REQUEST:
944*4882a593Smuzhiyun afs_set_call_state(call, state, AFS_CALL_SV_REPLYING);
945*4882a593Smuzhiyun break;
946*4882a593Smuzhiyun case AFS_CALL_COMPLETE:
947*4882a593Smuzhiyun kdebug("prem complete %d", call->error);
948*4882a593Smuzhiyun return afs_io_error(call, afs_io_error_extract);
949*4882a593Smuzhiyun default:
950*4882a593Smuzhiyun break;
951*4882a593Smuzhiyun }
952*4882a593Smuzhiyun return 0;
953*4882a593Smuzhiyun }
954*4882a593Smuzhiyun
955*4882a593Smuzhiyun afs_set_call_complete(call, ret, remote_abort);
956*4882a593Smuzhiyun return ret;
957*4882a593Smuzhiyun }
958*4882a593Smuzhiyun
959*4882a593Smuzhiyun /*
960*4882a593Smuzhiyun * Log protocol error production.
961*4882a593Smuzhiyun */
afs_protocol_error(struct afs_call * call,enum afs_eproto_cause cause)962*4882a593Smuzhiyun noinline int afs_protocol_error(struct afs_call *call,
963*4882a593Smuzhiyun enum afs_eproto_cause cause)
964*4882a593Smuzhiyun {
965*4882a593Smuzhiyun trace_afs_protocol_error(call, cause);
966*4882a593Smuzhiyun if (call)
967*4882a593Smuzhiyun call->unmarshalling_error = true;
968*4882a593Smuzhiyun return -EBADMSG;
969*4882a593Smuzhiyun }
970