Log unmarshalling errors reported by the peer (ie. it can't parse what we
sent it).  Limit the maximum number of messages to 3.

Signed-off-by: David Howells <dhowe...@redhat.com>
cc: linux-...@lists.infradead.org
cc: linux-cach...@redhat.com
cc: linux-fsde...@vger.kernel.org
Link: 
https://lore.kernel.org/r/159465826250.1377938.16372395422217583913.st...@warthog.procyon.org.uk/
Link: 
https://lore.kernel.org/r/160588532584.3465195.15618385466614028590.st...@warthog.procyon.org.uk/
 # rfc
Link: 
https://lore.kernel.org/r/161118149739.1232039.208060911149801695.st...@warthog.procyon.org.uk/
 # rfc
Link: 
https://lore.kernel.org/r/161161046033.2537118.7779717661044373273.st...@warthog.procyon.org.uk/
 # v2
Link: 
https://lore.kernel.org/r/161340409118.1303470.17812607349396199116.st...@warthog.procyon.org.uk/
 # v3
Link: 
https://lore.kernel.org/r/161539552964.286939.16503232687974398308.st...@warthog.procyon.org.uk/
 # v4
Link: 
https://lore.kernel.org/r/161653808989.2770958.11530765353025697860.st...@warthog.procyon.org.uk/
 # v5
---

 fs/afs/rxrpc.c |   34 ++++++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)

diff --git a/fs/afs/rxrpc.c b/fs/afs/rxrpc.c
index 0ec38b758f29..ae68576f822f 100644
--- a/fs/afs/rxrpc.c
+++ b/fs/afs/rxrpc.c
@@ -500,6 +500,39 @@ void afs_make_call(struct afs_addr_cursor *ac, struct 
afs_call *call, gfp_t gfp)
        _leave(" = %d", ret);
 }
 
+/*
+ * Log remote abort codes that indicate that we have a protocol disagreement
+ * with the server.
+ */
+static void afs_log_error(struct afs_call *call, s32 remote_abort)
+{
+       static int max = 0;
+       const char *msg;
+       int m;
+
+       switch (remote_abort) {
+       case RX_EOF:             msg = "unexpected EOF";        break;
+       case RXGEN_CC_MARSHAL:   msg = "client marshalling";    break;
+       case RXGEN_CC_UNMARSHAL: msg = "client unmarshalling";  break;
+       case RXGEN_SS_MARSHAL:   msg = "server marshalling";    break;
+       case RXGEN_SS_UNMARSHAL: msg = "server unmarshalling";  break;
+       case RXGEN_DECODE:       msg = "opcode decode";         break;
+       case RXGEN_SS_XDRFREE:   msg = "server XDR cleanup";    break;
+       case RXGEN_CC_XDRFREE:   msg = "client XDR cleanup";    break;
+       case -32:                msg = "insufficient data";     break;
+       default:
+               return;
+       }
+
+       m = max;
+       if (m < 3) {
+               max = m + 1;
+               pr_notice("kAFS: Peer reported %s failure on %s [%pISp]\n",
+                         msg, call->type->name,
+                         &call->alist->addrs[call->addr_ix].transport);
+       }
+}
+
 /*
  * deliver messages to a call
  */
@@ -563,6 +596,7 @@ static void afs_deliver_to_call(struct afs_call *call)
                        goto out;
                case -ECONNABORTED:
                        ASSERTCMP(state, ==, AFS_CALL_COMPLETE);
+                       afs_log_error(call, call->abort_code);
                        goto done;
                case -ENOTSUPP:
                        abort_code = RXGEN_OPCODE;


Reply via email to