diff mbox

[v3,14/32] CIFS: Respect SMB2 header/max header size

Message ID 1342166025-29377-15-git-send-email-pshilovsky@samba.org (mailing list archive)
State New, archived
Headers show

Commit Message

Pavel Shilovsky July 13, 2012, 7:53 a.m. UTC
From: Pavel Shilovsky <piastry@etersoft.ru>

Use SMB2 header size values for allocation and memset because they
are bigger and suitable for both CIFS and SMB2.

Signed-off-by: Pavel Shilovsky <piastry@etersoft.ru>
---
 fs/cifs/cifsfs.c |   14 ++++++++++++--
 fs/cifs/misc.c   |   25 +++++++++++++++++++------
 2 files changed, 31 insertions(+), 8 deletions(-)

Comments

Jeff Layton July 25, 2012, 7:09 p.m. UTC | #1
On Fri, 13 Jul 2012 11:53:27 +0400
Pavel Shilovsky <pshilovsky@samba.org> wrote:

> From: Pavel Shilovsky <piastry@etersoft.ru>
> 
> Use SMB2 header size values for allocation and memset because they
> are bigger and suitable for both CIFS and SMB2.
> 
> Signed-off-by: Pavel Shilovsky <piastry@etersoft.ru>
> ---
>  fs/cifs/cifsfs.c |   14 ++++++++++++--
>  fs/cifs/misc.c   |   25 +++++++++++++++++++------
>  2 files changed, 31 insertions(+), 8 deletions(-)
> 
> diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c
> index 8dc1492..5cf9299 100644
> --- a/fs/cifs/cifsfs.c
> +++ b/fs/cifs/cifsfs.c
> @@ -48,6 +48,9 @@
>  #include <linux/key-type.h>
>  #include "cifs_spnego.h"
>  #include "fscache.h"
> +#ifdef CONFIG_CIFS_SMB2
> +#include "smb2pdu.h"
> +#endif
>  #define CIFS_MAGIC_NUMBER 0xFF534D42	/* the first four bytes of SMB PDUs */
>  
>  int cifsFYI = 0;
> @@ -981,6 +984,14 @@ cifs_destroy_inodecache(void)
>  static int
>  cifs_init_request_bufs(void)
>  {
> +	size_t max_hdr_size = MAX_CIFS_HDR_SIZE;
> +#ifdef CONFIG_CIFS_SMB2
> +	/*
> +	 * SMB2 maximum header size is bigger than CIFS one - no problems to
> +	 * allocate some more bytes for CIFS.
> +	 */
> +	max_hdr_size = MAX_SMB2_HDR_SIZE;
> +#endif
>  	if (CIFSMaxBufSize < 8192) {
>  	/* Buffer size can not be smaller than 2 * PATH_MAX since maximum
>  	Unicode path name has to fit in any SMB/CIFS path based frames */
> @@ -992,8 +1003,7 @@ cifs_init_request_bufs(void)
>  	}
>  /*	cERROR(1, "CIFSMaxBufSize %d 0x%x",CIFSMaxBufSize,CIFSMaxBufSize); */
>  	cifs_req_cachep = kmem_cache_create("cifs_request",
> -					    CIFSMaxBufSize +
> -					    MAX_CIFS_HDR_SIZE, 0,
> +					    CIFSMaxBufSize + max_hdr_size, 0,
>  					    SLAB_HWCACHE_ALIGN, NULL);
>  	if (cifs_req_cachep == NULL)
>  		return -ENOMEM;
> diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c
> index 6460114..ad2538a 100644
> --- a/fs/cifs/misc.c
> +++ b/fs/cifs/misc.c
> @@ -29,6 +29,9 @@
>  #include "smberr.h"
>  #include "nterr.h"
>  #include "cifs_unicode.h"
> +#ifdef CONFIG_CIFS_SMB2
> +#include "smb2pdu.h"
> +#endif
>  
>  extern mempool_t *cifs_sm_req_poolp;
>  extern mempool_t *cifs_req_poolp;
> @@ -143,17 +146,27 @@ struct smb_hdr *
>  cifs_buf_get(void)
>  {
>  	struct smb_hdr *ret_buf = NULL;
> -
> -/* We could use negotiated size instead of max_msgsize -
> -   but it may be more efficient to always alloc same size
> -   albeit slightly larger than necessary and maxbuffersize
> -   defaults to this and can not be bigger */
> +	size_t buf_size = sizeof(struct smb_hdr);
> +
> +#ifdef CONFIG_CIFS_SMB2
> +	/*
> +	 * SMB2 header is bigger than CIFS one - no problems to clean some
> +	 * more bytes for CIFS.
> +	 */
> +	buf_size = sizeof(struct smb2_hdr);
> +#endif
> +	/*
> +	 * We could use negotiated size instead of max_msgsize -
> +	 * but it may be more efficient to always alloc same size
> +	 * albeit slightly larger than necessary and maxbuffersize
> +	 * defaults to this and can not be bigger.
> +	 */
>  	ret_buf = mempool_alloc(cifs_req_poolp, GFP_NOFS);
>  
>  	/* clear the first few header bytes */
>  	/* for most paths, more is cleared in header_assemble */
>  	if (ret_buf) {
> -		memset(ret_buf, 0, sizeof(struct smb_hdr) + 3);
> +		memset(ret_buf, 0, buf_size + 3);
>  		atomic_inc(&bufAllocCount);
>  #ifdef CONFIG_CIFS_STATS2
>  		atomic_inc(&totBufAllocCount);

Reviewed-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/cifsfs.c b/fs/cifs/cifsfs.c
index 8dc1492..5cf9299 100644
--- a/fs/cifs/cifsfs.c
+++ b/fs/cifs/cifsfs.c
@@ -48,6 +48,9 @@ 
 #include <linux/key-type.h>
 #include "cifs_spnego.h"
 #include "fscache.h"
+#ifdef CONFIG_CIFS_SMB2
+#include "smb2pdu.h"
+#endif
 #define CIFS_MAGIC_NUMBER 0xFF534D42	/* the first four bytes of SMB PDUs */
 
 int cifsFYI = 0;
@@ -981,6 +984,14 @@  cifs_destroy_inodecache(void)
 static int
 cifs_init_request_bufs(void)
 {
+	size_t max_hdr_size = MAX_CIFS_HDR_SIZE;
+#ifdef CONFIG_CIFS_SMB2
+	/*
+	 * SMB2 maximum header size is bigger than CIFS one - no problems to
+	 * allocate some more bytes for CIFS.
+	 */
+	max_hdr_size = MAX_SMB2_HDR_SIZE;
+#endif
 	if (CIFSMaxBufSize < 8192) {
 	/* Buffer size can not be smaller than 2 * PATH_MAX since maximum
 	Unicode path name has to fit in any SMB/CIFS path based frames */
@@ -992,8 +1003,7 @@  cifs_init_request_bufs(void)
 	}
 /*	cERROR(1, "CIFSMaxBufSize %d 0x%x",CIFSMaxBufSize,CIFSMaxBufSize); */
 	cifs_req_cachep = kmem_cache_create("cifs_request",
-					    CIFSMaxBufSize +
-					    MAX_CIFS_HDR_SIZE, 0,
+					    CIFSMaxBufSize + max_hdr_size, 0,
 					    SLAB_HWCACHE_ALIGN, NULL);
 	if (cifs_req_cachep == NULL)
 		return -ENOMEM;
diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c
index 6460114..ad2538a 100644
--- a/fs/cifs/misc.c
+++ b/fs/cifs/misc.c
@@ -29,6 +29,9 @@ 
 #include "smberr.h"
 #include "nterr.h"
 #include "cifs_unicode.h"
+#ifdef CONFIG_CIFS_SMB2
+#include "smb2pdu.h"
+#endif
 
 extern mempool_t *cifs_sm_req_poolp;
 extern mempool_t *cifs_req_poolp;
@@ -143,17 +146,27 @@  struct smb_hdr *
 cifs_buf_get(void)
 {
 	struct smb_hdr *ret_buf = NULL;
-
-/* We could use negotiated size instead of max_msgsize -
-   but it may be more efficient to always alloc same size
-   albeit slightly larger than necessary and maxbuffersize
-   defaults to this and can not be bigger */
+	size_t buf_size = sizeof(struct smb_hdr);
+
+#ifdef CONFIG_CIFS_SMB2
+	/*
+	 * SMB2 header is bigger than CIFS one - no problems to clean some
+	 * more bytes for CIFS.
+	 */
+	buf_size = sizeof(struct smb2_hdr);
+#endif
+	/*
+	 * We could use negotiated size instead of max_msgsize -
+	 * but it may be more efficient to always alloc same size
+	 * albeit slightly larger than necessary and maxbuffersize
+	 * defaults to this and can not be bigger.
+	 */
 	ret_buf = mempool_alloc(cifs_req_poolp, GFP_NOFS);
 
 	/* clear the first few header bytes */
 	/* for most paths, more is cleared in header_assemble */
 	if (ret_buf) {
-		memset(ret_buf, 0, sizeof(struct smb_hdr) + 3);
+		memset(ret_buf, 0, buf_size + 3);
 		atomic_inc(&bufAllocCount);
 #ifdef CONFIG_CIFS_STATS2
 		atomic_inc(&totBufAllocCount);