cifs: Do not send echoes before Negotiate is complete
Subsystems (2)
PATCH 1/1 cifs: Do not send echoes before Negotiate is complete
commit 4fcd1813e640 ("Fix reconnect to not defer smb3 session reconnect long after socket reconnect") added support for Negotiate requests to be initiated by echo calls.
To avoid delays in calling echo after a reconnect, I added the patch introduced by the commit b8c600120fc8 ("Call echo service immediately after socket reconnect").
This has however caused a regression with cifs shares which do not have support for echo calls to trigger Negotiate requests. On connections which need to call Negotiation, the echo calls trigger an error which triggers a reconnect which in turn triggers another echo call. This results in a loop which is only broken when an operation is performed on the cifs share. For an idle share, it can DOS a server.
The patch uses the smb_operation can_echo() for cifs so that it is called only if connection has been already been setup.
kernel bz: 194531
--- fs/cifs/smb1ops.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
fs/cifs/smb1ops.c +10 -0
@@ -1015,6 +1015,15 @@ cifs_dir_needs_close(struct cifsFileInfo *cfile)return !cfile->srch_inf.endOfSearch && !cfile->invalidHandle; } +static bool +cifs_can_echo (struct TCP_Server_Info *server) +{ +if (server->tcpStatus == CifsGood) +return true; + +return false; +} +struct smb_version_operations smb1_operations = { .send_cancel = send_nt_cancel, .compare_fids = cifs_compare_fids,
@@ -1049,6 +1058,7 @@ struct smb_version_operations smb1_operations = { .get_dfs_refer = CIFSGetDFSRefer, .qfs_tcon = cifs_qfs_tcon, .is_path_accessible = cifs_is_path_accessible, + .can_echo = cifs_can_echo, .query_path_info = cifs_query_path_info, .query_file_info = cifs_query_file_info, .get_srv_inum = cifs_get_srv_inum,
Signature · 1 line
2.9.3
A message that is not in the archive (sent off-list or not yet received): 20170416193724.4945-1-sprabhu-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org
Jonathan Liu
Tested-byHi Sachin,
Quoted 54 lines · Sachin Prabhu
commit
4fcd1813e640("Fix reconnect to not defer smb3 session reconnect long after socket reconnect") added support for Negotiate requests to be initiated by echo calls.To avoid delays in calling echo after a reconnect, I added the patch introduced by the commit
b8c600120fc8("Call echo service immediately after socket reconnect").This has however caused a regression with cifs shares which do not have support for echo calls to trigger Negotiate requests. On connections which need to call Negotiation, the echo calls trigger an error which triggers a reconnect which in turn triggers another echo call. This results in a loop which is only broken when an operation is performed on the cifs share. For an idle share, it can DOS a server.
The patch uses the
smb_operationcan_echo()for cifs so that it is called only if connection has been already been setup.kernel bz: 194531
Signed-off-by Sachin Prabhu <[email protected]>--- fs/cifs/smb1ops.c | 10 ++++++++++ 1 file changed, 10 insertions(+)fs/cifs/smb1ops.c +10
-1@@ -1015,6 +1015,15 @@ cifs_dir_needs_close(struct cifsFileInfo *cfile)return !cfile->srch_inf.endOfSearch && !cfile->invalidHandle; } +static bool +cifs_can_echo (struct TCP_Server_Info *server) +{ +if (server->tcpStatus == CifsGood) +return true; + +return false; +} +struct smb_version_operations smb1_operations = { .send_cancel = send_nt_cancel, .compare_fids = cifs_compare_fids,@@ -1049,6 +1058,7 @@ struct smb_version_operations smb1_operations = { .get_dfs_refer = CIFSGetDFSRefer, .qfs_tcon = cifs_qfs_tcon, .is_path_accessible = cifs_is_path_accessible, + .can_echo = cifs_can_echo, .query_path_info = cifs_query_path_info, .query_file_info = cifs_query_file_info, .get_srv_inum = cifs_get_srv_inum, --
Quoted 2 lines
2.9.3
This fixes the issue for me.
A message that is not in the archive (sent off-list or not yet received): CAH2r5mvMHLHLLK3-dT=s_mbuKPWfLF8PWtz-VkwwWzdyez1uLQ@mail.gmail.com
A message that is not in the archive (sent off-list or not yet received): CAH2r5mvMHLHLLK3-dT=s_mbuKPWfLF8PWtz-VkwwWzdyez1uLQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org
PATCH 1/1 cifs: Do not send echoes before Negotiate is complete
I fixed the checkpatch error (missing tab in Sachin's patch) and merged into cifs-2.6.git
thx
Quoted 68 lines · Jonathan Liu
Hi Sachin,
Quoted 54 lines · Sachin Prabhu
commit
4fcd1813e640("Fix reconnect to not defer smb3 session reconnect long after socket reconnect") added support for Negotiate requests to be initiated by echo calls.To avoid delays in calling echo after a reconnect, I added the patch introduced by the commit
b8c600120fc8("Call echo service immediately after socket reconnect").This has however caused a regression with cifs shares which do not have support for echo calls to trigger Negotiate requests. On connections which need to call Negotiation, the echo calls trigger an error which triggers a reconnect which in turn triggers another echo call. This results in a loop which is only broken when an operation is performed on the cifs share. For an idle share, it can DOS a server.
The patch uses the
smb_operationcan_echo()for cifs so that it is called only if connection has been already been setup.kernel bz: 194531
Signed-off-by Sachin Prabhu <[email protected]>--- fs/cifs/smb1ops.c | 10 ++++++++++ 1 file changed, 10 insertions(+)fs/cifs/smb1ops.c +10
-1@@ -1015,6 +1015,15 @@ cifs_dir_needs_close(struct cifsFileInfo *cfile)return !cfile->srch_inf.endOfSearch && !cfile->invalidHandle; } +static bool +cifs_can_echo (struct TCP_Server_Info *server) +{ +if (server->tcpStatus == CifsGood) +return true; + +return false; +} +struct smb_version_operations smb1_operations = { .send_cancel = send_nt_cancel, .compare_fids = cifs_compare_fids,@@ -1049,6 +1058,7 @@ struct smb_version_operations smb1_operations = { .get_dfs_refer = CIFSGetDFSRefer, .qfs_tcon = cifs_qfs_tcon, .is_path_accessible = cifs_is_path_accessible, + .can_echo = cifs_can_echo, .query_path_info = cifs_query_path_info, .query_file_info = cifs_query_file_info, .get_srv_inum = cifs_get_srv_inum, --Quoted 2 lines
2.9.3
This fixes the issue for me.
Tested-by Jonathan Liu <[email protected]>--
To unsubscribe from this list: send the line "unsubscribe linux-cifs" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Signature · 10 lines
Thanks, Steve -- Thanks, Steve
2017-04-16 21:27 GMT-07:00 Steve French <[email protected]>:
Quoted 78 lines
I fixed the checkpatch error (missing tab in Sachin's patch) and merged into cifs-2.6.git
thx
Quoted 63 lines · Jonathan Liu
Hi Sachin,
Quoted 54 lines · Sachin Prabhu
commit
4fcd1813e640("Fix reconnect to not defer smb3 session reconnect long after socket reconnect") added support for Negotiate requests to be initiated by echo calls.To avoid delays in calling echo after a reconnect, I added the patch introduced by the commit
b8c600120fc8("Call echo service immediately after socket reconnect").This has however caused a regression with cifs shares which do not have support for echo calls to trigger Negotiate requests. On connections which need to call Negotiation, the echo calls trigger an error which triggers a reconnect which in turn triggers another echo call. This results in a loop which is only broken when an operation is performed on the cifs share. For an idle share, it can DOS a server.
The patch uses the
smb_operationcan_echo()for cifs so that it is called only if connection has been already been setup.kernel bz: 194531
Signed-off-by Sachin Prabhu <[email protected]>--- fs/cifs/smb1ops.c | 10 ++++++++++ 1 file changed, 10 insertions(+)fs/cifs/smb1ops.c +10
-1@@ -1015,6 +1015,15 @@ cifs_dir_needs_close(struct cifsFileInfo *cfile)return !cfile->srch_inf.endOfSearch && !cfile->invalidHandle; } +static bool +cifs_can_echo (struct TCP_Server_Info *server) +{ +if (server->tcpStatus == CifsGood) +return true; + +return false; +} +struct smb_version_operations smb1_operations = { .send_cancel = send_nt_cancel, .compare_fids = cifs_compare_fids,@@ -1049,6 +1058,7 @@ struct smb_version_operations smb1_operations = { .get_dfs_refer = CIFSGetDFSRefer, .qfs_tcon = cifs_qfs_tcon, .is_path_accessible = cifs_is_path_accessible, + .can_echo = cifs_can_echo, .query_path_info = cifs_query_path_info, .query_file_info = cifs_query_file_info, .get_srv_inum = cifs_get_srv_inum, --Quoted 2 lines
2.9.3
This fixes the issue for me.
Quoted 5 lines
Tested-by Jonathan Liu <[email protected]>--
To unsubscribe from this list: send the line "unsubscribe linux-cifs" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Quoted 4 lines
--
Thanks,Steve
I think this patch should go to stable as well.
--
Best regards,
Pavel Shilovsky
A message that is not in the archive (sent off-list or not yet received): CAKywueQppodr4tgwc0Kc6tcip3fhgkkQO4qcf1nfziWoQPW_eQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org
Already in cifs-2.6.git (updated to include cc:stable)
Quoted 90 lines · Pavel Shilovsky
2017-04-16 21:27 GMT-07:00 Steve French <[email protected]>:
Quoted 78 lines
I fixed the checkpatch error (missing tab in Sachin's patch) and merged into cifs-2.6.git
thx
Quoted 63 lines · Jonathan Liu
Hi Sachin,
Quoted 54 lines · Sachin Prabhu
commit
4fcd1813e640("Fix reconnect to not defer smb3 session reconnect long after socket reconnect") added support for Negotiate requests to be initiated by echo calls.To avoid delays in calling echo after a reconnect, I added the patch introduced by the commit
b8c600120fc8("Call echo service immediately after socket reconnect").This has however caused a regression with cifs shares which do not have support for echo calls to trigger Negotiate requests. On connections which need to call Negotiation, the echo calls trigger an error which triggers a reconnect which in turn triggers another echo call. This results in a loop which is only broken when an operation is performed on the cifs share. For an idle share, it can DOS a server.
The patch uses the
smb_operationcan_echo()for cifs so that it is called only if connection has been already been setup.kernel bz: 194531
Signed-off-by Sachin Prabhu <[email protected]>--- fs/cifs/smb1ops.c | 10 ++++++++++ 1 file changed, 10 insertions(+)fs/cifs/smb1ops.c +10
-1@@ -1015,6 +1015,15 @@ cifs_dir_needs_close(struct cifsFileInfo *cfile)return !cfile->srch_inf.endOfSearch && !cfile->invalidHandle; } +static bool +cifs_can_echo (struct TCP_Server_Info *server) +{ +if (server->tcpStatus == CifsGood) +return true; + +return false; +} +struct smb_version_operations smb1_operations = { .send_cancel = send_nt_cancel, .compare_fids = cifs_compare_fids,@@ -1049,6 +1058,7 @@ struct smb_version_operations smb1_operations = { .get_dfs_refer = CIFSGetDFSRefer, .qfs_tcon = cifs_qfs_tcon, .is_path_accessible = cifs_is_path_accessible, + .can_echo = cifs_can_echo, .query_path_info = cifs_query_path_info, .query_file_info = cifs_query_file_info, .get_srv_inum = cifs_get_srv_inum, --Quoted 2 lines
2.9.3
This fixes the issue for me.
Quoted 5 lines
Tested-by Jonathan Liu <[email protected]>--
To unsubscribe from this list: send the line "unsubscribe linux-cifs" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.htmlQuoted 4 lines
--
Thanks,Steve
I think this patch should go to stable as well.
--
Best regards,
Pavel Shilovsky
Signature · 3 lines
Thanks, Steve
Hi Sachin,
Quoted 30 lines · Sachin Prabhu
commit
4fcd1813e640("Fix reconnect to not defer smb3 session reconnect long after socket reconnect") added support for Negotiate requests to be initiated by echo calls.To avoid delays in calling echo after a reconnect, I added the patch introduced by the commit
b8c600120fc8("Call echo service immediately after socket reconnect").This has however caused a regression with cifs shares which do not have support for echo calls to trigger Negotiate requests. On connections which need to call Negotiation, the echo calls trigger an error which triggers a reconnect which in turn triggers another echo call. This results in a loop which is only broken when an operation is performed on the cifs share. For an idle share, it can DOS a server.
The patch uses the
smb_operationcan_echo()for cifs so that it is called only if connection has been already been setup.kernel bz: 194531
Signed-off-by Sachin Prabhu <[email protected]>--- fs/cifs/smb1ops.c | 10 ++++++++++ 1 file changed, 10 insertions(+)fs/cifs/smb1ops.c +0
-0
fs/cifs/smb1ops.c cifs_dir_needs_close(struct cifsFileInfo *cfile) · line 1024
Quoted 10 lines
fs/cifs/smb1ops.c +7
-0@@ -1015,6 +1015,15 @@ cifs_dir_needs_close(struct cifsFileInfo *cfile)return !cfile->srch_inf.endOfSearch && !cfile->invalidHandle; } +static bool +cifs_can_echo (struct TCP_Server_Info *server) +{ +if (server->tcpStatus == CifsGood) +return true; + +return false;
scripts/checkpatch.pl shows whitespace errors:
ERROR: code indent should use tabs where possible
#43: FILE: fs/cifs/smb1ops.c:1022:
+^I return true;$
total: 1 errors, 0 warnings, 22 lines checked
Can be written more simply as:
return server->tcpStatus == CifsGood;
Quoted 14 lines
fs/cifs/smb1ops.c +3
-1+} +struct smb_version_operations smb1_operations = { .send_cancel = send_nt_cancel, .compare_fids = cifs_compare_fids,@@ -1049,6 +1058,7 @@ struct smb_version_operations smb1_operations = { .get_dfs_refer = CIFSGetDFSRefer, .qfs_tcon = cifs_qfs_tcon, .is_path_accessible = cifs_is_path_accessible, + .can_echo = cifs_can_echo, .query_path_info = cifs_query_path_info, .query_file_info = cifs_query_file_info, .get_srv_inum = cifs_get_srv_inum, --
Quoted 2 lines
2.9.3
Regards,
Jonathan