queue_depth);
                        return -ECONNRESET;
                }
-               if (!sess->rbufs || sess->queue_depth < queue_depth) {
+               if (sess->queue_depth > 0 && queue_depth != sess->queue_depth) {
+                       rtrs_err(clt, "Error: queue depth changed\n");
+
+                       /*
+                        * Stop any more reconnection attempts
+                        */
+                       sess->reconnect_attempts = -1;
+                       rtrs_err(clt,
+                               "Disabling auto-reconnect. Trigger a manual reconnect after issue is resolved\n");
+                       return -ECONNRESET;
+               }
+
+               if (!sess->rbufs) {
                        kfree(sess->rbufs);
                        sess->rbufs = kcalloc(queue_depth, sizeof(*sess->rbufs),
                                              GFP_KERNEL);
                sess->chunk_size = sess->max_io_size + sess->max_hdr_size;
 
                /*
-                * Global queue depth and IO size is always a minimum.
+                * Global IO size is always a minimum.
                 * If while a reconnection server sends us a value a bit
                 * higher - client does not care and uses cached minimum.
                 *
                 * connections in parallel, use lock.
                 */
                mutex_lock(&clt->paths_mutex);
-               clt->queue_depth = min_not_zero(sess->queue_depth,
-                                               clt->queue_depth);
+               clt->queue_depth = sess->queue_depth;
                clt->max_io_size = min_not_zero(sess->max_io_size,
                                                clt->max_io_size);
                mutex_unlock(&clt->paths_mutex);