diff mbox

Dump SMB3 share capabilities and flags

Message ID CAH2r5mvciRhWVYjh5Un-BSwU3wddsmMF1XuC63DxwR1J-NBz=w@mail.gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Steve French June 19, 2013, 5:24 p.m. UTC
SMB3 protocol adds various optional per-share capabilities (and
SMB3.02 adds one more beyond that).  Add ability to dump
(/proc/fs/cifs/DebugData) the share capabilities and share flags to
improve debugging.

Signed-off-by: Steve French <smfrench@gmail.com>

 	tcon->need_reconnect = false;

Comments

Jeff Layton June 19, 2013, 5:31 p.m. UTC | #1
On Wed, 19 Jun 2013 12:24:07 -0500
Steve French <smfrench@gmail.com> wrote:

> SMB3 protocol adds various optional per-share capabilities (and
> SMB3.02 adds one more beyond that).  Add ability to dump
> (/proc/fs/cifs/DebugData) the share capabilities and share flags to
> improve debugging.
> 
> Signed-off-by: Steve French <smfrench@gmail.com>
> 
> diff --git a/fs/cifs/cifs_debug.c b/fs/cifs/cifs_debug.c
> index 856f8f5..9a39650 100644
> --- a/fs/cifs/cifs_debug.c
> +++ b/fs/cifs/cifs_debug.c
> @@ -224,6 +224,8 @@ static int cifs_debug_data_proc_show(struct
> seq_file *m, void *v)
>  					seq_puts(m, " type: CDROM ");
>  				else
>  					seq_printf(m, " type: %d ", dev_type);
> +				if (server->ops->dump_share_caps)
> +					server->ops->dump_share_caps(m, tcon);
> 
>  				if (tcon->need_reconnect)
>  					seq_puts(m, "\tDISCONNECTED ");
> diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
> index f13cbbe..d6f6939 100644
> --- a/fs/cifs/cifsglob.h
> +++ b/fs/cifs/cifsglob.h
> @@ -223,6 +223,7 @@ struct smb_version_operations {
>  	void (*dump_detail)(void *);
>  	void (*clear_stats)(struct cifs_tcon *);
>  	void (*print_stats)(struct seq_file *m, struct cifs_tcon *);
> +	void (*dump_share_caps)(struct seq_file *, struct cifs_tcon *);
>  	/* verify the message */
>  	int (*check_message)(char *, unsigned int);
>  	bool (*is_oplock_break)(char *, struct TCP_Server_Info *);
> diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
> index 14539c7..32bb62e 100644
> --- a/fs/cifs/smb2ops.c
> +++ b/fs/cifs/smb2ops.c
> @@ -281,6 +281,25 @@ smb2_clear_stats(struct cifs_tcon *tcon)
>  }
> 
>  static void
> +smb2_dump_share_caps(struct seq_file *m, struct cifs_tcon *tcon)
> +{
> +	seq_puts(m, "\nShare Capabilities:");
> +	if (tcon->capabilities & SMB2_SHARE_CAP_DFS)
> +		seq_puts(m, " DFS,");
> +	if (tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
> +		seq_puts(m, " CONTINUOUS AVAILABILITY,");
> +	if (tcon->capabilities & SMB2_SHARE_CAP_SCALEOUT)
> +		seq_puts(m, " SCALEOUT,");
> +	if (tcon->capabilities & SMB2_SHARE_CAP_CLUSTER)
> +		seq_puts(m, " CLUSTER,");
> +	if (tcon->capabilities & SMB2_SHARE_CAP_ASYMMETRIC)
> +		seq_puts(m, " ASYMMETRIC,");
> +	if (tcon->capabilities == 0)
> +		seq_puts(m, " None");
> +	seq_printf(m, "\tShare Flags: %d", tcon->share_flags);
> +}
> +
> +static void
>  smb2_print_stats(struct seq_file *m, struct cifs_tcon *tcon)
>  {
>  #ifdef CONFIG_CIFS_STATS
> @@ -645,6 +664,7 @@ struct smb_version_operations smb30_operations = {
>  	.dump_detail = smb2_dump_detail,
>  	.clear_stats = smb2_clear_stats,
>  	.print_stats = smb2_print_stats,
> +	.dump_share_caps = smb2_dump_share_caps,
>  	.is_oplock_break = smb2_is_valid_oplock_break,
>  	.need_neg = smb2_need_neg,
>  	.negotiate = smb2_negotiate,
> diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
> index cb155bf..a6237ae 100644
> --- a/fs/cifs/smb2pdu.c
> +++ b/fs/cifs/smb2pdu.c
> @@ -741,6 +741,7 @@ SMB2_tcon(const unsigned int xid, struct cifs_ses
> *ses, const char *tree,
>  	}
> 
>  	tcon->share_flags = le32_to_cpu(rsp->ShareFlags);
> +	tcon->capabilities = le32_to_cpu(rsp->Capabilities);
>  	tcon->maximal_access = le32_to_cpu(rsp->MaximalAccess);
>  	tcon->tidStatus = CifsGood;
>  	tcon->need_reconnect = false;
> 

Looks reasonable...

Acked-by: Jeff Layton <jlayton@redhat.com>
--
To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/fs/cifs/cifs_debug.c b/fs/cifs/cifs_debug.c
index 856f8f5..9a39650 100644
--- a/fs/cifs/cifs_debug.c
+++ b/fs/cifs/cifs_debug.c
@@ -224,6 +224,8 @@  static int cifs_debug_data_proc_show(struct
seq_file *m, void *v)
 					seq_puts(m, " type: CDROM ");
 				else
 					seq_printf(m, " type: %d ", dev_type);
+				if (server->ops->dump_share_caps)
+					server->ops->dump_share_caps(m, tcon);

 				if (tcon->need_reconnect)
 					seq_puts(m, "\tDISCONNECTED ");
diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
index f13cbbe..d6f6939 100644
--- a/fs/cifs/cifsglob.h
+++ b/fs/cifs/cifsglob.h
@@ -223,6 +223,7 @@  struct smb_version_operations {
 	void (*dump_detail)(void *);
 	void (*clear_stats)(struct cifs_tcon *);
 	void (*print_stats)(struct seq_file *m, struct cifs_tcon *);
+	void (*dump_share_caps)(struct seq_file *, struct cifs_tcon *);
 	/* verify the message */
 	int (*check_message)(char *, unsigned int);
 	bool (*is_oplock_break)(char *, struct TCP_Server_Info *);
diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
index 14539c7..32bb62e 100644
--- a/fs/cifs/smb2ops.c
+++ b/fs/cifs/smb2ops.c
@@ -281,6 +281,25 @@  smb2_clear_stats(struct cifs_tcon *tcon)
 }

 static void
+smb2_dump_share_caps(struct seq_file *m, struct cifs_tcon *tcon)
+{
+	seq_puts(m, "\nShare Capabilities:");
+	if (tcon->capabilities & SMB2_SHARE_CAP_DFS)
+		seq_puts(m, " DFS,");
+	if (tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
+		seq_puts(m, " CONTINUOUS AVAILABILITY,");
+	if (tcon->capabilities & SMB2_SHARE_CAP_SCALEOUT)
+		seq_puts(m, " SCALEOUT,");
+	if (tcon->capabilities & SMB2_SHARE_CAP_CLUSTER)
+		seq_puts(m, " CLUSTER,");
+	if (tcon->capabilities & SMB2_SHARE_CAP_ASYMMETRIC)
+		seq_puts(m, " ASYMMETRIC,");
+	if (tcon->capabilities == 0)
+		seq_puts(m, " None");
+	seq_printf(m, "\tShare Flags: %d", tcon->share_flags);
+}
+
+static void
 smb2_print_stats(struct seq_file *m, struct cifs_tcon *tcon)
 {
 #ifdef CONFIG_CIFS_STATS
@@ -645,6 +664,7 @@  struct smb_version_operations smb30_operations = {
 	.dump_detail = smb2_dump_detail,
 	.clear_stats = smb2_clear_stats,
 	.print_stats = smb2_print_stats,
+	.dump_share_caps = smb2_dump_share_caps,
 	.is_oplock_break = smb2_is_valid_oplock_break,
 	.need_neg = smb2_need_neg,
 	.negotiate = smb2_negotiate,
diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
index cb155bf..a6237ae 100644
--- a/fs/cifs/smb2pdu.c
+++ b/fs/cifs/smb2pdu.c
@@ -741,6 +741,7 @@  SMB2_tcon(const unsigned int xid, struct cifs_ses
*ses, const char *tree,
 	}

 	tcon->share_flags = le32_to_cpu(rsp->ShareFlags);
+	tcon->capabilities = le32_to_cpu(rsp->Capabilities);
 	tcon->maximal_access = le32_to_cpu(rsp->MaximalAccess);
 	tcon->tidStatus = CifsGood;