Linux CIFS filesystem development
 help / color / mirror / Atom feed
From: Jeff Layton <jlayton-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
To: Pavel Shilovsky <pshilovsky-eUNUBHrolfbYtjvyW6yDsg@public.gmane.org>
Cc: linux-cifs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [PATCH v2 06/24] CIFS: Add SMB2 credits support
Date: Wed, 20 Jun 2012 19:20:38 -0700	[thread overview]
Message-ID: <20120620192038.26b486ec@corrin.poochiereds.net> (raw)
In-Reply-To: <1340202664-28696-7-git-send-email-pshilovsky-eUNUBHrolfbYtjvyW6yDsg@public.gmane.org>

On Wed, 20 Jun 2012 18:30:46 +0400
Pavel Shilovsky <pshilovsky-eUNUBHrolfbYtjvyW6yDsg@public.gmane.org> wrote:

> For SMB2 protocol we can add more than one credit for one received
> request: it depends on CreditRequest field in SMB2 response header.
> Also we divide all requests by type: echos, oplocks and others. Each
> type uses its own slot pull.
> 
> Signed-off-by: Pavel Shilovsky <pshilovsky-eUNUBHrolfbYtjvyW6yDsg@public.gmane.org>
> ---
>  fs/cifs/cifsglob.h  |    5 +++
>  fs/cifs/cifsproto.h |    1 +
>  fs/cifs/connect.c   |    2 +-
>  fs/cifs/smb2ops.c   |   77 +++++++++++++++++++++++++++++++++++++++++++++++++++
>  4 files changed, 84 insertions(+), 1 deletions(-)
> 
> diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
> index 3575f0f..d94d3ee 100644
> --- a/fs/cifs/cifsglob.h
> +++ b/fs/cifs/cifsglob.h
> @@ -343,6 +343,11 @@ struct TCP_Server_Info {
>  	char server_GUID[16];
>  	__u16 sec_mode;
>  	bool session_estab; /* mark when very first sess is established */
> +#ifdef CONFIG_CIFS_SMB2
> +	int echo_credits;  /* echo reserved slots */
> +	int oplock_credits;  /* oplock break reserved slots */
> +	bool echos:1; /* enable echos */
> +#endif
>  	u16 dialect; /* dialect index that server chose */
>  	enum securityEnum secType;
>  	bool oplocks:1; /* enable oplocks */
> diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
> index 80d35ee..907f43c 100644
> --- a/fs/cifs/cifsproto.h
> +++ b/fs/cifs/cifsproto.h
> @@ -91,6 +91,7 @@ extern int SendReceiveBlockingLock(const unsigned int xid,
>  			struct smb_hdr *in_buf ,
>  			struct smb_hdr *out_buf,
>  			int *bytes_returned);
> +extern int cifs_reconnect(struct TCP_Server_Info *server);
>  extern int checkSMB(char *buf, unsigned int length);
>  extern bool is_valid_oplock_break(char *, struct TCP_Server_Info *);
>  extern bool backup_cred(struct cifs_sb_info *);
> diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
> index 718bbea..cced470 100644
> --- a/fs/cifs/connect.c
> +++ b/fs/cifs/connect.c
> @@ -296,7 +296,7 @@ static int cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
>   * reconnect tcp session
>   * wake up waiters on reconnection? - (not needed currently)
>   */
> -static int
> +int
>  cifs_reconnect(struct TCP_Server_Info *server)
>  {
>  	int rc = 0;
> diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
> index 09530f4..ab2590f 100644
> --- a/fs/cifs/smb2ops.c
> +++ b/fs/cifs/smb2ops.c
> @@ -20,6 +20,79 @@
>  #include "cifsglob.h"
>  #include "smb2pdu.h"
>  #include "smb2proto.h"
> +#include "cifsproto.h"
> +#include "cifs_debug.h"
> +
> +static void
> +change_conf(struct TCP_Server_Info *server)
> +{
> +	server->credits += server->echo_credits + server->oplock_credits;
> +	server->oplock_credits = server->echo_credits = 0;
> +	switch (server->credits) {
> +	case 0:
> +		cifs_reconnect(server);
> +		return;
> +	case 1:
> +		server->echos = false;

		minor nit if you end up respinning this. The proper
		spelling in English is "echoes".

> +		server->oplocks = false;
> +		cERROR(1, "disabling echos and oplocks");
> +		break;
> +	case 2:
> +		server->echos = true;
> +		server->oplocks = false;
> +		server->echo_credits = 1;
> +		cFYI(1, "disabling oplocks");
> +		break;
> +	default:
> +		server->echos = true;
> +		server->oplocks = true;
> +		server->echo_credits = 1;
> +		server->oplock_credits = 1;
> +	}
> +	server->credits -= server->echo_credits + server->oplock_credits;
> +}
> +
> +static void
> +smb2_add_credits(struct TCP_Server_Info *server, const unsigned int add,
> +		 const int optype)
> +{
> +	int *val;
> +	spin_lock(&server->req_lock);
> +	val = server->ops->get_credits_field(server, optype);
> +	*val += add;
> +	server->in_flight--;
> +	if (server->in_flight == 0)
> +		change_conf(server);
> +	spin_unlock(&server->req_lock);
> +	wake_up(&server->request_q);
> +}
> +
> +static void
> +smb2_set_credits(struct TCP_Server_Info *server, const int val)
> +{
> +	spin_lock(&server->req_lock);
> +	server->credits = val;
> +	spin_unlock(&server->req_lock);
> +}
> +
> +static int *
> +smb2_get_credits_field(struct TCP_Server_Info *server, const int optype)
> +{
> +	switch (optype) {
> +	case CIFS_ECHO_OP:
> +		return &server->echo_credits;
> +	case CIFS_OBREAK_OP:
> +		return &server->oplock_credits;
> +	default:
> +		return &server->credits;
> +	}
> +}
> +
> +static unsigned int
> +smb2_get_credits(struct mid_q_entry *mid)
> +{
> +	return le16_to_cpu(((struct smb2_hdr *)mid->resp_buf)->CreditRequest);
> +}
>  
>  static __u64
>  smb2_get_next_mid(struct TCP_Server_Info *server)
> @@ -35,6 +108,10 @@ smb2_get_next_mid(struct TCP_Server_Info *server)
>  struct smb_version_operations smb21_operations = {
>  	.setup_request = smb2_setup_request,
>  	.check_receive = smb2_check_receive,
> +	.add_credits = smb2_add_credits,
> +	.set_credits = smb2_set_credits,
> +	.get_credits_field = smb2_get_credits_field,
> +	.get_credits = smb2_get_credits,
>  	.get_next_mid = smb2_get_next_mid,
>  };
>  

Looks fine.

Reviewed-by: Jeff Layton <jlayton-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>

  parent reply	other threads:[~2012-06-21  2:20 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-06-20 14:30 [PATCH v2 00/24] Get SMB2 mount work Pavel Shilovsky
     [not found] ` <1340202664-28696-1-git-send-email-pshilovsky-eUNUBHrolfbYtjvyW6yDsg@public.gmane.org>
2012-06-20 14:30   ` [PATCH v2 01/24] CIFS: Rename Get/FreeXid and make them work with unsigned int Pavel Shilovsky
     [not found]     ` <1340202664-28696-2-git-send-email-pshilovsky-eUNUBHrolfbYtjvyW6yDsg@public.gmane.org>
2012-06-21  0:58       ` Jeff Layton
2012-06-20 14:30   ` [PATCH v2 02/24] CIFS: Rename 7 error codes to NT_ style Pavel Shilovsky
     [not found]     ` <1340202664-28696-3-git-send-email-pshilovsky-eUNUBHrolfbYtjvyW6yDsg@public.gmane.org>
2012-06-21  1:00       ` Jeff Layton
     [not found]         ` <20120620180028.052b33ac-4QP7MXygkU+dMjc06nkz3ljfA9RmPOcC@public.gmane.org>
2012-06-21  7:54           ` Pavel Shilovsky
2012-06-20 14:30   ` [PATCH v2 03/24] CIFS: Add SMB2 status codes Pavel Shilovsky
     [not found]     ` <1340202664-28696-4-git-send-email-pshilovsky-eUNUBHrolfbYtjvyW6yDsg@public.gmane.org>
2012-06-21  2:35       ` Jeff Layton
2012-06-20 14:30   ` [PATCH v2 05/24] CIFS: Make transport routines work with SMB2 Pavel Shilovsky
     [not found]     ` <1340202664-28696-6-git-send-email-pshilovsky-eUNUBHrolfbYtjvyW6yDsg@public.gmane.org>
2012-06-21 16:41       ` Jeff Layton
2012-06-20 14:30   ` [PATCH v2 06/24] CIFS: Add SMB2 credits support Pavel Shilovsky
     [not found]     ` <1340202664-28696-7-git-send-email-pshilovsky-eUNUBHrolfbYtjvyW6yDsg@public.gmane.org>
2012-06-21  2:20       ` Jeff Layton [this message]
     [not found]         ` <20120620192038.26b486ec-4QP7MXygkU+dMjc06nkz3ljfA9RmPOcC@public.gmane.org>
2012-06-21  7:43           ` Pavel Shilovsky
2012-06-20 14:30   ` [PATCH v2 07/24] CIFS: Make demultiplex_thread work with SMB2 code Pavel Shilovsky
     [not found]     ` <1340202664-28696-8-git-send-email-pshilovsky-eUNUBHrolfbYtjvyW6yDsg@public.gmane.org>
2012-06-21 18:44       ` Jeff Layton
     [not found]         ` <20120621114437.72a9483d-4QP7MXygkU+dMjc06nkz3ljfA9RmPOcC@public.gmane.org>
2012-06-22 14:59           ` Pavel Shilovsky
     [not found]             ` <CAKywueRCTr8bva4tX42JHH=j88i3t5+E0GNrVbKwhwp9hJScPg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-06-22 21:55               ` Steve French
     [not found]                 ` <CAH2r5mv+_BXmc9rm59shjBoNmcfhUHidDAbmhrrPi6Na+-p6WQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-06-23  2:10                   ` Jeff Layton
2012-06-20 14:30   ` [PATCH v2 08/24] CIFS: Respect SMB2 header/max header size Pavel Shilovsky
2012-06-20 14:30   ` [PATCH v2 09/24] CIFS: Add capability to send SMB2 negotiate message Pavel Shilovsky
2012-06-20 14:30   ` [PATCH v2 10/24] CIFS: Add session setup/logoff capability for SMB2 Pavel Shilovsky
2012-06-20 14:30   ` [PATCH v2 11/24] CIFS: Add tree connect/disconnect " Pavel Shilovsky
2012-06-20 14:30   ` [PATCH v2 12/24] CIFS: Process reconnects for SMB2 shares Pavel Shilovsky
2012-06-20 14:30   ` [PATCH v2 13/24] CIFS: Move getting dfs referalls to ops struct Pavel Shilovsky
2012-06-20 14:30   ` [PATCH v2 14/24] CIFS: Move informational tcon calls " Pavel Shilovsky
2012-06-20 14:30   ` [PATCH v2 15/24] CIFS: Move is_path_accessible " Pavel Shilovsky
2012-06-20 14:30   ` [PATCH v2 16/24] CIFS: Add SMB2 support for is_path_accessible Pavel Shilovsky
2012-06-20 14:30   ` [PATCH v2 17/24] CIFS: Move query inode info code to ops struct Pavel Shilovsky
2012-06-20 14:30   ` [PATCH v2 18/24] CIFS: Query SMB2 inode info Pavel Shilovsky
2012-06-20 14:30   ` [PATCH v2 19/24] CIFS: Move building path to root to ops struct Pavel Shilovsky
2012-06-20 14:31   ` [PATCH v2 20/24] CIFS: Add SMB2 support for build_path_to_root Pavel Shilovsky
2012-06-20 14:31   ` [PATCH v2 21/24] CIFS: Move echo code to osp struct Pavel Shilovsky
2012-06-20 14:31   ` [PATCH v2 22/24] CIFS: Add echo request support for SMB2 Pavel Shilovsky
2012-06-20 14:31   ` [PATCH v2 23/24] CIFS: Move clear/print_stats code to ops struct Pavel Shilovsky
2012-06-20 14:31   ` [PATCH v2 24/24] CIFS: Allow SMB2 statistics to be tracked Pavel Shilovsky
2012-06-20 14:37   ` [PATCH v2 00/24] Get SMB2 mount work Pavel Shilovsky

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20120620192038.26b486ec@corrin.poochiereds.net \
    --to=jlayton-h+wxahxf7alqt0dzr+alfa@public.gmane.org \
    --cc=linux-cifs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=pshilovsky-eUNUBHrolfbYtjvyW6yDsg@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox