Skip to contentSkip to conversation

cifs: Do not send echoes before Negotiate is complete

PATCH In review Sachin Prabhu 4 participants 6 messages Apr 16, 2017 – Apr 17, 2017 4 messages not in the archive

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

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
index cc93ba4..60a1979 100644
@@ -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

Tested-by
#2 lore raw

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_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 -1
index cc93ba4..60a1979 100644
@@ -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

#5 lore raw

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_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 -1
index cc93ba4..60a1979 100644
@@ -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.

--
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
#6 lore raw
In reply to a message not in the archive

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_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 -1
index cc93ba4..60a1979 100644
@@ -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

--
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

#8 lore raw

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_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 -1
index cc93ba4..60a1979 100644
@@ -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

--
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

Signature · 3 lines
Thanks,

Steve
#9 lore raw
In reply to a message not in the archive

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_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 +0 -0
index cc93ba4..60a1979 100644

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