{
        struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
        enum rxrpc_call_state state;
-       unsigned int j;
+       unsigned int j, nr_subpackets;
        rxrpc_serial_t serial = sp->hdr.serial, ack_serial = 0;
        rxrpc_seq_t seq0 = sp->hdr.seq, hard_ack;
        bool immediate_ack = false, jumbo_bad = false;
        call->ackr_prev_seq = seq0;
        hard_ack = READ_ONCE(call->rx_hard_ack);
 
-       if (sp->nr_subpackets > 1) {
+       nr_subpackets = sp->nr_subpackets;
+       if (nr_subpackets > 1) {
                if (call->nr_jumbo_bad > 3) {
                        ack = RXRPC_ACK_NOSPACE;
                        ack_serial = serial;
                }
        }
 
-       for (j = 0; j < sp->nr_subpackets; j++) {
+       for (j = 0; j < nr_subpackets; j++) {
                rxrpc_serial_t serial = sp->hdr.serial + j;
                rxrpc_seq_t seq = seq0 + j;
                unsigned int ix = seq & RXRPC_RXTX_BUFF_MASK;
-               bool terminal = (j == sp->nr_subpackets - 1);
+               bool terminal = (j == nr_subpackets - 1);
                bool last = terminal && (sp->rx_flags & RXRPC_SKB_INCL_LAST);
                u8 flags, annotation = j;
 
                }
 
                if (call->rxtx_buffer[ix]) {
-                       rxrpc_input_dup_data(call, seq, sp->nr_subpackets > 1,
+                       rxrpc_input_dup_data(call, seq, nr_subpackets > 1,
                                             &jumbo_bad);
                        if (ack != RXRPC_ACK_DUPLICATE) {
                                ack = RXRPC_ACK_DUPLICATE;
                         * ring.
                         */
                        skb = NULL;
+                       sp = NULL;
                }
 
                if (last) {