*/
 #define RTRS_RECONNECT_SEED 8
 
+#define FIRST_CONN 0x01
+
 MODULE_DESCRIPTION("RDMA Transport Client");
 MODULE_LICENSE("GPL");
 
                .cid_num = cpu_to_le16(sess->s.con_num),
                .recon_cnt = cpu_to_le16(sess->s.recon_cnt),
        };
+       msg.first_conn = sess->for_new_clt ? FIRST_CONN : 0;
        uuid_copy(&msg.sess_uuid, &sess->s.uuid);
        uuid_copy(&msg.paths_uuid, &clt->paths_uuid);
 
                scnprintf(sess->hca_name, sizeof(sess->hca_name),
                          sess->s.dev->ib_dev->name);
                sess->s.src_addr = con->c.cm_id->route.addr.src_addr;
+               /* set for_new_clt, to allow future reconnect on any path */
+               sess->for_new_clt = 1;
        }
 
        return 0;
                        err = PTR_ERR(sess);
                        goto close_all_sess;
                }
+               if (!i)
+                       sess->for_new_clt = 1;
                list_add_tail_rcu(&sess->s.entry, &clt->paths_list);
 
                err = init_sess(sess);
 
 }
 
 static struct rtrs_srv *get_or_create_srv(struct rtrs_srv_ctx *ctx,
-                                          const uuid_t *paths_uuid)
+                                         const uuid_t *paths_uuid,
+                                         bool first_conn)
 {
        struct rtrs_srv *srv;
        int i;
                        return srv;
                }
        }
+       /*
+        * If this request is not the first connection request from the
+        * client for this session then fail and return error.
+        */
+       if (!first_conn) {
+               mutex_unlock(&ctx->srv_mutex);
+               return ERR_PTR(-ENXIO);
+       }
 
        /* need to allocate a new srv */
        srv = kzalloc(sizeof(*srv), GFP_KERNEL);
        if  (!srv) {
                mutex_unlock(&ctx->srv_mutex);
-               return NULL;
+               return ERR_PTR(-ENOMEM);
        }
 
        INIT_LIST_HEAD(&srv->paths_list);
 
 err_free_srv:
        kfree(srv);
-       return NULL;
+       return ERR_PTR(-ENOMEM);
 }
 
 static void put_srv(struct rtrs_srv *srv)
                goto reject_w_econnreset;
        }
        recon_cnt = le16_to_cpu(msg->recon_cnt);
-       srv = get_or_create_srv(ctx, &msg->paths_uuid);
+       srv = get_or_create_srv(ctx, &msg->paths_uuid, msg->first_conn);
        /*
         * "refcount == 0" happens if a previous thread calls get_or_create_srv
         * allocate srv, but chunks of srv are not allocated yet.
         */
-       if (!srv || refcount_read(&srv->refcount) == 0) {
-               err = -ENOMEM;
+       if (IS_ERR(srv) || refcount_read(&srv->refcount) == 0) {
+               err = PTR_ERR(srv);
                goto reject_w_err;
        }
        mutex_lock(&srv->paths_mutex);