afs: Log remote unmarshalling errors
authorDavid Howells <dhowells@redhat.com>
Sun, 7 Jun 2020 20:50:29 +0000 (21:50 +0100)
committerDavid Howells <dhowells@redhat.com>
Fri, 23 Apr 2021 09:17:26 +0000 (10:17 +0100)
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 <dhowells@redhat.com>
Tested-By: Marc Dionne <marc.dionne@auristor.com>
cc: linux-afs@lists.infradead.org
cc: linux-cachefs@redhat.com
cc: linux-fsdevel@vger.kernel.org
Link: https://lore.kernel.org/r/159465826250.1377938.16372395422217583913.stgit@warthog.procyon.org.uk/
Link: https://lore.kernel.org/r/160588532584.3465195.15618385466614028590.stgit@warthog.procyon.org.uk/
Link: https://lore.kernel.org/r/161118149739.1232039.208060911149801695.stgit@warthog.procyon.org.uk/
Link: https://lore.kernel.org/r/161161046033.2537118.7779717661044373273.stgit@warthog.procyon.org.uk/
Link: https://lore.kernel.org/r/161340409118.1303470.17812607349396199116.stgit@warthog.procyon.org.uk/
Link: https://lore.kernel.org/r/161539552964.286939.16503232687974398308.stgit@warthog.procyon.org.uk/
Link: https://lore.kernel.org/r/161653808989.2770958.11530765353025697860.stgit@warthog.procyon.org.uk/
Link: https://lore.kernel.org/r/161789092349.6155.8581594259882708631.stgit@warthog.procyon.org.uk/
fs/afs/rxrpc.c

index 0ec38b7..ae68576 100644 (file)
@@ -500,6 +500,39 @@ error_kill_call:
        _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;