Commit afe6f653 authored by Ronnie Sahlberg's avatar Ronnie Sahlberg Committed by Steve French

cifs: add new debugging macro cifs_server_dbg

which can be used from contexts where we have a TCP_Server_Info *server.
This new macro will prepend the debugging string with "Server:<servername> "
which will help when debugging issues on hosts with many cifs connections
to several different servers.

Convert a bunch of cifs_dbg(VFS) calls to cifs_server_dbg(VFS)
Signed-off-by: default avatarRonnie Sahlberg <lsahlber@redhat.com>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent dc9300a6
...@@ -80,6 +80,30 @@ do { \ ...@@ -80,6 +80,30 @@ do { \
type, fmt, ##__VA_ARGS__); \ type, fmt, ##__VA_ARGS__); \
} while (0) } while (0)
#define cifs_server_dbg_func(ratefunc, type, fmt, ...) \
do { \
if ((type) & FYI && cifsFYI & CIFS_INFO) { \
pr_debug_ ## ratefunc("%s: Server:%s " fmt, \
__FILE__, server->hostname, ##__VA_ARGS__);\
} else if ((type) & VFS) { \
pr_err_ ## ratefunc("CIFS VFS: Server:%s " fmt, \
server->hostname, ##__VA_ARGS__); \
} else if ((type) & NOISY && (NOISY != 0)) { \
pr_debug_ ## ratefunc("Server:%s " fmt, \
server->hostname, ##__VA_ARGS__); \
} \
} while (0)
#define cifs_server_dbg(type, fmt, ...) \
do { \
if ((type) & ONCE) \
cifs_server_dbg_func(once, \
type, fmt, ##__VA_ARGS__); \
else \
cifs_server_dbg_func(ratelimited, \
type, fmt, ##__VA_ARGS__); \
} while (0)
/* /*
* debug OFF * debug OFF
* --------- * ---------
...@@ -91,6 +115,13 @@ do { \ ...@@ -91,6 +115,13 @@ do { \
pr_debug(fmt, ##__VA_ARGS__); \ pr_debug(fmt, ##__VA_ARGS__); \
} while (0) } while (0)
#define cifs_server_dbg(type, fmt, ...) \
do { \
if (0) \
pr_debug("Server:%s " fmt, \
server->hostname, ##__VA_ARGS__); \
} while (0)
#define cifs_info(fmt, ...) \ #define cifs_info(fmt, ...) \
do { \ do { \
pr_info("CIFS: "fmt, ##__VA_ARGS__); \ pr_info("CIFS: "fmt, ##__VA_ARGS__); \
......
...@@ -489,7 +489,7 @@ cifs_reconnect(struct TCP_Server_Info *server) ...@@ -489,7 +489,7 @@ cifs_reconnect(struct TCP_Server_Info *server)
} else { } else {
rc = reconn_setup_dfs_targets(cifs_sb, &tgt_list, &tgt_it); rc = reconn_setup_dfs_targets(cifs_sb, &tgt_list, &tgt_it);
if (rc && (rc != -EOPNOTSUPP)) { if (rc && (rc != -EOPNOTSUPP)) {
cifs_dbg(VFS, "%s: no target servers for DFS failover\n", cifs_server_dbg(VFS, "%s: no target servers for DFS failover\n",
__func__); __func__);
} else { } else {
server->nr_targets = dfs_cache_get_nr_tgts(&tgt_list); server->nr_targets = dfs_cache_get_nr_tgts(&tgt_list);
...@@ -617,12 +617,12 @@ cifs_reconnect(struct TCP_Server_Info *server) ...@@ -617,12 +617,12 @@ cifs_reconnect(struct TCP_Server_Info *server)
rc = dfs_cache_noreq_update_tgthint(cifs_sb->origin_fullpath + 1, rc = dfs_cache_noreq_update_tgthint(cifs_sb->origin_fullpath + 1,
tgt_it); tgt_it);
if (rc) { if (rc) {
cifs_dbg(VFS, "%s: failed to update DFS target hint: rc = %d\n", cifs_server_dbg(VFS, "%s: failed to update DFS target hint: rc = %d\n",
__func__, rc); __func__, rc);
} }
rc = dfs_cache_update_vol(cifs_sb->origin_fullpath, server); rc = dfs_cache_update_vol(cifs_sb->origin_fullpath, server);
if (rc) { if (rc) {
cifs_dbg(VFS, "%s: failed to update vol info in DFS cache: rc = %d\n", cifs_server_dbg(VFS, "%s: failed to update vol info in DFS cache: rc = %d\n",
__func__, rc); __func__, rc);
} }
dfs_cache_free_tgts(&tgt_list); dfs_cache_free_tgts(&tgt_list);
...@@ -678,7 +678,7 @@ allocate_buffers(struct TCP_Server_Info *server) ...@@ -678,7 +678,7 @@ allocate_buffers(struct TCP_Server_Info *server)
if (!server->bigbuf) { if (!server->bigbuf) {
server->bigbuf = (char *)cifs_buf_get(); server->bigbuf = (char *)cifs_buf_get();
if (!server->bigbuf) { if (!server->bigbuf) {
cifs_dbg(VFS, "No memory for large SMB response\n"); cifs_server_dbg(VFS, "No memory for large SMB response\n");
msleep(3000); msleep(3000);
/* retry will check if exiting */ /* retry will check if exiting */
return false; return false;
...@@ -691,7 +691,7 @@ allocate_buffers(struct TCP_Server_Info *server) ...@@ -691,7 +691,7 @@ allocate_buffers(struct TCP_Server_Info *server)
if (!server->smallbuf) { if (!server->smallbuf) {
server->smallbuf = (char *)cifs_small_buf_get(); server->smallbuf = (char *)cifs_small_buf_get();
if (!server->smallbuf) { if (!server->smallbuf) {
cifs_dbg(VFS, "No memory for SMB response\n"); cifs_server_dbg(VFS, "No memory for SMB response\n");
msleep(1000); msleep(1000);
/* retry will check if exiting */ /* retry will check if exiting */
return false; return false;
...@@ -722,8 +722,8 @@ server_unresponsive(struct TCP_Server_Info *server) ...@@ -722,8 +722,8 @@ server_unresponsive(struct TCP_Server_Info *server)
if ((server->tcpStatus == CifsGood || if ((server->tcpStatus == CifsGood ||
server->tcpStatus == CifsNeedNegotiate) && server->tcpStatus == CifsNeedNegotiate) &&
time_after(jiffies, server->lstrp + 3 * server->echo_interval)) { time_after(jiffies, server->lstrp + 3 * server->echo_interval)) {
cifs_dbg(VFS, "Server %s has not responded in %lu seconds. Reconnecting...\n", cifs_server_dbg(VFS, "has not responded in %lu seconds. Reconnecting...\n",
server->hostname, (3 * server->echo_interval) / HZ); (3 * server->echo_interval) / HZ);
cifs_reconnect(server); cifs_reconnect(server);
wake_up(&server->response_q); wake_up(&server->response_q);
return true; return true;
...@@ -861,7 +861,7 @@ is_smb_response(struct TCP_Server_Info *server, unsigned char type) ...@@ -861,7 +861,7 @@ is_smb_response(struct TCP_Server_Info *server, unsigned char type)
wake_up(&server->response_q); wake_up(&server->response_q);
break; break;
default: default:
cifs_dbg(VFS, "RFC 1002 unknown response type 0x%x\n", type); cifs_server_dbg(VFS, "RFC 1002 unknown response type 0x%x\n", type);
cifs_reconnect(server); cifs_reconnect(server);
} }
...@@ -1008,7 +1008,7 @@ standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid) ...@@ -1008,7 +1008,7 @@ standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
/* make sure this will fit in a large buffer */ /* make sure this will fit in a large buffer */
if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) - if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) -
server->vals->header_preamble_size) { server->vals->header_preamble_size) {
cifs_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length); cifs_server_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length);
cifs_reconnect(server); cifs_reconnect(server);
wake_up(&server->response_q); wake_up(&server->response_q);
return -ECONNABORTED; return -ECONNABORTED;
...@@ -1149,7 +1149,7 @@ cifs_demultiplex_thread(void *p) ...@@ -1149,7 +1149,7 @@ cifs_demultiplex_thread(void *p)
/* make sure we have enough to get to the MID */ /* make sure we have enough to get to the MID */
if (server->pdu_size < HEADER_SIZE(server) - 1 - if (server->pdu_size < HEADER_SIZE(server) - 1 -
server->vals->header_preamble_size) { server->vals->header_preamble_size) {
cifs_dbg(VFS, "SMB response too short (%u bytes)\n", cifs_server_dbg(VFS, "SMB response too short (%u bytes)\n",
server->pdu_size); server->pdu_size);
cifs_reconnect(server); cifs_reconnect(server);
wake_up(&server->response_q); wake_up(&server->response_q);
...@@ -1222,7 +1222,7 @@ cifs_demultiplex_thread(void *p) ...@@ -1222,7 +1222,7 @@ cifs_demultiplex_thread(void *p)
smb2_add_credits_from_hdr(bufs[i], server); smb2_add_credits_from_hdr(bufs[i], server);
cifs_dbg(FYI, "Received oplock break\n"); cifs_dbg(FYI, "Received oplock break\n");
} else { } else {
cifs_dbg(VFS, "No task to wake, unknown frame " cifs_server_dbg(VFS, "No task to wake, unknown frame "
"received! NumMids %d\n", "received! NumMids %d\n",
atomic_read(&midCount)); atomic_read(&midCount));
cifs_dump_mem("Received Data is: ", bufs[i], cifs_dump_mem("Received Data is: ", bufs[i],
...@@ -2840,16 +2840,17 @@ cifs_setup_ipc(struct cifs_ses *ses, struct smb_vol *volume_info) ...@@ -2840,16 +2840,17 @@ cifs_setup_ipc(struct cifs_ses *ses, struct smb_vol *volume_info)
struct nls_table *nls_codepage; struct nls_table *nls_codepage;
char unc[SERVER_NAME_LENGTH + sizeof("//x/IPC$")] = {0}; char unc[SERVER_NAME_LENGTH + sizeof("//x/IPC$")] = {0};
bool seal = false; bool seal = false;
struct TCP_Server_Info *server = ses->server;
/* /*
* If the mount request that resulted in the creation of the * If the mount request that resulted in the creation of the
* session requires encryption, force IPC to be encrypted too. * session requires encryption, force IPC to be encrypted too.
*/ */
if (volume_info->seal) { if (volume_info->seal) {
if (ses->server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION) if (server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)
seal = true; seal = true;
else { else {
cifs_dbg(VFS, cifs_server_dbg(VFS,
"IPC: server doesn't support encryption\n"); "IPC: server doesn't support encryption\n");
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
...@@ -2859,7 +2860,7 @@ cifs_setup_ipc(struct cifs_ses *ses, struct smb_vol *volume_info) ...@@ -2859,7 +2860,7 @@ cifs_setup_ipc(struct cifs_ses *ses, struct smb_vol *volume_info)
if (tcon == NULL) if (tcon == NULL)
return -ENOMEM; return -ENOMEM;
scnprintf(unc, sizeof(unc), "\\\\%s\\IPC$", ses->server->hostname); scnprintf(unc, sizeof(unc), "\\\\%s\\IPC$", server->hostname);
/* cannot fail */ /* cannot fail */
nls_codepage = load_nls_default(); nls_codepage = load_nls_default();
...@@ -2868,11 +2869,11 @@ cifs_setup_ipc(struct cifs_ses *ses, struct smb_vol *volume_info) ...@@ -2868,11 +2869,11 @@ cifs_setup_ipc(struct cifs_ses *ses, struct smb_vol *volume_info)
tcon->ses = ses; tcon->ses = ses;
tcon->ipc = true; tcon->ipc = true;
tcon->seal = seal; tcon->seal = seal;
rc = ses->server->ops->tree_connect(xid, ses, unc, tcon, nls_codepage); rc = server->ops->tree_connect(xid, ses, unc, tcon, nls_codepage);
free_xid(xid); free_xid(xid);
if (rc) { if (rc) {
cifs_dbg(VFS, "failed to connect to IPC (rc=%d)\n", rc); cifs_server_dbg(VFS, "failed to connect to IPC (rc=%d)\n", rc);
tconInfoFree(tcon); tconInfoFree(tcon);
goto out; goto out;
} }
...@@ -2958,7 +2959,7 @@ void cifs_put_smb_ses(struct cifs_ses *ses) ...@@ -2958,7 +2959,7 @@ void cifs_put_smb_ses(struct cifs_ses *ses)
xid = get_xid(); xid = get_xid();
rc = server->ops->logoff(xid, ses); rc = server->ops->logoff(xid, ses);
if (rc) if (rc)
cifs_dbg(VFS, "%s: Session Logoff failure rc=%d\n", cifs_server_dbg(VFS, "%s: Session Logoff failure rc=%d\n",
__func__, rc); __func__, rc);
_free_xid(xid); _free_xid(xid);
} }
...@@ -3659,10 +3660,10 @@ bind_socket(struct TCP_Server_Info *server) ...@@ -3659,10 +3660,10 @@ bind_socket(struct TCP_Server_Info *server)
saddr4 = (struct sockaddr_in *)&server->srcaddr; saddr4 = (struct sockaddr_in *)&server->srcaddr;
saddr6 = (struct sockaddr_in6 *)&server->srcaddr; saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
if (saddr6->sin6_family == AF_INET6) if (saddr6->sin6_family == AF_INET6)
cifs_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n", cifs_server_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n",
&saddr6->sin6_addr, rc); &saddr6->sin6_addr, rc);
else else
cifs_dbg(VFS, "Failed to bind to: %pI4, error: %d\n", cifs_server_dbg(VFS, "Failed to bind to: %pI4, error: %d\n",
&saddr4->sin_addr.s_addr, rc); &saddr4->sin_addr.s_addr, rc);
} }
} }
...@@ -3766,7 +3767,7 @@ generic_ip_connect(struct TCP_Server_Info *server) ...@@ -3766,7 +3767,7 @@ generic_ip_connect(struct TCP_Server_Info *server)
rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM, rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
IPPROTO_TCP, &socket, 1); IPPROTO_TCP, &socket, 1);
if (rc < 0) { if (rc < 0) {
cifs_dbg(VFS, "Error %d creating socket\n", rc); cifs_server_dbg(VFS, "Error %d creating socket\n", rc);
server->ssocket = NULL; server->ssocket = NULL;
return rc; return rc;
} }
...@@ -4150,7 +4151,7 @@ static int mount_get_conns(struct smb_vol *vol, struct cifs_sb_info *cifs_sb, ...@@ -4150,7 +4151,7 @@ static int mount_get_conns(struct smb_vol *vol, struct cifs_sb_info *cifs_sb,
if ((vol->persistent == true) && (!(ses->server->capabilities & if ((vol->persistent == true) && (!(ses->server->capabilities &
SMB2_GLOBAL_CAP_PERSISTENT_HANDLES))) { SMB2_GLOBAL_CAP_PERSISTENT_HANDLES))) {
cifs_dbg(VFS, "persistent handles not supported by server\n"); cifs_server_dbg(VFS, "persistent handles not supported by server\n");
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
...@@ -4588,7 +4589,7 @@ static int is_path_remote(struct cifs_sb_info *cifs_sb, struct smb_vol *vol, ...@@ -4588,7 +4589,7 @@ static int is_path_remote(struct cifs_sb_info *cifs_sb, struct smb_vol *vol,
rc = cifs_are_all_path_components_accessible(server, xid, tcon, rc = cifs_are_all_path_components_accessible(server, xid, tcon,
cifs_sb, full_path, tcon->Flags & SMB_SHARE_IS_IN_DFS); cifs_sb, full_path, tcon->Flags & SMB_SHARE_IS_IN_DFS);
if (rc != 0) { if (rc != 0) {
cifs_dbg(VFS, "cannot query dirs between root and final path, " cifs_server_dbg(VFS, "cannot query dirs between root and final path, "
"enabling CIFS_MOUNT_USE_PREFIX_PATH\n"); "enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH; cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
rc = 0; rc = 0;
...@@ -5090,7 +5091,7 @@ cifs_setup_session(const unsigned int xid, struct cifs_ses *ses, ...@@ -5090,7 +5091,7 @@ cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
rc = server->ops->sess_setup(xid, ses, nls_info); rc = server->ops->sess_setup(xid, ses, nls_info);
if (rc) if (rc)
cifs_dbg(VFS, "Send error in SessSetup = %d\n", rc); cifs_server_dbg(VFS, "Send error in SessSetup = %d\n", rc);
return rc; return rc;
} }
......
...@@ -542,7 +542,7 @@ assemble_neg_contexts(struct smb2_negotiate_req *req, ...@@ -542,7 +542,7 @@ assemble_neg_contexts(struct smb2_negotiate_req *req,
if (*total_len > 200) { if (*total_len > 200) {
/* In case length corrupted don't want to overrun smb buffer */ /* In case length corrupted don't want to overrun smb buffer */
cifs_dbg(VFS, "Bad frame length assembling neg contexts\n"); cifs_server_dbg(VFS, "Bad frame length assembling neg contexts\n");
return; return;
} }
...@@ -660,7 +660,7 @@ static int smb311_decode_neg_context(struct smb2_negotiate_rsp *rsp, ...@@ -660,7 +660,7 @@ static int smb311_decode_neg_context(struct smb2_negotiate_rsp *rsp,
cifs_dbg(FYI, "decoding %d negotiate contexts\n", ctxt_cnt); cifs_dbg(FYI, "decoding %d negotiate contexts\n", ctxt_cnt);
if (len_of_smb <= offset) { if (len_of_smb <= offset) {
cifs_dbg(VFS, "Invalid response: negotiate context offset\n"); cifs_server_dbg(VFS, "Invalid response: negotiate context offset\n");
return -EINVAL; return -EINVAL;
} }
...@@ -692,7 +692,7 @@ static int smb311_decode_neg_context(struct smb2_negotiate_rsp *rsp, ...@@ -692,7 +692,7 @@ static int smb311_decode_neg_context(struct smb2_negotiate_rsp *rsp,
else if (pctx->ContextType == SMB2_POSIX_EXTENSIONS_AVAILABLE) else if (pctx->ContextType == SMB2_POSIX_EXTENSIONS_AVAILABLE)
server->posix_ext_supported = true; server->posix_ext_supported = true;
else else
cifs_dbg(VFS, "unknown negcontext of type %d ignored\n", cifs_server_dbg(VFS, "unknown negcontext of type %d ignored\n",
le16_to_cpu(pctx->ContextType)); le16_to_cpu(pctx->ContextType));
if (rc) if (rc)
...@@ -817,7 +817,7 @@ SMB2_negotiate(const unsigned int xid, struct cifs_ses *ses) ...@@ -817,7 +817,7 @@ SMB2_negotiate(const unsigned int xid, struct cifs_ses *ses)
req->Dialects[1] = cpu_to_le16(SMB302_PROT_ID); req->Dialects[1] = cpu_to_le16(SMB302_PROT_ID);
req->DialectCount = cpu_to_le16(2); req->DialectCount = cpu_to_le16(2);
total_len += 4; total_len += 4;
} else if (strcmp(ses->server->vals->version_string, } else if (strcmp(server->vals->version_string,
SMBDEFAULT_VERSION_STRING) == 0) { SMBDEFAULT_VERSION_STRING) == 0) {
req->Dialects[0] = cpu_to_le16(SMB21_PROT_ID); req->Dialects[0] = cpu_to_le16(SMB21_PROT_ID);
req->Dialects[1] = cpu_to_le16(SMB30_PROT_ID); req->Dialects[1] = cpu_to_le16(SMB30_PROT_ID);
...@@ -840,16 +840,16 @@ SMB2_negotiate(const unsigned int xid, struct cifs_ses *ses) ...@@ -840,16 +840,16 @@ SMB2_negotiate(const unsigned int xid, struct cifs_ses *ses)
else else
req->SecurityMode = 0; req->SecurityMode = 0;
req->Capabilities = cpu_to_le32(ses->server->vals->req_capabilities); req->Capabilities = cpu_to_le32(server->vals->req_capabilities);
/* ClientGUID must be zero for SMB2.02 dialect */ /* ClientGUID must be zero for SMB2.02 dialect */
if (ses->server->vals->protocol_id == SMB20_PROT_ID) if (server->vals->protocol_id == SMB20_PROT_ID)
memset(req->ClientGUID, 0, SMB2_CLIENT_GUID_SIZE); memset(req->ClientGUID, 0, SMB2_CLIENT_GUID_SIZE);
else { else {
memcpy(req->ClientGUID, server->client_guid, memcpy(req->ClientGUID, server->client_guid,
SMB2_CLIENT_GUID_SIZE); SMB2_CLIENT_GUID_SIZE);
if ((ses->server->vals->protocol_id == SMB311_PROT_ID) || if ((server->vals->protocol_id == SMB311_PROT_ID) ||
(strcmp(ses->server->vals->version_string, (strcmp(server->vals->version_string,
SMBDEFAULT_VERSION_STRING) == 0)) SMBDEFAULT_VERSION_STRING) == 0))
assemble_neg_contexts(req, server, &total_len); assemble_neg_contexts(req, server, &total_len);
} }
...@@ -868,42 +868,42 @@ SMB2_negotiate(const unsigned int xid, struct cifs_ses *ses) ...@@ -868,42 +868,42 @@ SMB2_negotiate(const unsigned int xid, struct cifs_ses *ses)
* cifs_stats_inc(&tcon->stats.smb2_stats.smb2_com_fail[SMB2...]); * cifs_stats_inc(&tcon->stats.smb2_stats.smb2_com_fail[SMB2...]);
*/ */
if (rc == -EOPNOTSUPP) { if (rc == -EOPNOTSUPP) {
cifs_dbg(VFS, "Dialect not supported by server. Consider " cifs_server_dbg(VFS, "Dialect not supported by server. Consider "
"specifying vers=1.0 or vers=2.0 on mount for accessing" "specifying vers=1.0 or vers=2.0 on mount for accessing"
" older servers\n"); " older servers\n");
goto neg_exit; goto neg_exit;
} else if (rc != 0) } else if (rc != 0)
goto neg_exit; goto neg_exit;
if (strcmp(ses->server->vals->version_string, if (strcmp(server->vals->version_string,
SMB3ANY_VERSION_STRING) == 0) { SMB3ANY_VERSION_STRING) == 0) {
if (rsp->DialectRevision == cpu_to_le16(SMB20_PROT_ID)) { if (rsp->DialectRevision == cpu_to_le16(SMB20_PROT_ID)) {
cifs_dbg(VFS, cifs_server_dbg(VFS,
"SMB2 dialect returned but not requested\n"); "SMB2 dialect returned but not requested\n");
return -EIO; return -EIO;
} else if (rsp->DialectRevision == cpu_to_le16(SMB21_PROT_ID)) { } else if (rsp->DialectRevision == cpu_to_le16(SMB21_PROT_ID)) {
cifs_dbg(VFS, cifs_server_dbg(VFS,
"SMB2.1 dialect returned but not requested\n"); "SMB2.1 dialect returned but not requested\n");
return -EIO; return -EIO;
} }
} else if (strcmp(ses->server->vals->version_string, } else if (strcmp(server->vals->version_string,
SMBDEFAULT_VERSION_STRING) == 0) { SMBDEFAULT_VERSION_STRING) == 0) {
if (rsp->DialectRevision == cpu_to_le16(SMB20_PROT_ID)) { if (rsp->DialectRevision == cpu_to_le16(SMB20_PROT_ID)) {
cifs_dbg(VFS, cifs_server_dbg(VFS,
"SMB2 dialect returned but not requested\n"); "SMB2 dialect returned but not requested\n");
return -EIO; return -EIO;
} else if (rsp->DialectRevision == cpu_to_le16(SMB21_PROT_ID)) { } else if (rsp->DialectRevision == cpu_to_le16(SMB21_PROT_ID)) {
/* ops set to 3.0 by default for default so update */ /* ops set to 3.0 by default for default so update */
ses->server->ops = &smb21_operations; server->ops = &smb21_operations;
ses->server->vals = &smb21_values; server->vals = &smb21_values;
} else if (rsp->DialectRevision == cpu_to_le16(SMB311_PROT_ID)) { } else if (rsp->DialectRevision == cpu_to_le16(SMB311_PROT_ID)) {
ses->server->ops = &smb311_operations; server->ops = &smb311_operations;
ses->server->vals = &smb311_values; server->vals = &smb311_values;
} }
} else if (le16_to_cpu(rsp->DialectRevision) != } else if (le16_to_cpu(rsp->DialectRevision) !=
ses->server->vals->protocol_id) { server->vals->protocol_id) {
/* if requested single dialect ensure returned dialect matched */ /* if requested single dialect ensure returned dialect matched */
cifs_dbg(VFS, "Illegal 0x%x dialect returned: not requested\n", cifs_server_dbg(VFS, "Illegal 0x%x dialect returned: not requested\n",
le16_to_cpu(rsp->DialectRevision)); le16_to_cpu(rsp->DialectRevision));
return -EIO; return -EIO;
} }
...@@ -921,7 +921,7 @@ SMB2_negotiate(const unsigned int xid, struct cifs_ses *ses) ...@@ -921,7 +921,7 @@ SMB2_negotiate(const unsigned int xid, struct cifs_ses *ses)
else if (rsp->DialectRevision == cpu_to_le16(SMB311_PROT_ID)) else if (rsp->DialectRevision == cpu_to_le16(SMB311_PROT_ID))
cifs_dbg(FYI, "negotiated smb3.1.1 dialect\n"); cifs_dbg(FYI, "negotiated smb3.1.1 dialect\n");
else { else {
cifs_dbg(VFS, "Illegal dialect returned by server 0x%x\n", cifs_server_dbg(VFS, "Illegal dialect returned by server 0x%x\n",
le16_to_cpu(rsp->DialectRevision)); le16_to_cpu(rsp->DialectRevision));
rc = -EIO; rc = -EIO;
goto neg_exit; goto neg_exit;
...@@ -981,7 +981,7 @@ SMB2_negotiate(const unsigned int xid, struct cifs_ses *ses) ...@@ -981,7 +981,7 @@ SMB2_negotiate(const unsigned int xid, struct cifs_ses *ses)
rc = smb311_decode_neg_context(rsp, server, rc = smb311_decode_neg_context(rsp, server,
rsp_iov.iov_len); rsp_iov.iov_len);
else else
cifs_dbg(VFS, "Missing expected negotiate contexts\n"); cifs_server_dbg(VFS, "Missing expected negotiate contexts\n");
} }
neg_exit: neg_exit:
free_rsp_buf(resp_buftype, rsp); free_rsp_buf(resp_buftype, rsp);
...@@ -995,11 +995,12 @@ int smb3_validate_negotiate(const unsigned int xid, struct cifs_tcon *tcon) ...@@ -995,11 +995,12 @@ int smb3_validate_negotiate(const unsigned int xid, struct cifs_tcon *tcon)
struct validate_negotiate_info_rsp *pneg_rsp = NULL; struct validate_negotiate_info_rsp *pneg_rsp = NULL;
u32 rsplen; u32 rsplen;
u32 inbuflen; /* max of 4 dialects */ u32 inbuflen; /* max of 4 dialects */
struct TCP_Server_Info *server = tcon->ses->server;
cifs_dbg(FYI, "validate negotiate\n"); cifs_dbg(FYI, "validate negotiate\n");
/* In SMB3.11 preauth integrity supersedes validate negotiate */ /* In SMB3.11 preauth integrity supersedes validate negotiate */
if (tcon->ses->server->dialect == SMB311_PROT_ID) if (server->dialect == SMB311_PROT_ID)
return 0; return 0;
/* /*
...@@ -1018,15 +1019,15 @@ int smb3_validate_negotiate(const unsigned int xid, struct cifs_tcon *tcon) ...@@ -1018,15 +1019,15 @@ int smb3_validate_negotiate(const unsigned int xid, struct cifs_tcon *tcon)
} }
if (tcon->ses->session_flags & SMB2_SESSION_FLAG_IS_NULL) if (tcon->ses->session_flags & SMB2_SESSION_FLAG_IS_NULL)
cifs_dbg(VFS, "Unexpected null user (anonymous) auth flag sent by server\n"); cifs_server_dbg(VFS, "Unexpected null user (anonymous) auth flag sent by server\n");
pneg_inbuf = kmalloc(sizeof(*pneg_inbuf), GFP_NOFS); pneg_inbuf = kmalloc(sizeof(*pneg_inbuf), GFP_NOFS);
if (!pneg_inbuf) if (!pneg_inbuf)
return -ENOMEM; return -ENOMEM;
pneg_inbuf->Capabilities = pneg_inbuf->Capabilities =
cpu_to_le32(tcon->ses->server->vals->req_capabilities); cpu_to_le32(server->vals->req_capabilities);
memcpy(pneg_inbuf->Guid, tcon->ses->server->client_guid, memcpy(pneg_inbuf->Guid, server->client_guid,
SMB2_CLIENT_GUID_SIZE); SMB2_CLIENT_GUID_SIZE);
if (tcon->ses->sign) if (tcon->ses->sign)
...@@ -1039,7 +1040,7 @@ int smb3_validate_negotiate(const unsigned int xid, struct cifs_tcon *tcon) ...@@ -1039,7 +1040,7 @@ int smb3_validate_negotiate(const unsigned int xid, struct cifs_tcon *tcon)
pneg_inbuf->SecurityMode = 0; pneg_inbuf->SecurityMode = 0;
if (strcmp(tcon->ses->server->vals->version_string, if (strcmp(server->vals->version_string,
SMB3ANY_VERSION_STRING) == 0) { SMB3ANY_VERSION_STRING) == 0) {
pneg_inbuf->Dialects[0] = cpu_to_le16(SMB30_PROT_ID); pneg_inbuf->Dialects[0] = cpu_to_le16(SMB30_PROT_ID);
pneg_inbuf->Dialects[1] = cpu_to_le16(SMB302_PROT_ID); pneg_inbuf->Dialects[1] = cpu_to_le16(SMB302_PROT_ID);
...@@ -1047,7 +1048,7 @@ int smb3_validate_negotiate(const unsigned int xid, struct cifs_tcon *tcon) ...@@ -1047,7 +1048,7 @@ int smb3_validate_negotiate(const unsigned int xid, struct cifs_tcon *tcon)
/* structure is big enough for 3 dialects, sending only 2 */ /* structure is big enough for 3 dialects, sending only 2 */
inbuflen = sizeof(*pneg_inbuf) - inbuflen = sizeof(*pneg_inbuf) -
(2 * sizeof(pneg_inbuf->Dialects[0])); (2 * sizeof(pneg_inbuf->Dialects[0]));
} else if (strcmp(tcon->ses->server->vals->version_string, } else if (strcmp(server->vals->version_string,
SMBDEFAULT_VERSION_STRING) == 0) { SMBDEFAULT_VERSION_STRING) == 0) {
pneg_inbuf->Dialects[0] = cpu_to_le16(SMB21_PROT_ID); pneg_inbuf->Dialects[0] = cpu_to_le16(SMB21_PROT_ID);
pneg_inbuf->Dialects[1] = cpu_to_le16(SMB30_PROT_ID); pneg_inbuf->Dialects[1] = cpu_to_le16(SMB30_PROT_ID);
...@@ -1059,7 +1060,7 @@ int smb3_validate_negotiate(const unsigned int xid, struct cifs_tcon *tcon) ...@@ -1059,7 +1060,7 @@ int smb3_validate_negotiate(const unsigned int xid, struct cifs_tcon *tcon)
} else { } else {
/* otherwise specific dialect was requested */ /* otherwise specific dialect was requested */
pneg_inbuf->Dialects[0] = pneg_inbuf->Dialects[0] =
cpu_to_le16(tcon->ses->server->vals->protocol_id); cpu_to_le16(server->vals->protocol_id);
pneg_inbuf->DialectCount = cpu_to_le16(1); pneg_inbuf->DialectCount = cpu_to_le16(1);
/* structure is big enough for 3 dialects, sending only 1 */ /* structure is big enough for 3 dialects, sending only 1 */
inbuflen = sizeof(*pneg_inbuf) - inbuflen = sizeof(*pneg_inbuf) -
...@@ -1075,18 +1076,18 @@ int smb3_validate_negotiate(const unsigned int xid, struct cifs_tcon *tcon) ...@@ -1075,18 +1076,18 @@ int smb3_validate_negotiate(const unsigned int xid, struct cifs_tcon *tcon)
* Old Windows versions or Netapp SMB server can return * Old Windows versions or Netapp SMB server can return
* not supported error. Client should accept it. * not supported error. Client should accept it.
*/ */
cifs_dbg(VFS, "Server does not support validate negotiate\n"); cifs_server_dbg(VFS, "Server does not support validate negotiate\n");
rc = 0; rc = 0;
goto out_free_inbuf; goto out_free_inbuf;
} else if (rc != 0) { } else if (rc != 0) {
cifs_dbg(VFS, "validate protocol negotiate failed: %d\n", rc); cifs_server_dbg(VFS, "validate protocol negotiate failed: %d\n", rc);
rc = -EIO; rc = -EIO;
goto out_free_inbuf; goto out_free_inbuf;
} }
rc = -EIO; rc = -EIO;
if (rsplen != sizeof(*pneg_rsp)) { if (rsplen != sizeof(*pneg_rsp)) {
cifs_dbg(VFS, "invalid protocol negotiate response size: %d\n", cifs_server_dbg(VFS, "invalid protocol negotiate response size: %d\n",
rsplen); rsplen);
/* relax check since Mac returns max bufsize allowed on ioctl */ /* relax check since Mac returns max bufsize allowed on ioctl */
...@@ -1095,16 +1096,16 @@ int smb3_validate_negotiate(const unsigned int xid, struct cifs_tcon *tcon) ...@@ -1095,16 +1096,16 @@ int smb3_validate_negotiate(const unsigned int xid, struct cifs_tcon *tcon)
} }
/* check validate negotiate info response matches what we got earlier */ /* check validate negotiate info response matches what we got earlier */
if (pneg_rsp->Dialect != cpu_to_le16(tcon->ses->server->dialect)) if (pneg_rsp->Dialect != cpu_to_le16(server->dialect))
goto vneg_out; goto vneg_out;
if (pneg_rsp->SecurityMode != cpu_to_le16(tcon->ses->server->sec_mode)) if (pneg_rsp->SecurityMode != cpu_to_le16(server->sec_mode))
goto vneg_out; goto vneg_out;
/* do not validate server guid because not saved at negprot time yet */ /* do not validate server guid because not saved at negprot time yet */
if ((le32_to_cpu(pneg_rsp->Capabilities) | SMB2_NT_FIND | if ((le32_to_cpu(pneg_rsp->Capabilities) | SMB2_NT_FIND |
SMB2_LARGE_FILES) != tcon->ses->server->capabilities) SMB2_LARGE_FILES) != server->capabilities)
goto vneg_out; goto vneg_out;
/* validate negotiate successful */ /* validate negotiate successful */
...@@ -1113,7 +1114,7 @@ int smb3_validate_negotiate(const unsigned int xid, struct cifs_tcon *tcon) ...@@ -1113,7 +1114,7 @@ int smb3_validate_negotiate(const unsigned int xid, struct cifs_tcon *tcon)
goto out_free_rsp; goto out_free_rsp;
vneg_out: vneg_out:
cifs_dbg(VFS, "protocol revalidation - security settings mismatch\n"); cifs_server_dbg(VFS, "protocol revalidation - security settings mismatch\n");
out_free_rsp: out_free_rsp:
kfree(pneg_rsp); kfree(pneg_rsp);
out_free_inbuf: out_free_inbuf:
...@@ -1567,7 +1568,7 @@ SMB2_sess_setup(const unsigned int xid, struct cifs_ses *ses, ...@@ -1567,7 +1568,7 @@ SMB2_sess_setup(const unsigned int xid, struct cifs_ses *ses,
sess_data->func(sess_data); sess_data->func(sess_data);
if ((ses->session_flags & SMB2_SESSION_FLAG_IS_GUEST) && (ses->sign)) if ((ses->session_flags & SMB2_SESSION_FLAG_IS_GUEST) && (ses->sign))
cifs_dbg(VFS, "signing requested but authenticated as guest\n"); cifs_server_dbg(VFS, "signing requested but authenticated as guest\n");
rc = sess_data->result; rc = sess_data->result;
out: out:
kfree(sess_data); kfree(sess_data);
...@@ -1660,10 +1661,11 @@ SMB2_tcon(const unsigned int xid, struct cifs_ses *ses, const char *tree, ...@@ -1660,10 +1661,11 @@ SMB2_tcon(const unsigned int xid, struct cifs_ses *ses, const char *tree,
__le16 *unc_path = NULL; __le16 *unc_path = NULL;
int flags = 0; int flags = 0;
unsigned int total_len; unsigned int total_len;
struct TCP_Server_Info *server = ses->server;
cifs_dbg(FYI, "TCON\n"); cifs_dbg(FYI, "TCON\n");
if (!(ses->server) || !tree) if (!server || !tree)
return -EIO; return -EIO;
unc_path = kmalloc(MAX_SHARENAME_LENGTH * 2, GFP_KERNEL); unc_path = kmalloc(MAX_SHARENAME_LENGTH * 2, GFP_KERNEL);
...@@ -1706,7 +1708,7 @@ SMB2_tcon(const unsigned int xid, struct cifs_ses *ses, const char *tree, ...@@ -1706,7 +1708,7 @@ SMB2_tcon(const unsigned int xid, struct cifs_ses *ses, const char *tree,
* unless it is guest or anonymous user. See MS-SMB2 3.2.5.3.1 * unless it is guest or anonymous user. See MS-SMB2 3.2.5.3.1
* (Samba servers don't always set the flag so also check if null user) * (Samba servers don't always set the flag so also check if null user)
*/ */
if ((ses->server->dialect == SMB311_PROT_ID) && if ((server->dialect == SMB311_PROT_ID) &&
!smb3_encryption_required(tcon) && !smb3_encryption_required(tcon) &&
!(ses->session_flags & !(ses->session_flags &
(SMB2_SESSION_FLAG_IS_GUEST|SMB2_SESSION_FLAG_IS_NULL)) && (SMB2_SESSION_FLAG_IS_GUEST|SMB2_SESSION_FLAG_IS_NULL)) &&
...@@ -1745,7 +1747,7 @@ SMB2_tcon(const unsigned int xid, struct cifs_ses *ses, const char *tree, ...@@ -1745,7 +1747,7 @@ SMB2_tcon(const unsigned int xid, struct cifs_ses *ses, const char *tree,
cifs_dbg(FYI, "connection to printer\n"); cifs_dbg(FYI, "connection to printer\n");
break; break;
default: default:
cifs_dbg(VFS, "unknown share type %d\n", rsp->ShareType); cifs_server_dbg(VFS, "unknown share type %d\n", rsp->ShareType);
rc = -EOPNOTSUPP; rc = -EOPNOTSUPP;
goto tcon_error_exit; goto tcon_error_exit;
} }
...@@ -1760,15 +1762,15 @@ SMB2_tcon(const unsigned int xid, struct cifs_ses *ses, const char *tree, ...@@ -1760,15 +1762,15 @@ SMB2_tcon(const unsigned int xid, struct cifs_ses *ses, const char *tree,
if ((rsp->Capabilities & SMB2_SHARE_CAP_DFS) && if ((rsp->Capabilities & SMB2_SHARE_CAP_DFS) &&
((tcon->share_flags & SHI1005_FLAGS_DFS) == 0)) ((tcon->share_flags & SHI1005_FLAGS_DFS) == 0))
cifs_dbg(VFS, "DFS capability contradicts DFS flag\n"); cifs_server_dbg(VFS, "DFS capability contradicts DFS flag\n");
if (tcon->seal && if (tcon->seal &&
!(tcon->ses->server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)) !(server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION))
cifs_dbg(VFS, "Encryption is requested but not supported\n"); cifs_server_dbg(VFS, "Encryption is requested but not supported\n");
init_copy_chunk_defaults(tcon); init_copy_chunk_defaults(tcon);
if (tcon->ses->server->ops->validate_negotiate) if (server->ops->validate_negotiate)
rc = tcon->ses->server->ops->validate_negotiate(xid, tcon); rc = server->ops->validate_negotiate(xid, tcon);
tcon_exit: tcon_exit:
free_rsp_buf(resp_buftype, rsp); free_rsp_buf(resp_buftype, rsp);
...@@ -1777,7 +1779,7 @@ SMB2_tcon(const unsigned int xid, struct cifs_ses *ses, const char *tree, ...@@ -1777,7 +1779,7 @@ SMB2_tcon(const unsigned int xid, struct cifs_ses *ses, const char *tree,
tcon_error_exit: tcon_error_exit:
if (rsp && rsp->sync_hdr.Status == STATUS_BAD_NETWORK_NAME) { if (rsp && rsp->sync_hdr.Status == STATUS_BAD_NETWORK_NAME) {
cifs_dbg(VFS, "BAD_NETWORK_NAME: %s\n", tree); cifs_server_dbg(VFS, "BAD_NETWORK_NAME: %s\n", tree);
} }
goto tcon_exit; goto tcon_exit;
} }
...@@ -2741,6 +2743,7 @@ SMB2_ioctl(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid, ...@@ -2741,6 +2743,7 @@ SMB2_ioctl(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid,
int resp_buftype = CIFS_NO_BUFFER; int resp_buftype = CIFS_NO_BUFFER;
int rc = 0; int rc = 0;
int flags = 0; int flags = 0;
struct TCP_Server_Info *server;
cifs_dbg(FYI, "SMB2 IOCTL\n"); cifs_dbg(FYI, "SMB2 IOCTL\n");
...@@ -2756,7 +2759,8 @@ SMB2_ioctl(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid, ...@@ -2756,7 +2759,8 @@ SMB2_ioctl(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid,
else else
return -EIO; return -EIO;
if (!ses || !(ses->server)) server = ses->server;
if (!ses || !(server))
return -EIO; return -EIO;
if (smb3_encryption_required(tcon)) if (smb3_encryption_required(tcon))
...@@ -2806,14 +2810,14 @@ SMB2_ioctl(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid, ...@@ -2806,14 +2810,14 @@ SMB2_ioctl(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid,
if (*plen == 0) if (*plen == 0)
goto ioctl_exit; /* server returned no data */ goto ioctl_exit; /* server returned no data */
else if (*plen > rsp_iov.iov_len || *plen > 0xFF00) { else if (*plen > rsp_iov.iov_len || *plen > 0xFF00) {
cifs_dbg(VFS, "srv returned invalid ioctl length: %d\n", *plen); cifs_server_dbg(VFS, "srv returned invalid ioctl length: %d\n", *plen);
*plen = 0; *plen = 0;
rc = -EIO; rc = -EIO;
goto ioctl_exit; goto ioctl_exit;
} }
if (rsp_iov.iov_len - *plen < le32_to_cpu(rsp->OutputOffset)) { if (rsp_iov.iov_len - *plen < le32_to_cpu(rsp->OutputOffset)) {
cifs_dbg(VFS, "Malformed ioctl resp: len %d offset %d\n", *plen, cifs_server_dbg(VFS, "Malformed ioctl resp: len %d offset %d\n", *plen,
le32_to_cpu(rsp->OutputOffset)); le32_to_cpu(rsp->OutputOffset));
*plen = 0; *plen = 0;
rc = -EIO; rc = -EIO;
...@@ -3054,12 +3058,13 @@ query_info(const unsigned int xid, struct cifs_tcon *tcon, ...@@ -3054,12 +3058,13 @@ query_info(const unsigned int xid, struct cifs_tcon *tcon,
int rc = 0; int rc = 0;
int resp_buftype = CIFS_NO_BUFFER; int resp_buftype = CIFS_NO_BUFFER;
struct cifs_ses *ses = tcon->ses; struct cifs_ses *ses = tcon->ses;
struct TCP_Server_Info *server = ses->server;
int flags = 0; int flags = 0;
bool allocated = false; bool allocated = false;
cifs_dbg(FYI, "Query Info\n"); cifs_dbg(FYI, "Query Info\n");
if (!ses || !(ses->server)) if (!ses || !(server))
return -EIO; return -EIO;
if (smb3_encryption_required(tcon)) if (smb3_encryption_required(tcon))
...@@ -3097,7 +3102,7 @@ query_info(const unsigned int xid, struct cifs_tcon *tcon, ...@@ -3097,7 +3102,7 @@ query_info(const unsigned int xid, struct cifs_tcon *tcon,
if (!*data) { if (!*data) {
*data = kmalloc(*dlen, GFP_KERNEL); *data = kmalloc(*dlen, GFP_KERNEL);
if (!*data) { if (!*data) {
cifs_dbg(VFS, cifs_server_dbg(VFS,
"Error %d allocating memory for acl\n", "Error %d allocating memory for acl\n",
rc); rc);
*dlen = 0; *dlen = 0;
...@@ -3489,7 +3494,7 @@ smb2_readv_callback(struct mid_q_entry *mid) ...@@ -3489,7 +3494,7 @@ smb2_readv_callback(struct mid_q_entry *mid)
rc = smb2_verify_signature(&rqst, server); rc = smb2_verify_signature(&rqst, server);
if (rc) if (rc)
cifs_dbg(VFS, "SMB signature verification returned error = %d\n", cifs_server_dbg(VFS, "SMB signature verification returned error = %d\n",
rc); rc);
} }
/* FIXME: should this be counted toward the initiating task? */ /* FIXME: should this be counted toward the initiating task? */
...@@ -4079,7 +4084,7 @@ SMB2_query_directory(const unsigned int xid, struct cifs_tcon *tcon, ...@@ -4079,7 +4084,7 @@ SMB2_query_directory(const unsigned int xid, struct cifs_tcon *tcon,
info_buf_size = sizeof(SEARCH_ID_FULL_DIR_INFO) - 1; info_buf_size = sizeof(SEARCH_ID_FULL_DIR_INFO) - 1;
break; break;
default: default:
cifs_dbg(VFS, "info level %u isn't supported\n", cifs_server_dbg(VFS, "info level %u isn't supported\n",
srch_inf->info_level); srch_inf->info_level);
rc = -EINVAL; rc = -EINVAL;
goto qdir_exit; goto qdir_exit;
...@@ -4170,7 +4175,7 @@ SMB2_query_directory(const unsigned int xid, struct cifs_tcon *tcon, ...@@ -4170,7 +4175,7 @@ SMB2_query_directory(const unsigned int xid, struct cifs_tcon *tcon,
else if (resp_buftype == CIFS_SMALL_BUFFER) else if (resp_buftype == CIFS_SMALL_BUFFER)
srch_inf->smallBuf = true; srch_inf->smallBuf = true;
else else
cifs_dbg(VFS, "illegal search buffer type\n"); cifs_server_dbg(VFS, "illegal search buffer type\n");
trace_smb3_query_dir_done(xid, persistent_fid, tcon->tid, trace_smb3_query_dir_done(xid, persistent_fid, tcon->tid,
tcon->ses->Suid, index, srch_inf->entries_in_buffer); tcon->ses->Suid, index, srch_inf->entries_in_buffer);
......
...@@ -176,7 +176,7 @@ smb2_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server) ...@@ -176,7 +176,7 @@ smb2_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server)
ses = smb2_find_smb_ses(server, shdr->SessionId); ses = smb2_find_smb_ses(server, shdr->SessionId);
if (!ses) { if (!ses) {
cifs_dbg(VFS, "%s: Could not find session\n", __func__); cifs_server_dbg(VFS, "%s: Could not find session\n", __func__);
return 0; return 0;
} }
...@@ -185,21 +185,21 @@ smb2_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server) ...@@ -185,21 +185,21 @@ smb2_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server)
rc = smb2_crypto_shash_allocate(server); rc = smb2_crypto_shash_allocate(server);
if (rc) { if (rc) {
cifs_dbg(VFS, "%s: sha256 alloc failed\n", __func__); cifs_server_dbg(VFS, "%s: sha256 alloc failed\n", __func__);
return rc; return rc;
} }
rc = crypto_shash_setkey(server->secmech.hmacsha256, rc = crypto_shash_setkey(server->secmech.hmacsha256,
ses->auth_key.response, SMB2_NTLMV2_SESSKEY_SIZE); ses->auth_key.response, SMB2_NTLMV2_SESSKEY_SIZE);
if (rc) { if (rc) {
cifs_dbg(VFS, "%s: Could not update with response\n", __func__); cifs_server_dbg(VFS, "%s: Could not update with response\n", __func__);
return rc; return rc;
} }
shash = &server->secmech.sdeschmacsha256->shash; shash = &server->secmech.sdeschmacsha256->shash;
rc = crypto_shash_init(shash); rc = crypto_shash_init(shash);
if (rc) { if (rc) {
cifs_dbg(VFS, "%s: Could not init sha256", __func__); cifs_server_dbg(VFS, "%s: Could not init sha256", __func__);
return rc; return rc;
} }
...@@ -215,7 +215,7 @@ smb2_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server) ...@@ -215,7 +215,7 @@ smb2_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server)
rc = crypto_shash_update(shash, iov[0].iov_base, rc = crypto_shash_update(shash, iov[0].iov_base,
iov[0].iov_len); iov[0].iov_len);
if (rc) { if (rc) {
cifs_dbg(VFS, "%s: Could not update with payload\n", cifs_server_dbg(VFS, "%s: Could not update with payload\n",
__func__); __func__);
return rc; return rc;
} }
...@@ -239,68 +239,69 @@ static int generate_key(struct cifs_ses *ses, struct kvec label, ...@@ -239,68 +239,69 @@ static int generate_key(struct cifs_ses *ses, struct kvec label,
int rc = 0; int rc = 0;
unsigned char prfhash[SMB2_HMACSHA256_SIZE]; unsigned char prfhash[SMB2_HMACSHA256_SIZE];
unsigned char *hashptr = prfhash; unsigned char *hashptr = prfhash;
struct TCP_Server_Info *server = ses->server;
memset(prfhash, 0x0, SMB2_HMACSHA256_SIZE); memset(prfhash, 0x0, SMB2_HMACSHA256_SIZE);
memset(key, 0x0, key_size); memset(key, 0x0, key_size);
rc = smb3_crypto_shash_allocate(ses->server); rc = smb3_crypto_shash_allocate(server);
if (rc) { if (rc) {
cifs_dbg(VFS, "%s: crypto alloc failed\n", __func__); cifs_server_dbg(VFS, "%s: crypto alloc failed\n", __func__);
goto smb3signkey_ret; goto smb3signkey_ret;
} }
rc = crypto_shash_setkey(ses->server->secmech.hmacsha256, rc = crypto_shash_setkey(server->secmech.hmacsha256,
ses->auth_key.response, SMB2_NTLMV2_SESSKEY_SIZE); ses->auth_key.response, SMB2_NTLMV2_SESSKEY_SIZE);
if (rc) { if (rc) {
cifs_dbg(VFS, "%s: Could not set with session key\n", __func__); cifs_server_dbg(VFS, "%s: Could not set with session key\n", __func__);
goto smb3signkey_ret; goto smb3signkey_ret;
} }
rc = crypto_shash_init(&ses->server->secmech.sdeschmacsha256->shash); rc = crypto_shash_init(&server->secmech.sdeschmacsha256->shash);
if (rc) { if (rc) {
cifs_dbg(VFS, "%s: Could not init sign hmac\n", __func__); cifs_server_dbg(VFS, "%s: Could not init sign hmac\n", __func__);
goto smb3signkey_ret; goto smb3signkey_ret;
} }
rc = crypto_shash_update(&ses->server->secmech.sdeschmacsha256->shash, rc = crypto_shash_update(&server->secmech.sdeschmacsha256->shash,
i, 4); i, 4);
if (rc) { if (rc) {
cifs_dbg(VFS, "%s: Could not update with n\n", __func__); cifs_server_dbg(VFS, "%s: Could not update with n\n", __func__);
goto smb3signkey_ret; goto smb3signkey_ret;
} }
rc = crypto_shash_update(&ses->server->secmech.sdeschmacsha256->shash, rc = crypto_shash_update(&server->secmech.sdeschmacsha256->shash,
label.iov_base, label.iov_len); label.iov_base, label.iov_len);
if (rc) { if (rc) {
cifs_dbg(VFS, "%s: Could not update with label\n", __func__); cifs_server_dbg(VFS, "%s: Could not update with label\n", __func__);
goto smb3signkey_ret; goto smb3signkey_ret;
} }
rc = crypto_shash_update(&ses->server->secmech.sdeschmacsha256->shash, rc = crypto_shash_update(&server->secmech.sdeschmacsha256->shash,
&zero, 1); &zero, 1);
if (rc) { if (rc) {
cifs_dbg(VFS, "%s: Could not update with zero\n", __func__); cifs_server_dbg(VFS, "%s: Could not update with zero\n", __func__);
goto smb3signkey_ret; goto smb3signkey_ret;
} }
rc = crypto_shash_update(&ses->server->secmech.sdeschmacsha256->shash, rc = crypto_shash_update(&server->secmech.sdeschmacsha256->shash,
context.iov_base, context.iov_len); context.iov_base, context.iov_len);
if (rc) { if (rc) {
cifs_dbg(VFS, "%s: Could not update with context\n", __func__); cifs_server_dbg(VFS, "%s: Could not update with context\n", __func__);
goto smb3signkey_ret; goto smb3signkey_ret;
} }
rc = crypto_shash_update(&ses->server->secmech.sdeschmacsha256->shash, rc = crypto_shash_update(&server->secmech.sdeschmacsha256->shash,
L, 4); L, 4);
if (rc) { if (rc) {
cifs_dbg(VFS, "%s: Could not update with L\n", __func__); cifs_server_dbg(VFS, "%s: Could not update with L\n", __func__);
goto smb3signkey_ret; goto smb3signkey_ret;
} }
rc = crypto_shash_final(&ses->server->secmech.sdeschmacsha256->shash, rc = crypto_shash_final(&server->secmech.sdeschmacsha256->shash,
hashptr); hashptr);
if (rc) { if (rc) {
cifs_dbg(VFS, "%s: Could not generate sha256 hash\n", __func__); cifs_server_dbg(VFS, "%s: Could not generate sha256 hash\n", __func__);
goto smb3signkey_ret; goto smb3signkey_ret;
} }
...@@ -436,7 +437,7 @@ smb3_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server) ...@@ -436,7 +437,7 @@ smb3_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server)
ses = smb2_find_smb_ses(server, shdr->SessionId); ses = smb2_find_smb_ses(server, shdr->SessionId);
if (!ses) { if (!ses) {
cifs_dbg(VFS, "%s: Could not find session\n", __func__); cifs_server_dbg(VFS, "%s: Could not find session\n", __func__);
return 0; return 0;
} }
...@@ -446,7 +447,7 @@ smb3_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server) ...@@ -446,7 +447,7 @@ smb3_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server)
rc = crypto_shash_setkey(server->secmech.cmacaes, rc = crypto_shash_setkey(server->secmech.cmacaes,
ses->smb3signingkey, SMB2_CMACAES_SIZE); ses->smb3signingkey, SMB2_CMACAES_SIZE);
if (rc) { if (rc) {
cifs_dbg(VFS, "%s: Could not set key for cmac aes\n", __func__); cifs_server_dbg(VFS, "%s: Could not set key for cmac aes\n", __func__);
return rc; return rc;
} }
...@@ -457,7 +458,7 @@ smb3_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server) ...@@ -457,7 +458,7 @@ smb3_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server)
*/ */
rc = crypto_shash_init(shash); rc = crypto_shash_init(shash);
if (rc) { if (rc) {
cifs_dbg(VFS, "%s: Could not init cmac aes\n", __func__); cifs_server_dbg(VFS, "%s: Could not init cmac aes\n", __func__);
return rc; return rc;
} }
...@@ -473,7 +474,7 @@ smb3_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server) ...@@ -473,7 +474,7 @@ smb3_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server)
rc = crypto_shash_update(shash, iov[0].iov_base, rc = crypto_shash_update(shash, iov[0].iov_base,
iov[0].iov_len); iov[0].iov_len);
if (rc) { if (rc) {
cifs_dbg(VFS, "%s: Could not update with payload\n", cifs_server_dbg(VFS, "%s: Could not update with payload\n",
__func__); __func__);
return rc; return rc;
} }
...@@ -665,7 +666,7 @@ smb2_check_receive(struct mid_q_entry *mid, struct TCP_Server_Info *server, ...@@ -665,7 +666,7 @@ smb2_check_receive(struct mid_q_entry *mid, struct TCP_Server_Info *server,
rc = smb2_verify_signature(&rqst, server); rc = smb2_verify_signature(&rqst, server);
if (rc) if (rc)
cifs_dbg(VFS, "SMB signature verification returned error = %d\n", cifs_server_dbg(VFS, "SMB signature verification returned error = %d\n",
rc); rc);
} }
...@@ -739,7 +740,7 @@ smb3_crypto_aead_allocate(struct TCP_Server_Info *server) ...@@ -739,7 +740,7 @@ smb3_crypto_aead_allocate(struct TCP_Server_Info *server)
else else
tfm = crypto_alloc_aead("ccm(aes)", 0, 0); tfm = crypto_alloc_aead("ccm(aes)", 0, 0);
if (IS_ERR(tfm)) { if (IS_ERR(tfm)) {
cifs_dbg(VFS, "%s: Failed to alloc encrypt aead\n", cifs_server_dbg(VFS, "%s: Failed to alloc encrypt aead\n",
__func__); __func__);
return PTR_ERR(tfm); return PTR_ERR(tfm);
} }
...@@ -754,7 +755,7 @@ smb3_crypto_aead_allocate(struct TCP_Server_Info *server) ...@@ -754,7 +755,7 @@ smb3_crypto_aead_allocate(struct TCP_Server_Info *server)
if (IS_ERR(tfm)) { if (IS_ERR(tfm)) {
crypto_free_aead(server->secmech.ccmaesencrypt); crypto_free_aead(server->secmech.ccmaesencrypt);
server->secmech.ccmaesencrypt = NULL; server->secmech.ccmaesencrypt = NULL;
cifs_dbg(VFS, "%s: Failed to alloc decrypt aead\n", cifs_server_dbg(VFS, "%s: Failed to alloc decrypt aead\n",
__func__); __func__);
return PTR_ERR(tfm); return PTR_ERR(tfm);
} }
......
...@@ -118,7 +118,7 @@ DeleteMidQEntry(struct mid_q_entry *midEntry) ...@@ -118,7 +118,7 @@ DeleteMidQEntry(struct mid_q_entry *midEntry)
#ifdef CONFIG_CIFS_STATS2 #ifdef CONFIG_CIFS_STATS2
now = jiffies; now = jiffies;
if (now < midEntry->when_alloc) if (now < midEntry->when_alloc)
cifs_dbg(VFS, "invalid mid allocation time\n"); cifs_server_dbg(VFS, "invalid mid allocation time\n");
roundtrip_time = now - midEntry->when_alloc; roundtrip_time = now - midEntry->when_alloc;
if (smb_cmd < NUMBER_OF_SMB2_COMMANDS) { if (smb_cmd < NUMBER_OF_SMB2_COMMANDS) {
...@@ -232,7 +232,7 @@ smb_send_kvec(struct TCP_Server_Info *server, struct msghdr *smb_msg, ...@@ -232,7 +232,7 @@ smb_send_kvec(struct TCP_Server_Info *server, struct msghdr *smb_msg,
retries++; retries++;
if (retries >= 14 || if (retries >= 14 ||
(!server->noblocksnd && (retries > 2))) { (!server->noblocksnd && (retries > 2))) {
cifs_dbg(VFS, "sends on sock %p stuck for 15 seconds\n", cifs_server_dbg(VFS, "sends on sock %p stuck for 15 seconds\n",
ssocket); ssocket);
return -EAGAIN; return -EAGAIN;
} }
...@@ -246,7 +246,7 @@ smb_send_kvec(struct TCP_Server_Info *server, struct msghdr *smb_msg, ...@@ -246,7 +246,7 @@ smb_send_kvec(struct TCP_Server_Info *server, struct msghdr *smb_msg,
if (rc == 0) { if (rc == 0) {
/* should never happen, letting socket clear before /* should never happen, letting socket clear before
retrying is our only obvious option here */ retrying is our only obvious option here */
cifs_dbg(VFS, "tcp sent no data\n"); cifs_server_dbg(VFS, "tcp sent no data\n");
msleep(500); msleep(500);
continue; continue;
} }
...@@ -440,7 +440,7 @@ __smb_send_rqst(struct TCP_Server_Info *server, int num_rqst, ...@@ -440,7 +440,7 @@ __smb_send_rqst(struct TCP_Server_Info *server, int num_rqst,
} }
smbd_done: smbd_done:
if (rc < 0 && rc != -EINTR) if (rc < 0 && rc != -EINTR)
cifs_dbg(VFS, "Error %d sending data on socket to server\n", cifs_server_dbg(VFS, "Error %d sending data on socket to server\n",
rc); rc);
else if (rc > 0) else if (rc > 0)
rc = 0; rc = 0;
...@@ -473,8 +473,8 @@ smb_send_rqst(struct TCP_Server_Info *server, int num_rqst, ...@@ -473,8 +473,8 @@ smb_send_rqst(struct TCP_Server_Info *server, int num_rqst,
cur_rqst[0].rq_nvec = 1; cur_rqst[0].rq_nvec = 1;
if (!server->ops->init_transform_rq) { if (!server->ops->init_transform_rq) {
cifs_dbg(VFS, "Encryption requested but transform callback " cifs_server_dbg(VFS, "Encryption requested but transform "
"is missing\n"); "callback is missing\n");
return -EIO; return -EIO;
} }
...@@ -548,7 +548,7 @@ wait_for_free_credits(struct TCP_Server_Info *server, const int num_credits, ...@@ -548,7 +548,7 @@ wait_for_free_credits(struct TCP_Server_Info *server, const int num_credits,
if (!rc) { if (!rc) {
trace_smb3_credit_timeout(server->CurrentMid, trace_smb3_credit_timeout(server->CurrentMid,
server->hostname, num_credits); server->hostname, num_credits);
cifs_dbg(VFS, "wait timed out after %d ms\n", cifs_server_dbg(VFS, "wait timed out after %d ms\n",
timeout); timeout);
return -ENOTSUPP; return -ENOTSUPP;
} }
...@@ -589,7 +589,7 @@ wait_for_free_credits(struct TCP_Server_Info *server, const int num_credits, ...@@ -589,7 +589,7 @@ wait_for_free_credits(struct TCP_Server_Info *server, const int num_credits,
trace_smb3_credit_timeout( trace_smb3_credit_timeout(
server->CurrentMid, server->CurrentMid,
server->hostname, num_credits); server->hostname, num_credits);
cifs_dbg(VFS, "wait timed out after %d ms\n", cifs_server_dbg(VFS, "wait timed out after %d ms\n",
timeout); timeout);
return -ENOTSUPP; return -ENOTSUPP;
} }
...@@ -869,7 +869,7 @@ cifs_sync_mid_result(struct mid_q_entry *mid, struct TCP_Server_Info *server) ...@@ -869,7 +869,7 @@ cifs_sync_mid_result(struct mid_q_entry *mid, struct TCP_Server_Info *server)
break; break;
default: default:
list_del_init(&mid->qhead); list_del_init(&mid->qhead);
cifs_dbg(VFS, "%s: invalid mid state mid=%llu state=%d\n", cifs_server_dbg(VFS, "%s: invalid mid state mid=%llu state=%d\n",
__func__, mid->mid, mid->mid_state); __func__, mid->mid, mid->mid_state);
rc = -EIO; rc = -EIO;
} }
...@@ -910,7 +910,7 @@ cifs_check_receive(struct mid_q_entry *mid, struct TCP_Server_Info *server, ...@@ -910,7 +910,7 @@ cifs_check_receive(struct mid_q_entry *mid, struct TCP_Server_Info *server,
rc = cifs_verify_signature(&rqst, server, rc = cifs_verify_signature(&rqst, server,
mid->sequence_number); mid->sequence_number);
if (rc) if (rc)
cifs_dbg(VFS, "SMB signature verification returned error = %d\n", cifs_server_dbg(VFS, "SMB signature verification returned error = %d\n",
rc); rc);
} }
...@@ -1107,7 +1107,7 @@ compound_send_recv(const unsigned int xid, struct cifs_ses *ses, ...@@ -1107,7 +1107,7 @@ compound_send_recv(const unsigned int xid, struct cifs_ses *ses,
} }
if (rc != 0) { if (rc != 0) {
for (; i < num_rqst; i++) { for (; i < num_rqst; i++) {
cifs_dbg(VFS, "Cancelling wait for mid %llu cmd: %d\n", cifs_server_dbg(VFS, "Cancelling wait for mid %llu cmd: %d\n",
midQ[i]->mid, le16_to_cpu(midQ[i]->command)); midQ[i]->mid, le16_to_cpu(midQ[i]->command));
send_cancel(server, &rqst[i], midQ[i]); send_cancel(server, &rqst[i], midQ[i]);
spin_lock(&GlobalMid_Lock); spin_lock(&GlobalMid_Lock);
...@@ -1242,17 +1242,18 @@ SendReceive(const unsigned int xid, struct cifs_ses *ses, ...@@ -1242,17 +1242,18 @@ SendReceive(const unsigned int xid, struct cifs_ses *ses,
struct kvec iov = { .iov_base = in_buf, .iov_len = len }; struct kvec iov = { .iov_base = in_buf, .iov_len = len };
struct smb_rqst rqst = { .rq_iov = &iov, .rq_nvec = 1 }; struct smb_rqst rqst = { .rq_iov = &iov, .rq_nvec = 1 };
struct cifs_credits credits = { .value = 1, .instance = 0 }; struct cifs_credits credits = { .value = 1, .instance = 0 };
struct TCP_Server_Info *server = ses->server;
if (ses == NULL) { if (ses == NULL) {
cifs_dbg(VFS, "Null smb session\n"); cifs_dbg(VFS, "Null smb session\n");
return -EIO; return -EIO;
} }
if (ses->server == NULL) { if (server == NULL) {
cifs_dbg(VFS, "Null tcp session\n"); cifs_dbg(VFS, "Null tcp session\n");
return -EIO; return -EIO;
} }
if (ses->server->tcpStatus == CifsExiting) if (server->tcpStatus == CifsExiting)
return -ENOENT; return -ENOENT;
/* Ensure that we do not send more than 50 overlapping requests /* Ensure that we do not send more than 50 overlapping requests
...@@ -1260,12 +1261,12 @@ SendReceive(const unsigned int xid, struct cifs_ses *ses, ...@@ -1260,12 +1261,12 @@ SendReceive(const unsigned int xid, struct cifs_ses *ses,
use ses->maxReq */ use ses->maxReq */
if (len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) { if (len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) {
cifs_dbg(VFS, "Illegal length, greater than maximum frame, %d\n", cifs_server_dbg(VFS, "Illegal length, greater than maximum frame, %d\n",
len); len);
return -EIO; return -EIO;
} }
rc = wait_for_free_request(ses->server, flags, &credits.instance); rc = wait_for_free_request(server, flags, &credits.instance);
if (rc) if (rc)
return rc; return rc;
...@@ -1273,70 +1274,70 @@ SendReceive(const unsigned int xid, struct cifs_ses *ses, ...@@ -1273,70 +1274,70 @@ SendReceive(const unsigned int xid, struct cifs_ses *ses,
and avoid races inside tcp sendmsg code that could cause corruption and avoid races inside tcp sendmsg code that could cause corruption
of smb data */ of smb data */
mutex_lock(&ses->server->srv_mutex); mutex_lock(&server->srv_mutex);
rc = allocate_mid(ses, in_buf, &midQ); rc = allocate_mid(ses, in_buf, &midQ);
if (rc) { if (rc) {
mutex_unlock(&ses->server->srv_mutex); mutex_unlock(&ses->server->srv_mutex);
/* Update # of requests on wire to server */ /* Update # of requests on wire to server */
add_credits(ses->server, &credits, 0); add_credits(server, &credits, 0);
return rc; return rc;
} }
rc = cifs_sign_smb(in_buf, ses->server, &midQ->sequence_number); rc = cifs_sign_smb(in_buf, server, &midQ->sequence_number);
if (rc) { if (rc) {
mutex_unlock(&ses->server->srv_mutex); mutex_unlock(&server->srv_mutex);
goto out; goto out;
} }
midQ->mid_state = MID_REQUEST_SUBMITTED; midQ->mid_state = MID_REQUEST_SUBMITTED;
cifs_in_send_inc(ses->server); cifs_in_send_inc(server);
rc = smb_send(ses->server, in_buf, len); rc = smb_send(server, in_buf, len);
cifs_in_send_dec(ses->server); cifs_in_send_dec(server);
cifs_save_when_sent(midQ); cifs_save_when_sent(midQ);
if (rc < 0) if (rc < 0)
ses->server->sequence_number -= 2; server->sequence_number -= 2;
mutex_unlock(&ses->server->srv_mutex); mutex_unlock(&server->srv_mutex);
if (rc < 0) if (rc < 0)
goto out; goto out;
rc = wait_for_response(ses->server, midQ); rc = wait_for_response(server, midQ);
if (rc != 0) { if (rc != 0) {
send_cancel(ses->server, &rqst, midQ); send_cancel(server, &rqst, midQ);
spin_lock(&GlobalMid_Lock); spin_lock(&GlobalMid_Lock);
if (midQ->mid_state == MID_REQUEST_SUBMITTED) { if (midQ->mid_state == MID_REQUEST_SUBMITTED) {
/* no longer considered to be "in-flight" */ /* no longer considered to be "in-flight" */
midQ->callback = DeleteMidQEntry; midQ->callback = DeleteMidQEntry;
spin_unlock(&GlobalMid_Lock); spin_unlock(&GlobalMid_Lock);
add_credits(ses->server, &credits, 0); add_credits(server, &credits, 0);
return rc; return rc;
} }
spin_unlock(&GlobalMid_Lock); spin_unlock(&GlobalMid_Lock);
} }
rc = cifs_sync_mid_result(midQ, ses->server); rc = cifs_sync_mid_result(midQ, server);
if (rc != 0) { if (rc != 0) {
add_credits(ses->server, &credits, 0); add_credits(server, &credits, 0);
return rc; return rc;
} }
if (!midQ->resp_buf || !out_buf || if (!midQ->resp_buf || !out_buf ||
midQ->mid_state != MID_RESPONSE_RECEIVED) { midQ->mid_state != MID_RESPONSE_RECEIVED) {
rc = -EIO; rc = -EIO;
cifs_dbg(VFS, "Bad MID state?\n"); cifs_server_dbg(VFS, "Bad MID state?\n");
goto out; goto out;
} }
*pbytes_returned = get_rfc1002_length(midQ->resp_buf); *pbytes_returned = get_rfc1002_length(midQ->resp_buf);
memcpy(out_buf, midQ->resp_buf, *pbytes_returned + 4); memcpy(out_buf, midQ->resp_buf, *pbytes_returned + 4);
rc = cifs_check_receive(midQ, ses->server, 0); rc = cifs_check_receive(midQ, server, 0);
out: out:
cifs_delete_mid(midQ); cifs_delete_mid(midQ);
add_credits(ses->server, &credits, 0); add_credits(server, &credits, 0);
return rc; return rc;
} }
...@@ -1379,19 +1380,21 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifs_tcon *tcon, ...@@ -1379,19 +1380,21 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifs_tcon *tcon,
struct kvec iov = { .iov_base = in_buf, .iov_len = len }; struct kvec iov = { .iov_base = in_buf, .iov_len = len };
struct smb_rqst rqst = { .rq_iov = &iov, .rq_nvec = 1 }; struct smb_rqst rqst = { .rq_iov = &iov, .rq_nvec = 1 };
unsigned int instance; unsigned int instance;
struct TCP_Server_Info *server;
if (tcon == NULL || tcon->ses == NULL) { if (tcon == NULL || tcon->ses == NULL) {
cifs_dbg(VFS, "Null smb session\n"); cifs_dbg(VFS, "Null smb session\n");
return -EIO; return -EIO;
} }
ses = tcon->ses; ses = tcon->ses;
server = ses->server;
if (ses->server == NULL) { if (server == NULL) {
cifs_dbg(VFS, "Null tcp session\n"); cifs_dbg(VFS, "Null tcp session\n");
return -EIO; return -EIO;
} }
if (ses->server->tcpStatus == CifsExiting) if (server->tcpStatus == CifsExiting)
return -ENOENT; return -ENOENT;
/* Ensure that we do not send more than 50 overlapping requests /* Ensure that we do not send more than 50 overlapping requests
...@@ -1399,12 +1402,12 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifs_tcon *tcon, ...@@ -1399,12 +1402,12 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifs_tcon *tcon,
use ses->maxReq */ use ses->maxReq */
if (len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) { if (len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) {
cifs_dbg(VFS, "Illegal length, greater than maximum frame, %d\n", cifs_server_dbg(VFS, "Illegal length, greater than maximum frame, %d\n",
len); len);
return -EIO; return -EIO;
} }
rc = wait_for_free_request(ses->server, CIFS_BLOCKING_OP, &instance); rc = wait_for_free_request(server, CIFS_BLOCKING_OP, &instance);
if (rc) if (rc)
return rc; return rc;
...@@ -1412,31 +1415,31 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifs_tcon *tcon, ...@@ -1412,31 +1415,31 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifs_tcon *tcon,
and avoid races inside tcp sendmsg code that could cause corruption and avoid races inside tcp sendmsg code that could cause corruption
of smb data */ of smb data */
mutex_lock(&ses->server->srv_mutex); mutex_lock(&server->srv_mutex);
rc = allocate_mid(ses, in_buf, &midQ); rc = allocate_mid(ses, in_buf, &midQ);
if (rc) { if (rc) {
mutex_unlock(&ses->server->srv_mutex); mutex_unlock(&server->srv_mutex);
return rc; return rc;
} }
rc = cifs_sign_smb(in_buf, ses->server, &midQ->sequence_number); rc = cifs_sign_smb(in_buf, server, &midQ->sequence_number);
if (rc) { if (rc) {
cifs_delete_mid(midQ); cifs_delete_mid(midQ);
mutex_unlock(&ses->server->srv_mutex); mutex_unlock(&server->srv_mutex);
return rc; return rc;
} }
midQ->mid_state = MID_REQUEST_SUBMITTED; midQ->mid_state = MID_REQUEST_SUBMITTED;
cifs_in_send_inc(ses->server); cifs_in_send_inc(server);
rc = smb_send(ses->server, in_buf, len); rc = smb_send(server, in_buf, len);
cifs_in_send_dec(ses->server); cifs_in_send_dec(server);
cifs_save_when_sent(midQ); cifs_save_when_sent(midQ);
if (rc < 0) if (rc < 0)
ses->server->sequence_number -= 2; server->sequence_number -= 2;
mutex_unlock(&ses->server->srv_mutex); mutex_unlock(&server->srv_mutex);
if (rc < 0) { if (rc < 0) {
cifs_delete_mid(midQ); cifs_delete_mid(midQ);
...@@ -1444,21 +1447,21 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifs_tcon *tcon, ...@@ -1444,21 +1447,21 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifs_tcon *tcon,
} }
/* Wait for a reply - allow signals to interrupt. */ /* Wait for a reply - allow signals to interrupt. */
rc = wait_event_interruptible(ses->server->response_q, rc = wait_event_interruptible(server->response_q,
(!(midQ->mid_state == MID_REQUEST_SUBMITTED)) || (!(midQ->mid_state == MID_REQUEST_SUBMITTED)) ||
((ses->server->tcpStatus != CifsGood) && ((server->tcpStatus != CifsGood) &&
(ses->server->tcpStatus != CifsNew))); (server->tcpStatus != CifsNew)));
/* Were we interrupted by a signal ? */ /* Were we interrupted by a signal ? */
if ((rc == -ERESTARTSYS) && if ((rc == -ERESTARTSYS) &&
(midQ->mid_state == MID_REQUEST_SUBMITTED) && (midQ->mid_state == MID_REQUEST_SUBMITTED) &&
((ses->server->tcpStatus == CifsGood) || ((server->tcpStatus == CifsGood) ||
(ses->server->tcpStatus == CifsNew))) { (server->tcpStatus == CifsNew))) {
if (in_buf->Command == SMB_COM_TRANSACTION2) { if (in_buf->Command == SMB_COM_TRANSACTION2) {
/* POSIX lock. We send a NT_CANCEL SMB to cause the /* POSIX lock. We send a NT_CANCEL SMB to cause the
blocking lock to return. */ blocking lock to return. */
rc = send_cancel(ses->server, &rqst, midQ); rc = send_cancel(server, &rqst, midQ);
if (rc) { if (rc) {
cifs_delete_mid(midQ); cifs_delete_mid(midQ);
return rc; return rc;
...@@ -1477,9 +1480,9 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifs_tcon *tcon, ...@@ -1477,9 +1480,9 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifs_tcon *tcon,
} }
} }
rc = wait_for_response(ses->server, midQ); rc = wait_for_response(server, midQ);
if (rc) { if (rc) {
send_cancel(ses->server, &rqst, midQ); send_cancel(server, &rqst, midQ);
spin_lock(&GlobalMid_Lock); spin_lock(&GlobalMid_Lock);
if (midQ->mid_state == MID_REQUEST_SUBMITTED) { if (midQ->mid_state == MID_REQUEST_SUBMITTED) {
/* no longer considered to be "in-flight" */ /* no longer considered to be "in-flight" */
...@@ -1494,20 +1497,20 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifs_tcon *tcon, ...@@ -1494,20 +1497,20 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifs_tcon *tcon,
rstart = 1; rstart = 1;
} }
rc = cifs_sync_mid_result(midQ, ses->server); rc = cifs_sync_mid_result(midQ, server);
if (rc != 0) if (rc != 0)
return rc; return rc;
/* rcvd frame is ok */ /* rcvd frame is ok */
if (out_buf == NULL || midQ->mid_state != MID_RESPONSE_RECEIVED) { if (out_buf == NULL || midQ->mid_state != MID_RESPONSE_RECEIVED) {
rc = -EIO; rc = -EIO;
cifs_dbg(VFS, "Bad MID state?\n"); cifs_server_dbg(VFS, "Bad MID state?\n");
goto out; goto out;
} }
*pbytes_returned = get_rfc1002_length(midQ->resp_buf); *pbytes_returned = get_rfc1002_length(midQ->resp_buf);
memcpy(out_buf, midQ->resp_buf, *pbytes_returned + 4); memcpy(out_buf, midQ->resp_buf, *pbytes_returned + 4);
rc = cifs_check_receive(midQ, ses->server, 0); rc = cifs_check_receive(midQ, server, 0);
out: out:
cifs_delete_mid(midQ); cifs_delete_mid(midQ);
if (rstart && rc == -EACCES) if (rstart && rc == -EACCES)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment