mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-28 05:12:49 +00:00
rxrpc: Move the call completion handling out of line
Move the handling of call completion out of line so that the next patch can add more code in that area. Signed-off-by: David Howells <dhowells@redhat.com> Reviewed-by: Marc Dionne <marc.dionne@auristor.com>
This commit is contained in:
parent
bdc48fa11e
commit
3067bf8c59
3 changed files with 103 additions and 98 deletions
|
@ -809,100 +809,6 @@ static inline bool rxrpc_is_client_call(const struct rxrpc_call *call)
|
||||||
return !rxrpc_is_service_call(call);
|
return !rxrpc_is_service_call(call);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Transition a call to the complete state.
|
|
||||||
*/
|
|
||||||
static inline bool __rxrpc_set_call_completion(struct rxrpc_call *call,
|
|
||||||
enum rxrpc_call_completion compl,
|
|
||||||
u32 abort_code,
|
|
||||||
int error)
|
|
||||||
{
|
|
||||||
if (call->state < RXRPC_CALL_COMPLETE) {
|
|
||||||
call->abort_code = abort_code;
|
|
||||||
call->error = error;
|
|
||||||
call->completion = compl,
|
|
||||||
call->state = RXRPC_CALL_COMPLETE;
|
|
||||||
trace_rxrpc_call_complete(call);
|
|
||||||
wake_up(&call->waitq);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool rxrpc_set_call_completion(struct rxrpc_call *call,
|
|
||||||
enum rxrpc_call_completion compl,
|
|
||||||
u32 abort_code,
|
|
||||||
int error)
|
|
||||||
{
|
|
||||||
bool ret;
|
|
||||||
|
|
||||||
write_lock_bh(&call->state_lock);
|
|
||||||
ret = __rxrpc_set_call_completion(call, compl, abort_code, error);
|
|
||||||
write_unlock_bh(&call->state_lock);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Record that a call successfully completed.
|
|
||||||
*/
|
|
||||||
static inline bool __rxrpc_call_completed(struct rxrpc_call *call)
|
|
||||||
{
|
|
||||||
return __rxrpc_set_call_completion(call, RXRPC_CALL_SUCCEEDED, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool rxrpc_call_completed(struct rxrpc_call *call)
|
|
||||||
{
|
|
||||||
bool ret;
|
|
||||||
|
|
||||||
write_lock_bh(&call->state_lock);
|
|
||||||
ret = __rxrpc_call_completed(call);
|
|
||||||
write_unlock_bh(&call->state_lock);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Record that a call is locally aborted.
|
|
||||||
*/
|
|
||||||
static inline bool __rxrpc_abort_call(const char *why, struct rxrpc_call *call,
|
|
||||||
rxrpc_seq_t seq,
|
|
||||||
u32 abort_code, int error)
|
|
||||||
{
|
|
||||||
trace_rxrpc_abort(call->debug_id, why, call->cid, call->call_id, seq,
|
|
||||||
abort_code, error);
|
|
||||||
return __rxrpc_set_call_completion(call, RXRPC_CALL_LOCALLY_ABORTED,
|
|
||||||
abort_code, error);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool rxrpc_abort_call(const char *why, struct rxrpc_call *call,
|
|
||||||
rxrpc_seq_t seq, u32 abort_code, int error)
|
|
||||||
{
|
|
||||||
bool ret;
|
|
||||||
|
|
||||||
write_lock_bh(&call->state_lock);
|
|
||||||
ret = __rxrpc_abort_call(why, call, seq, abort_code, error);
|
|
||||||
write_unlock_bh(&call->state_lock);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Abort a call due to a protocol error.
|
|
||||||
*/
|
|
||||||
static inline bool __rxrpc_abort_eproto(struct rxrpc_call *call,
|
|
||||||
struct sk_buff *skb,
|
|
||||||
const char *eproto_why,
|
|
||||||
const char *why,
|
|
||||||
u32 abort_code)
|
|
||||||
{
|
|
||||||
struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
|
|
||||||
|
|
||||||
trace_rxrpc_rx_eproto(call, sp->hdr.serial, eproto_why);
|
|
||||||
return rxrpc_abort_call(why, call, sp->hdr.seq, abort_code, -EPROTO);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define rxrpc_abort_eproto(call, skb, eproto_why, abort_why, abort_code) \
|
|
||||||
__rxrpc_abort_eproto((call), (skb), tracepoint_string(eproto_why), \
|
|
||||||
(abort_why), (abort_code))
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* conn_client.c
|
* conn_client.c
|
||||||
*/
|
*/
|
||||||
|
@ -1101,8 +1007,33 @@ extern const struct seq_operations rxrpc_peer_seq_ops;
|
||||||
* recvmsg.c
|
* recvmsg.c
|
||||||
*/
|
*/
|
||||||
void rxrpc_notify_socket(struct rxrpc_call *);
|
void rxrpc_notify_socket(struct rxrpc_call *);
|
||||||
|
bool __rxrpc_set_call_completion(struct rxrpc_call *, enum rxrpc_call_completion, u32, int);
|
||||||
|
bool rxrpc_set_call_completion(struct rxrpc_call *, enum rxrpc_call_completion, u32, int);
|
||||||
|
bool __rxrpc_call_completed(struct rxrpc_call *);
|
||||||
|
bool rxrpc_call_completed(struct rxrpc_call *);
|
||||||
|
bool __rxrpc_abort_call(const char *, struct rxrpc_call *, rxrpc_seq_t, u32, int);
|
||||||
|
bool rxrpc_abort_call(const char *, struct rxrpc_call *, rxrpc_seq_t, u32, int);
|
||||||
int rxrpc_recvmsg(struct socket *, struct msghdr *, size_t, int);
|
int rxrpc_recvmsg(struct socket *, struct msghdr *, size_t, int);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Abort a call due to a protocol error.
|
||||||
|
*/
|
||||||
|
static inline bool __rxrpc_abort_eproto(struct rxrpc_call *call,
|
||||||
|
struct sk_buff *skb,
|
||||||
|
const char *eproto_why,
|
||||||
|
const char *why,
|
||||||
|
u32 abort_code)
|
||||||
|
{
|
||||||
|
struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
|
||||||
|
|
||||||
|
trace_rxrpc_rx_eproto(call, sp->hdr.serial, eproto_why);
|
||||||
|
return rxrpc_abort_call(why, call, sp->hdr.seq, abort_code, -EPROTO);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define rxrpc_abort_eproto(call, skb, eproto_why, abort_why, abort_code) \
|
||||||
|
__rxrpc_abort_eproto((call), (skb), tracepoint_string(eproto_why), \
|
||||||
|
(abort_why), (abort_code))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* rtt.c
|
* rtt.c
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -58,6 +58,80 @@ void rxrpc_notify_socket(struct rxrpc_call *call)
|
||||||
_leave("");
|
_leave("");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Transition a call to the complete state.
|
||||||
|
*/
|
||||||
|
bool __rxrpc_set_call_completion(struct rxrpc_call *call,
|
||||||
|
enum rxrpc_call_completion compl,
|
||||||
|
u32 abort_code,
|
||||||
|
int error)
|
||||||
|
{
|
||||||
|
if (call->state < RXRPC_CALL_COMPLETE) {
|
||||||
|
call->abort_code = abort_code;
|
||||||
|
call->error = error;
|
||||||
|
call->completion = compl,
|
||||||
|
call->state = RXRPC_CALL_COMPLETE;
|
||||||
|
trace_rxrpc_call_complete(call);
|
||||||
|
wake_up(&call->waitq);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool rxrpc_set_call_completion(struct rxrpc_call *call,
|
||||||
|
enum rxrpc_call_completion compl,
|
||||||
|
u32 abort_code,
|
||||||
|
int error)
|
||||||
|
{
|
||||||
|
bool ret;
|
||||||
|
|
||||||
|
write_lock_bh(&call->state_lock);
|
||||||
|
ret = __rxrpc_set_call_completion(call, compl, abort_code, error);
|
||||||
|
write_unlock_bh(&call->state_lock);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Record that a call successfully completed.
|
||||||
|
*/
|
||||||
|
bool __rxrpc_call_completed(struct rxrpc_call *call)
|
||||||
|
{
|
||||||
|
return __rxrpc_set_call_completion(call, RXRPC_CALL_SUCCEEDED, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool rxrpc_call_completed(struct rxrpc_call *call)
|
||||||
|
{
|
||||||
|
bool ret;
|
||||||
|
|
||||||
|
write_lock_bh(&call->state_lock);
|
||||||
|
ret = __rxrpc_call_completed(call);
|
||||||
|
write_unlock_bh(&call->state_lock);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Record that a call is locally aborted.
|
||||||
|
*/
|
||||||
|
bool __rxrpc_abort_call(const char *why, struct rxrpc_call *call,
|
||||||
|
rxrpc_seq_t seq, u32 abort_code, int error)
|
||||||
|
{
|
||||||
|
trace_rxrpc_abort(call->debug_id, why, call->cid, call->call_id, seq,
|
||||||
|
abort_code, error);
|
||||||
|
return __rxrpc_set_call_completion(call, RXRPC_CALL_LOCALLY_ABORTED,
|
||||||
|
abort_code, error);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool rxrpc_abort_call(const char *why, struct rxrpc_call *call,
|
||||||
|
rxrpc_seq_t seq, u32 abort_code, int error)
|
||||||
|
{
|
||||||
|
bool ret;
|
||||||
|
|
||||||
|
write_lock_bh(&call->state_lock);
|
||||||
|
ret = __rxrpc_abort_call(why, call, seq, abort_code, error);
|
||||||
|
write_unlock_bh(&call->state_lock);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Pass a call terminating message to userspace.
|
* Pass a call terminating message to userspace.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -261,10 +261,10 @@ static int rxrpc_queue_packet(struct rxrpc_sock *rx, struct rxrpc_call *call,
|
||||||
case -ENETUNREACH:
|
case -ENETUNREACH:
|
||||||
case -EHOSTUNREACH:
|
case -EHOSTUNREACH:
|
||||||
case -ECONNREFUSED:
|
case -ECONNREFUSED:
|
||||||
rxrpc_set_call_completion(call,
|
if (rxrpc_set_call_completion(call,
|
||||||
RXRPC_CALL_LOCAL_ERROR,
|
RXRPC_CALL_LOCAL_ERROR,
|
||||||
0, ret);
|
0, ret))
|
||||||
rxrpc_notify_socket(call);
|
rxrpc_notify_socket(call);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
_debug("need instant resend %d", ret);
|
_debug("need instant resend %d", ret);
|
||||||
|
|
Loading…
Reference in a new issue