u32 data_offset = 0;
u32 data_length = 0;
u32 remaining_data_length = 0;
+ bool negotiate_done = false;
log_rdma_recv(INFO, "response=0x%p type=%d wc status=%d wc opcode %d byte_len=%d pkey_index=%u\n",
response, sc->recv_io.expected, wc->status, wc->opcode,
case SMBDIRECT_EXPECT_NEGOTIATE_REP:
dump_smbdirect_negotiate_resp(smbdirect_recv_io_payload(response));
sc->recv_io.reassembly.full_packet_received = true;
- info->negotiate_done =
+ negotiate_done =
process_negotiation_response(response, wc->byte_len);
put_receive_buffer(info, response);
WARN_ON_ONCE(sc->status != SMBDIRECT_SOCKET_NEGOTIATE_RUNNING);
- if (!info->negotiate_done)
+ if (!negotiate_done)
sc->status = SMBDIRECT_SOCKET_NEGOTIATE_FAILED;
else
sc->status = SMBDIRECT_SOCKET_CONNECTED;
- complete(&info->negotiate_completion);
+ wake_up_interruptible(&info->status_wait);
return;
/* SMBD data transfer packet */
return rc;
}
- init_completion(&info->negotiate_completion);
- info->negotiate_done = false;
rc = smbd_post_send_negotiate_req(info);
if (rc)
return rc;
- rc = wait_for_completion_interruptible_timeout(
- &info->negotiate_completion, SMBD_NEGOTIATE_TIMEOUT * HZ);
- log_rdma_event(INFO, "wait_for_completion_timeout rc=%d\n", rc);
+ rc = wait_event_interruptible_timeout(
+ info->status_wait,
+ sc->status != SMBDIRECT_SOCKET_NEGOTIATE_RUNNING,
+ secs_to_jiffies(SMBD_NEGOTIATE_TIMEOUT));
+ log_rdma_event(INFO, "wait_event_interruptible_timeout rc=%d\n", rc);
- if (info->negotiate_done)
+ if (sc->status == SMBDIRECT_SOCKET_CONNECTED)
return 0;
if (rc == 0)