|
@@ -706,6 +706,53 @@ CIFSSMBTDis(const int xid, struct cifsTconInfo *tcon)
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * This is a no-op for now. We're not really interested in the reply, but
|
|
|
+ * rather in the fact that the server sent one and that server->lstrp
|
|
|
+ * gets updated.
|
|
|
+ *
|
|
|
+ * FIXME: maybe we should consider checking that the reply matches request?
|
|
|
+ */
|
|
|
+static void
|
|
|
+cifs_echo_callback(struct mid_q_entry *mid)
|
|
|
+{
|
|
|
+ struct TCP_Server_Info *server = mid->callback_data;
|
|
|
+
|
|
|
+ DeleteMidQEntry(mid);
|
|
|
+ atomic_dec(&server->inFlight);
|
|
|
+ wake_up(&server->request_q);
|
|
|
+}
|
|
|
+
|
|
|
+int
|
|
|
+CIFSSMBEcho(struct TCP_Server_Info *server)
|
|
|
+{
|
|
|
+ ECHO_REQ *smb;
|
|
|
+ int rc = 0;
|
|
|
+
|
|
|
+ cFYI(1, "In echo request");
|
|
|
+
|
|
|
+ rc = small_smb_init(SMB_COM_ECHO, 0, NULL, (void **)&smb);
|
|
|
+ if (rc)
|
|
|
+ return rc;
|
|
|
+
|
|
|
+ /* set up echo request */
|
|
|
+ smb->hdr.Tid = cpu_to_le16(0xffff);
|
|
|
+ smb->hdr.WordCount = cpu_to_le16(1);
|
|
|
+ smb->EchoCount = cpu_to_le16(1);
|
|
|
+ smb->ByteCount = cpu_to_le16(1);
|
|
|
+ smb->Data[0] = 'a';
|
|
|
+ smb->hdr.smb_buf_length += 3;
|
|
|
+
|
|
|
+ rc = cifs_call_async(server, (struct smb_hdr *)smb,
|
|
|
+ cifs_echo_callback, server);
|
|
|
+ if (rc)
|
|
|
+ cFYI(1, "Echo request failed: %d", rc);
|
|
|
+
|
|
|
+ cifs_small_buf_release(smb);
|
|
|
+
|
|
|
+ return rc;
|
|
|
+}
|
|
|
+
|
|
|
int
|
|
|
CIFSSMBLogoff(const int xid, struct cifsSesInfo *ses)
|
|
|
{
|