*/
 #define CIFS_SERVER_IS_CHAN(server)    (!!(server)->primary_server)
        struct TCP_Server_Info *primary_server;
+       __u16 channel_sequence_num;  /* incremented on primary channel on each chan reconnect */
 
 #ifdef CONFIG_CIFS_SWN_UPCALL
        bool use_swn_dstaddr;
 
                ctx->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
        tcp_ses->session_estab = false;
        tcp_ses->sequence_number = 0;
+       tcp_ses->channel_sequence_num = 0; /* only tracked for primary channel */
        tcp_ses->reconnect_instance = 1;
        tcp_ses->lstrp = jiffies;
        tcp_ses->compress_algorithm = cpu_to_le16(ctx->compression);
 
 
        spin_lock(&server->req_lock);
        server->credits = val;
-       if (val == 1)
+       if (val == 1) {
                server->reconnect_instance++;
+               /*
+                * ChannelSequence updated for all channels in primary channel so that consistent
+                * across SMB3 requests sent on any channel. See MS-SMB2 3.2.4.1 and 3.2.7.1
+                */
+               if (CIFS_SERVER_IS_CHAN(server))
+                       server->primary_server->channel_sequence_num++;
+               else
+                       server->channel_sequence_num++;
+       }
        scredits = server->credits;
        in_flight = server->in_flight;
        spin_unlock(&server->req_lock);
 
                  const struct cifs_tcon *tcon,
                  struct TCP_Server_Info *server)
 {
+       struct smb3_hdr_req *smb3_hdr;
        shdr->ProtocolId = SMB2_PROTO_NUMBER;
        shdr->StructureSize = cpu_to_le16(64);
        shdr->Command = smb2_cmd;
+       if (server->dialect >= SMB30_PROT_ID) {
+               /* After reconnect SMB3 must set ChannelSequence on subsequent reqs */
+               smb3_hdr = (struct smb3_hdr_req *)shdr;
+               /* if primary channel is not set yet, use default channel for chan sequence num */
+               if (CIFS_SERVER_IS_CHAN(server))
+                       smb3_hdr->ChannelSequence =
+                               cpu_to_le16(server->primary_server->channel_sequence_num);
+               else
+                       smb3_hdr->ChannelSequence = cpu_to_le16(server->channel_sequence_num);
+       }
        if (server) {
                spin_lock(&server->req_lock);
                /* Request up to 10 credits but don't go over the limit. */
 
        __u8   Signature[16];
 } __packed;
 
+struct smb3_hdr_req {
+       __le32 ProtocolId;      /* 0xFE 'S' 'M' 'B' */
+       __le16 StructureSize;   /* 64 */
+       __le16 CreditCharge;    /* MBZ */
+       __le16 ChannelSequence; /* See MS-SMB2 3.2.4.1 and 3.2.7.1 */
+       __le16 Reserved;
+       __le16 Command;
+       __le16 CreditRequest;   /* CreditResponse */
+       __le32 Flags;
+       __le32 NextCommand;
+       __le64 MessageId;
+       union {
+               struct {
+                       __le32 ProcessId;
+                       __le32  TreeId;
+               } __packed SyncId;
+               __le64  AsyncId;
+       } __packed Id;
+       __le64  SessionId;
+       __u8   Signature[16];
+} __packed;
+
 struct smb2_pdu {
        struct smb2_hdr hdr;
        __le16 StructureSize2; /* size of wct area (varies, request specific) */