@@ -289,8 +289,6 @@ enum rxrpc_conn_proto_state {
289
289
RXRPC_CONN_SERVICE , /* Service secured connection */
290
290
RXRPC_CONN_REMOTELY_ABORTED , /* Conn aborted by peer */
291
291
RXRPC_CONN_LOCALLY_ABORTED , /* Conn aborted locally */
292
- RXRPC_CONN_NETWORK_ERROR , /* Conn terminated by network error */
293
- RXRPC_CONN_LOCAL_ERROR , /* Conn terminated by local error */
294
292
RXRPC_CONN__NR_STATES
295
293
};
296
294
@@ -344,7 +342,6 @@ struct rxrpc_connection {
344
342
enum rxrpc_conn_proto_state state : 8 ; /* current state of connection */
345
343
u32 local_abort ; /* local abort code */
346
344
u32 remote_abort ; /* remote abort code */
347
- int error ; /* local error incurred */
348
345
int debug_id ; /* debug ID for printks */
349
346
atomic_t serial ; /* packet serial number counter */
350
347
unsigned int hi_serial ; /* highest serial number received */
@@ -411,13 +408,22 @@ enum rxrpc_call_state {
411
408
RXRPC_CALL_SERVER_ACK_REQUEST , /* - server pending ACK of request */
412
409
RXRPC_CALL_SERVER_SEND_REPLY , /* - server sending reply */
413
410
RXRPC_CALL_SERVER_AWAIT_ACK , /* - server awaiting final ACK */
414
- RXRPC_CALL_COMPLETE , /* - call completed */
411
+ RXRPC_CALL_COMPLETE , /* - call complete */
412
+ RXRPC_CALL_DEAD , /* - call is dead */
413
+ NR__RXRPC_CALL_STATES
414
+ };
415
+
416
+ /*
417
+ * Call completion condition (state == RXRPC_CALL_COMPLETE).
418
+ */
419
+ enum rxrpc_call_completion {
420
+ RXRPC_CALL_SUCCEEDED , /* - Normal termination */
415
421
RXRPC_CALL_SERVER_BUSY , /* - call rejected by busy server */
416
422
RXRPC_CALL_REMOTELY_ABORTED , /* - call aborted by peer */
417
423
RXRPC_CALL_LOCALLY_ABORTED , /* - call aborted locally on error or close */
424
+ RXRPC_CALL_LOCAL_ERROR , /* - call failed due to local error */
418
425
RXRPC_CALL_NETWORK_ERROR , /* - call terminated by network error */
419
- RXRPC_CALL_DEAD , /* - call is dead */
420
- NR__RXRPC_CALL_STATES
426
+ NR__RXRPC_CALL_COMPLETIONS
421
427
};
422
428
423
429
/*
@@ -451,14 +457,13 @@ struct rxrpc_call {
451
457
unsigned long events ;
452
458
spinlock_t lock ;
453
459
rwlock_t state_lock ; /* lock for state transition */
460
+ u32 abort_code ; /* Local/remote abort code */
461
+ int error ; /* Local error incurred */
462
+ enum rxrpc_call_state state : 8 ; /* current state of call */
463
+ enum rxrpc_call_completion completion : 8 ; /* Call completion condition */
454
464
atomic_t usage ;
455
465
atomic_t skb_count ; /* Outstanding packets on this call */
456
466
atomic_t sequence ; /* Tx data packet sequence counter */
457
- u32 local_abort ; /* local abort code */
458
- u32 remote_abort ; /* remote abort code */
459
- int error_report ; /* Network error (ICMP/local transport) */
460
- int error ; /* Local error incurred */
461
- enum rxrpc_call_state state : 8 ; /* current state of call */
462
467
u16 service_id ; /* service ID */
463
468
u32 call_id ; /* call ID on connection */
464
469
u32 cid ; /* connection ID plus channel index */
@@ -493,20 +498,6 @@ struct rxrpc_call {
493
498
unsigned long ackr_window [RXRPC_ACKR_WINDOW_ASZ + 1 ];
494
499
};
495
500
496
- /*
497
- * locally abort an RxRPC call
498
- */
499
- static inline void rxrpc_abort_call (struct rxrpc_call * call , u32 abort_code )
500
- {
501
- write_lock_bh (& call -> state_lock );
502
- if (call -> state < RXRPC_CALL_COMPLETE ) {
503
- call -> local_abort = abort_code ;
504
- call -> state = RXRPC_CALL_LOCALLY_ABORTED ;
505
- set_bit (RXRPC_CALL_EV_ABORT , & call -> events );
506
- }
507
- write_unlock_bh (& call -> state_lock );
508
- }
509
-
510
501
#include <trace/events/rxrpc.h>
511
502
512
503
/*
@@ -534,6 +525,8 @@ void rxrpc_process_call(struct work_struct *);
534
525
/*
535
526
* call_object.c
536
527
*/
528
+ extern const char * const rxrpc_call_states [];
529
+ extern const char * const rxrpc_call_completions [];
537
530
extern unsigned int rxrpc_max_call_lifetime ;
538
531
extern unsigned int rxrpc_dead_call_expiry ;
539
532
extern struct kmem_cache * rxrpc_call_jar ;
@@ -563,6 +556,78 @@ static inline bool rxrpc_is_client_call(const struct rxrpc_call *call)
563
556
return !rxrpc_is_service_call (call );
564
557
}
565
558
559
+ /*
560
+ * Transition a call to the complete state.
561
+ */
562
+ static inline bool __rxrpc_set_call_completion (struct rxrpc_call * call ,
563
+ enum rxrpc_call_completion compl ,
564
+ u32 abort_code ,
565
+ int error )
566
+ {
567
+ if (call -> state < RXRPC_CALL_COMPLETE ) {
568
+ call -> abort_code = abort_code ;
569
+ call -> error = error ;
570
+ call -> completion = compl ,
571
+ call -> state = RXRPC_CALL_COMPLETE ;
572
+ return true;
573
+ }
574
+ return false;
575
+ }
576
+
577
+ static inline bool rxrpc_set_call_completion (struct rxrpc_call * call ,
578
+ enum rxrpc_call_completion compl ,
579
+ u32 abort_code ,
580
+ int error )
581
+ {
582
+ int ret ;
583
+
584
+ write_lock_bh (& call -> state_lock );
585
+ ret = __rxrpc_set_call_completion (call , compl , abort_code , error );
586
+ write_unlock_bh (& call -> state_lock );
587
+ return ret ;
588
+ }
589
+
590
+ /*
591
+ * Record that a call successfully completed.
592
+ */
593
+ static inline void __rxrpc_call_completed (struct rxrpc_call * call )
594
+ {
595
+ __rxrpc_set_call_completion (call , RXRPC_CALL_SUCCEEDED , 0 , 0 );
596
+ }
597
+
598
+ static inline void rxrpc_call_completed (struct rxrpc_call * call )
599
+ {
600
+ write_lock_bh (& call -> state_lock );
601
+ __rxrpc_call_completed (call );
602
+ write_unlock_bh (& call -> state_lock );
603
+ }
604
+
605
+ /*
606
+ * Record that a call is locally aborted.
607
+ */
608
+ static inline bool __rxrpc_abort_call (struct rxrpc_call * call ,
609
+ u32 abort_code , int error )
610
+ {
611
+ if (__rxrpc_set_call_completion (call ,
612
+ RXRPC_CALL_LOCALLY_ABORTED ,
613
+ abort_code , error )) {
614
+ set_bit (RXRPC_CALL_EV_ABORT , & call -> events );
615
+ return true;
616
+ }
617
+ return false;
618
+ }
619
+
620
+ static inline bool rxrpc_abort_call (struct rxrpc_call * call ,
621
+ u32 abort_code , int error )
622
+ {
623
+ bool ret ;
624
+
625
+ write_lock_bh (& call -> state_lock );
626
+ ret = __rxrpc_abort_call (call , abort_code , error );
627
+ write_unlock_bh (& call -> state_lock );
628
+ return ret ;
629
+ }
630
+
566
631
/*
567
632
* conn_client.c
568
633
*/
@@ -778,7 +843,6 @@ static inline void rxrpc_put_peer(struct rxrpc_peer *peer)
778
843
/*
779
844
* proc.c
780
845
*/
781
- extern const char * const rxrpc_call_states [];
782
846
extern const struct file_operations rxrpc_call_seq_fops ;
783
847
extern const struct file_operations rxrpc_connection_seq_fops ;
784
848
0 commit comments