| From c4843be46aee68b819009209ca0ce03acd98a852 Mon Sep 17 00:00:00 2001 |
| From: David Howells <dhowells@redhat.com> |
| Date: Sat, 20 Oct 2018 00:57:57 +0100 |
| Subject: afs: Handle EIO from delivery function |
| |
| [ Upstream commit 4ac15ea53622272c01954461b4814892b7481b40 ] |
| |
| Fix afs_deliver_to_call() to handle -EIO being returned by the operation |
| delivery function, indicating that the call found itself in the wrong |
| state, by printing an error and aborting the call. |
| |
| Currently, an assertion failure will occur. This can happen, say, if the |
| delivery function falls off the end without calling afs_extract_data() with |
| the want_more parameter set to false to collect the end of the Rx phase of |
| a call. |
| |
| The assertion failure looks like: |
| |
| AFS: Assertion failed |
| 4 == 7 is false |
| 0x4 == 0x7 is false |
| ------------[ cut here ]------------ |
| kernel BUG at fs/afs/rxrpc.c:462! |
| |
| and is matched in the trace buffer by a line like: |
| |
| kworker/7:3-3226 [007] ...1 85158.030203: afs_io_error: c=0003be0c r=-5 CM_REPLY |
| |
| Fixes: 98bf40cd99fc ("afs: Protect call->state changes against signals") |
| Reported-by: Marc Dionne <marc.dionne@auristor.com> |
| Signed-off-by: David Howells <dhowells@redhat.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| fs/afs/rxrpc.c | 5 ++++- |
| 1 file changed, 4 insertions(+), 1 deletion(-) |
| |
| diff --git a/fs/afs/rxrpc.c b/fs/afs/rxrpc.c |
| index 77a83790a31f..2543f24d23f8 100644 |
| --- a/fs/afs/rxrpc.c |
| +++ b/fs/afs/rxrpc.c |
| @@ -500,7 +500,6 @@ static void afs_deliver_to_call(struct afs_call *call) |
| case -EINPROGRESS: |
| case -EAGAIN: |
| goto out; |
| - case -EIO: |
| case -ECONNABORTED: |
| ASSERTCMP(state, ==, AFS_CALL_COMPLETE); |
| goto done; |
| @@ -509,6 +508,10 @@ static void afs_deliver_to_call(struct afs_call *call) |
| rxrpc_kernel_abort_call(call->net->socket, call->rxcall, |
| abort_code, ret, "KIV"); |
| goto local_abort; |
| + case -EIO: |
| + pr_err("kAFS: Call %u in bad state %u\n", |
| + call->debug_id, state); |
| + /* Fall through */ |
| case -ENODATA: |
| case -EBADMSG: |
| case -EMSGSIZE: |
| -- |
| 2.17.1 |
| |