| From 62a6cfddcc0a5313e7da3e8311ba16226fe0ac10 Mon Sep 17 00:00:00 2001 |
| From: Sachin Prabhu <sprabhu@redhat.com> |
| Date: Sun, 16 Apr 2017 20:37:24 +0100 |
| Subject: cifs: Do not send echoes before Negotiate is complete |
| |
| From: Sachin Prabhu <sprabhu@redhat.com> |
| |
| commit 62a6cfddcc0a5313e7da3e8311ba16226fe0ac10 upstream. |
| |
| 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 |
| |
| Signed-off-by: Sachin Prabhu <sprabhu@redhat.com> |
| Tested-by: Jonathan Liu <net147@gmail.com> |
| Acked-by: Pavel Shilovsky <pshilov@microsoft.com> |
| Signed-off-by: Steve French <smfrench@gmail.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/cifs/smb1ops.c | 10 ++++++++++ |
| 1 file changed, 10 insertions(+) |
| |
| --- a/fs/cifs/smb1ops.c |
| +++ b/fs/cifs/smb1ops.c |
| @@ -1015,6 +1015,15 @@ cifs_dir_needs_close(struct cifsFileInfo |
| 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_opera |
| .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, |