@@ -31,6 +31,8 @@ unsigned int rxrpc_max_call_lifetime = 60 * HZ;
31
31
unsigned int rxrpc_dead_call_expiry = 2 * HZ ;
32
32
33
33
const char * const rxrpc_call_states [NR__RXRPC_CALL_STATES ] = {
34
+ [RXRPC_CALL_UNINITIALISED ] = "Uninit" ,
35
+ [RXRPC_CALL_CLIENT_AWAIT_CONN ] = "ClWtConn" ,
34
36
[RXRPC_CALL_CLIENT_SEND_REQUEST ] = "ClSndReq" ,
35
37
[RXRPC_CALL_CLIENT_AWAIT_REPLY ] = "ClAwtRpl" ,
36
38
[RXRPC_CALL_CLIENT_RECV_REPLY ] = "ClRcvRpl" ,
@@ -261,6 +263,7 @@ static struct rxrpc_call *rxrpc_alloc_call(gfp_t gfp)
261
263
(unsigned long ) call );
262
264
INIT_WORK (& call -> destroyer , & rxrpc_destroy_call );
263
265
INIT_WORK (& call -> processor , & rxrpc_process_call );
266
+ INIT_LIST_HEAD (& call -> link );
264
267
INIT_LIST_HEAD (& call -> accept_link );
265
268
skb_queue_head_init (& call -> rx_queue );
266
269
skb_queue_head_init (& call -> rx_oos_queue );
@@ -269,7 +272,6 @@ static struct rxrpc_call *rxrpc_alloc_call(gfp_t gfp)
269
272
rwlock_init (& call -> state_lock );
270
273
atomic_set (& call -> usage , 1 );
271
274
call -> debug_id = atomic_inc_return (& rxrpc_debug_id );
272
- call -> state = RXRPC_CALL_CLIENT_SEND_REQUEST ;
273
275
274
276
memset (& call -> sock_node , 0xed , sizeof (call -> sock_node ));
275
277
@@ -282,55 +284,70 @@ static struct rxrpc_call *rxrpc_alloc_call(gfp_t gfp)
282
284
}
283
285
284
286
/*
285
- * allocate a new client call and attempt to get a connection slot for it
287
+ * Allocate a new client call.
286
288
*/
287
289
static struct rxrpc_call * rxrpc_alloc_client_call (
288
290
struct rxrpc_sock * rx ,
289
291
struct rxrpc_conn_parameters * cp ,
290
- struct rxrpc_transport * trans ,
291
- struct rxrpc_conn_bundle * bundle ,
292
+ struct sockaddr_rxrpc * srx ,
292
293
gfp_t gfp )
293
294
{
294
295
struct rxrpc_call * call ;
295
- int ret ;
296
296
297
297
_enter ("" );
298
298
299
- ASSERT (rx != NULL );
300
- ASSERT (trans != NULL );
301
- ASSERT (bundle != NULL );
299
+ ASSERT (rx -> local != NULL );
302
300
303
301
call = rxrpc_alloc_call (gfp );
304
302
if (!call )
305
303
return ERR_PTR (- ENOMEM );
304
+ call -> state = RXRPC_CALL_CLIENT_AWAIT_CONN ;
306
305
307
306
sock_hold (& rx -> sk );
308
307
call -> socket = rx ;
309
308
call -> rx_data_post = 1 ;
310
309
311
- ret = rxrpc_connect_call (rx , cp , trans , bundle , call , gfp );
312
- if (ret < 0 ) {
313
- kmem_cache_free (rxrpc_call_jar , call );
314
- return ERR_PTR (ret );
315
- }
316
-
317
310
/* Record copies of information for hashtable lookup */
318
311
call -> family = rx -> family ;
319
- call -> local = call -> conn -> params . local ;
312
+ call -> local = rx -> local ;
320
313
switch (call -> family ) {
321
314
case AF_INET :
322
- call -> peer_ip .ipv4_addr =
323
- call -> conn -> params .peer -> srx .transport .sin .sin_addr .s_addr ;
315
+ call -> peer_ip .ipv4_addr = srx -> transport .sin .sin_addr .s_addr ;
324
316
break ;
325
317
case AF_INET6 :
326
318
memcpy (call -> peer_ip .ipv6_addr ,
327
- call -> conn -> params . peer -> srx . transport .sin6 .sin6_addr .in6_u .u6_addr8 ,
319
+ srx -> transport .sin6 .sin6_addr .in6_u .u6_addr8 ,
328
320
sizeof (call -> peer_ip .ipv6_addr ));
329
321
break ;
330
322
}
331
- call -> epoch = call -> conn -> proto .epoch ;
332
- call -> service_id = call -> conn -> params .service_id ;
333
- call -> in_clientflag = call -> conn -> proto .in_clientflag ;
323
+
324
+ call -> service_id = srx -> srx_service ;
325
+ call -> in_clientflag = 0 ;
326
+
327
+ _leave (" = %p" , call );
328
+ return call ;
329
+ }
330
+
331
+ /*
332
+ * Begin client call.
333
+ */
334
+ static int rxrpc_begin_client_call (struct rxrpc_call * call ,
335
+ struct rxrpc_conn_parameters * cp ,
336
+ struct rxrpc_transport * trans ,
337
+ struct sockaddr_rxrpc * srx ,
338
+ gfp_t gfp )
339
+ {
340
+ int ret ;
341
+
342
+ /* Set up or get a connection record and set the protocol parameters,
343
+ * including channel number and call ID.
344
+ */
345
+ ret = rxrpc_connect_call (call , cp , trans , srx , gfp );
346
+ if (ret < 0 )
347
+ return ret ;
348
+
349
+ call -> state = RXRPC_CALL_CLIENT_SEND_REQUEST ;
350
+
334
351
/* Add the new call to the hashtable */
335
352
rxrpc_call_hash_add (call );
336
353
@@ -340,9 +357,7 @@ static struct rxrpc_call *rxrpc_alloc_client_call(
340
357
341
358
call -> lifetimer .expires = jiffies + rxrpc_max_call_lifetime ;
342
359
add_timer (& call -> lifetimer );
343
-
344
- _leave (" = %p" , call );
345
- return call ;
360
+ return 0 ;
346
361
}
347
362
348
363
/*
@@ -352,23 +367,23 @@ static struct rxrpc_call *rxrpc_alloc_client_call(
352
367
struct rxrpc_call * rxrpc_new_client_call (struct rxrpc_sock * rx ,
353
368
struct rxrpc_conn_parameters * cp ,
354
369
struct rxrpc_transport * trans ,
355
- struct rxrpc_conn_bundle * bundle ,
370
+ struct sockaddr_rxrpc * srx ,
356
371
unsigned long user_call_ID ,
357
372
gfp_t gfp )
358
373
{
359
374
struct rxrpc_call * call , * xcall ;
360
375
struct rb_node * parent , * * pp ;
376
+ int ret ;
361
377
362
- _enter ("%p,%d,%d,%lx" ,
363
- rx , trans -> debug_id , bundle ? bundle -> debug_id : -1 ,
364
- user_call_ID );
378
+ _enter ("%p,%lx" , rx , user_call_ID );
365
379
366
- call = rxrpc_alloc_client_call (rx , cp , trans , bundle , gfp );
380
+ call = rxrpc_alloc_client_call (rx , cp , srx , gfp );
367
381
if (IS_ERR (call )) {
368
382
_leave (" = %ld" , PTR_ERR (call ));
369
383
return call ;
370
384
}
371
385
386
+ /* Publish the call, even though it is incompletely set up as yet */
372
387
call -> user_call_ID = user_call_ID ;
373
388
__set_bit (RXRPC_CALL_HAS_USERID , & call -> flags );
374
389
@@ -398,11 +413,29 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx,
398
413
list_add_tail (& call -> link , & rxrpc_calls );
399
414
write_unlock_bh (& rxrpc_call_lock );
400
415
416
+ ret = rxrpc_begin_client_call (call , cp , trans , srx , gfp );
417
+ if (ret < 0 )
418
+ goto error ;
419
+
401
420
_net ("CALL new %d on CONN %d" , call -> debug_id , call -> conn -> debug_id );
402
421
403
422
_leave (" = %p [new]" , call );
404
423
return call ;
405
424
425
+ error :
426
+ write_lock (& rx -> call_lock );
427
+ rb_erase (& call -> sock_node , & rx -> calls );
428
+ write_unlock (& rx -> call_lock );
429
+ rxrpc_put_call (call );
430
+
431
+ write_lock_bh (& rxrpc_call_lock );
432
+ list_del (& call -> link );
433
+ write_unlock_bh (& rxrpc_call_lock );
434
+
435
+ rxrpc_put_call (call );
436
+ _leave (" = %d" , ret );
437
+ return ERR_PTR (ret );
438
+
406
439
/* We unexpectedly found the user ID in the list after taking
407
440
* the call_lock. This shouldn't happen unless the user races
408
441
* with itself and tries to add the same user ID twice at the
@@ -612,40 +645,13 @@ void rxrpc_release_call(struct rxrpc_call *call)
612
645
write_unlock_bh (& rx -> call_lock );
613
646
614
647
/* free up the channel for reuse */
615
- spin_lock (& conn -> trans -> client_lock );
648
+ spin_lock (& conn -> channel_lock );
616
649
write_lock_bh (& conn -> lock );
617
650
write_lock (& call -> state_lock );
618
651
619
- if (conn -> channels [call -> channel ] == call )
620
- conn -> channels [call -> channel ] = NULL ;
621
-
622
- if (conn -> out_clientflag && conn -> bundle ) {
623
- conn -> avail_calls ++ ;
624
- switch (conn -> avail_calls ) {
625
- case 1 :
626
- list_move_tail (& conn -> bundle_link ,
627
- & conn -> bundle -> avail_conns );
628
- case 2 ... RXRPC_MAXCALLS - 1 :
629
- ASSERT (conn -> channels [0 ] == NULL ||
630
- conn -> channels [1 ] == NULL ||
631
- conn -> channels [2 ] == NULL ||
632
- conn -> channels [3 ] == NULL );
633
- break ;
634
- case RXRPC_MAXCALLS :
635
- list_move_tail (& conn -> bundle_link ,
636
- & conn -> bundle -> unused_conns );
637
- ASSERT (conn -> channels [0 ] == NULL &&
638
- conn -> channels [1 ] == NULL &&
639
- conn -> channels [2 ] == NULL &&
640
- conn -> channels [3 ] == NULL );
641
- break ;
642
- default :
643
- pr_err ("conn->avail_calls=%d\n" , conn -> avail_calls );
644
- BUG ();
645
- }
646
- }
652
+ rxrpc_disconnect_call (call );
647
653
648
- spin_unlock (& conn -> trans -> client_lock );
654
+ spin_unlock (& conn -> channel_lock );
649
655
650
656
if (call -> state < RXRPC_CALL_COMPLETE &&
651
657
call -> state != RXRPC_CALL_CLIENT_FINAL_ACK ) {
0 commit comments