rds_ib_set_flow_control(conn, be32_to_cpu(credit));
        }
 
-       if (conn->c_version < RDS_PROTOCOL(3, 1)) {
-               pr_notice("RDS/IB: Connection <%pI6c,%pI6c> version %u.%u no longer supported\n",
-                         &conn->c_laddr, &conn->c_faddr,
-                         RDS_PROTOCOL_MAJOR(conn->c_version),
-                         RDS_PROTOCOL_MINOR(conn->c_version));
-               set_bit(RDS_DESTROY_PENDING, &conn->c_path[0].cp_flags);
-               rds_conn_destroy(conn);
-               return;
-       } else {
-               pr_notice("RDS/IB: %s conn connected <%pI6c,%pI6c> version %u.%u%s\n",
-                         ic->i_active_side ? "Active" : "Passive",
-                         &conn->c_laddr, &conn->c_faddr,
-                         RDS_PROTOCOL_MAJOR(conn->c_version),
-                         RDS_PROTOCOL_MINOR(conn->c_version),
-                         ic->i_flowctl ? ", flow control" : "");
+       if (conn->c_version < RDS_PROTOCOL_VERSION) {
+               if (conn->c_version != RDS_PROTOCOL_COMPAT_VERSION) {
+                       pr_notice("RDS/IB: Connection <%pI6c,%pI6c> version %u.%u no longer supported\n",
+                                 &conn->c_laddr, &conn->c_faddr,
+                                 RDS_PROTOCOL_MAJOR(conn->c_version),
+                                 RDS_PROTOCOL_MINOR(conn->c_version));
+                       rds_conn_destroy(conn);
+                       return;
+               }
        }
 
+       pr_notice("RDS/IB: %s conn connected <%pI6c,%pI6c> version %u.%u%s\n",
+                 ic->i_active_side ? "Active" : "Passive",
+                 &conn->c_laddr, &conn->c_faddr,
+                 RDS_PROTOCOL_MAJOR(conn->c_version),
+                 RDS_PROTOCOL_MINOR(conn->c_version),
+                 ic->i_flowctl ? ", flow control" : "");
+
        atomic_set(&ic->i_cq_quiesce, 0);
 
        /* Init rings and fill recv. this needs to wait until protocol
                                            NULL);
        }
 
+       conn->c_proposed_version = conn->c_version;
        rds_connect_complete(conn);
 }
 
                version = RDS_PROTOCOL_3_0;
                while ((common >>= 1) != 0)
                        version++;
+       } else if (RDS_PROTOCOL_COMPAT_VERSION ==
+                  RDS_PROTOCOL(major, minor)) {
+               version = RDS_PROTOCOL_COMPAT_VERSION;
        } else {
                if (isv6)
                        printk_ratelimited(KERN_NOTICE "RDS: Connection from %pI6c using incompatible protocol version %u.%u\n",
 
        /* If the peer doesn't do protocol negotiation, we must
         * default to RDSv3.0 */
-       rds_ib_set_protocol(conn, RDS_PROTOCOL_3_0);
+       rds_ib_set_protocol(conn, RDS_PROTOCOL_VERSION);
        ic->i_flowctl = rds_ib_sysctl_flow_control;     /* advertise flow control */
 
        ret = rds_ib_setup_qp(conn);
                goto out;
        }
 
-       rds_ib_cm_fill_conn_param(conn, &conn_param, &dp, RDS_PROTOCOL_VERSION,
+       rds_ib_cm_fill_conn_param(conn, &conn_param, &dp,
+                                 conn->c_proposed_version,
                                  UINT_MAX, UINT_MAX, isv6);
        ret = rdma_connect(cm_id, &conn_param);
        if (ret)
 
  */
 #define RDS_PROTOCOL_3_0       0x0300
 #define RDS_PROTOCOL_3_1       0x0301
+#define RDS_PROTOCOL_4_0       0x0400
+#define RDS_PROTOCOL_4_1       0x0401
 #define RDS_PROTOCOL_VERSION   RDS_PROTOCOL_3_1
 #define RDS_PROTOCOL_MAJOR(v)  ((v) >> 8)
 #define RDS_PROTOCOL_MINOR(v)  ((v) & 255)
 #define RDS_PROTOCOL(maj, min) (((maj) << 8) | min)
+#define RDS_PROTOCOL_COMPAT_VERSION    RDS_PROTOCOL_3_1
 
 /* The following ports, 16385, 18634, 18635, are registered with IANA as
  * the ports to be used for RDS over TCP and UDP.  Currently, only RDS over
        struct rds_cong_map     *c_fcong;
 
        /* Protocol version */
+       unsigned int            c_proposed_version;
        unsigned int            c_version;
        possible_net_t          c_net;