Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 318496
b: refs/heads/master
c: 9094fad
h: refs/heads/master
v: v3
  • Loading branch information
Pavel Shilovsky committed Jul 24, 2012
1 parent 9ccec0b commit 7339995
Show file tree
Hide file tree
Showing 7 changed files with 74 additions and 4 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: f6d7617862e106affc59c6933099e45629af5c4e
refs/heads/master: 9094fad1ed90caebd25b1bdec3c8982d079356ee
3 changes: 3 additions & 0 deletions trunk/fs/cifs/cifsglob.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,9 @@
/* (max path length + 1 for null) * 2 for unicode */
#define MAX_NAME 514

/* SMB echo "timeout" -- FIXME: tunable? */
#define SMB_ECHO_INTERVAL (60 * HZ)

#include "cifspdu.h"

#ifndef XATTR_DOS_ATTRIB
Expand Down
3 changes: 0 additions & 3 deletions trunk/fs/cifs/connect.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,6 @@
#define CIFS_PORT 445
#define RFC1001_PORT 139

/* SMB echo "timeout" -- FIXME: tunable? */
#define SMB_ECHO_INTERVAL (60 * HZ)

extern mempool_t *cifs_req_poolp;

/* FIXME: should these be tunable? */
Expand Down
8 changes: 8 additions & 0 deletions trunk/fs/cifs/smb2ops.c
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,12 @@ smb2_build_path_to_root(struct smb_vol *vol, struct cifs_sb_info *cifs_sb,
return NULL;
}

static bool
smb2_can_echo(struct TCP_Server_Info *server)
{
return server->echoes;
}

struct smb_version_operations smb21_operations = {
.setup_request = smb2_setup_request,
.setup_async_request = smb2_setup_async_request,
Expand All @@ -226,6 +232,8 @@ struct smb_version_operations smb21_operations = {
.tree_connect = SMB2_tcon,
.tree_disconnect = SMB2_tdis,
.is_path_accessible = smb2_is_path_accessible,
.can_echo = smb2_can_echo,
.echo = SMB2_echo,
.query_path_info = smb2_query_path_info,
.get_srv_inum = smb2_get_srv_inum,
.build_path_to_root = smb2_build_path_to_root,
Expand Down
49 changes: 49 additions & 0 deletions trunk/fs/cifs/smb2pdu.c
Original file line number Diff line number Diff line change
Expand Up @@ -1074,3 +1074,52 @@ SMB2_query_info(const unsigned int xid, struct cifs_tcon *tcon,
free_rsp_buf(resp_buftype, rsp);
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
smb2_echo_callback(struct mid_q_entry *mid)
{
struct TCP_Server_Info *server = mid->callback_data;
struct smb2_echo_rsp *smb2 = (struct smb2_echo_rsp *)mid->resp_buf;
unsigned int credits_received = 1;

if (mid->mid_state == MID_RESPONSE_RECEIVED)
credits_received = le16_to_cpu(smb2->hdr.CreditRequest);

DeleteMidQEntry(mid);
add_credits(server, credits_received, CIFS_ECHO_OP);
}

int
SMB2_echo(struct TCP_Server_Info *server)
{
struct smb2_echo_req *req;
int rc = 0;
struct kvec iov;

cFYI(1, "In echo request");

rc = small_smb2_init(SMB2_ECHO, NULL, (void **)&req);
if (rc)
return rc;

req->hdr.CreditRequest = cpu_to_le16(1);

iov.iov_base = (char *)req;
/* 4 for rfc1002 length field */
iov.iov_len = get_rfc1002_length(req) + 4;

rc = cifs_call_async(server, &iov, 1, NULL, smb2_echo_callback, server,
CIFS_ECHO_OP);
if (rc)
cFYI(1, "Echo request failed: %d", rc);

cifs_small_buf_release(req);
return rc;
}
12 changes: 12 additions & 0 deletions trunk/fs/cifs/smb2pdu.h
Original file line number Diff line number Diff line change
Expand Up @@ -448,6 +448,18 @@ struct smb2_close_rsp {
__le32 Attributes;
} __packed;

struct smb2_echo_req {
struct smb2_hdr hdr;
__le16 StructureSize; /* Must be 4 */
__u16 Reserved;
} __packed;

struct smb2_echo_rsp {
struct smb2_hdr hdr;
__le16 StructureSize; /* Must be 4 */
__u16 Reserved;
} __packed;

/* Possible InfoType values */
#define SMB2_O_INFO_FILE 0x01
#define SMB2_O_INFO_FILESYSTEM 0x02
Expand Down
1 change: 1 addition & 0 deletions trunk/fs/cifs/smb2proto.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,5 +73,6 @@ extern int SMB2_close(const unsigned int xid, struct cifs_tcon *tcon,
extern int SMB2_query_info(const unsigned int xid, struct cifs_tcon *tcon,
u64 persistent_file_id, u64 volatile_file_id,
struct smb2_file_all_info *data);
extern int SMB2_echo(struct TCP_Server_Info *server);

#endif /* _SMB2PROTO_H */

0 comments on commit 7339995

Please sign in to comment.