ACK: [SRU][Yakkety][PATCH 1/1] cifs: Do not send echoes before Negotiate is complete

Colin Ian King colin.king at canonical.com
Wed May 31 07:57:11 UTC 2017


On 30/05/17 19:55, Joseph Salisbury wrote:
> From: Sachin Prabhu <sprabhu at redhat.com>
> 
> BugLink: http://bugs.launchpad.net/bugs/1686099
> 
> 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 at redhat.com>
> Tested-by: Jonathan Liu <net147 at gmail.com>
> Acked-by: Pavel Shilovsky <pshilov at microsoft.com>
> CC: Stable <stable at vger.kernel.org>
> Signed-off-by: Steve French <smfrench at gmail.com>
> (cherry picked from commit 62a6cfddcc0a5313e7da3e8311ba16226fe0ac10)
> Signed-off-by: Joseph Salisbury <joseph.salisbury at canonical.com>
> ---
>  fs/cifs/smb1ops.c | 10 ++++++++++
>  1 file changed, 10 insertions(+)
> 
> diff --git a/fs/cifs/smb1ops.c b/fs/cifs/smb1ops.c
> index fc537c2..87b87e0 100644
> --- a/fs/cifs/smb1ops.c
> +++ b/fs/cifs/smb1ops.c
> @@ -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,
> 

Looks good. Thanks Joe

Acked-by: Colin Ian King <colin.king at canonical.com>




More information about the kernel-team mailing list