CIFS: Respect SMB2 header/max header size
authorPavel Shilovsky <piastry@etersoft.ru>
Thu, 12 Jan 2012 18:40:50 +0000 (22:40 +0400)
committerPavel Shilovsky <pshilovsky@samba.org>
Tue, 24 Jul 2012 17:54:54 +0000 (21:54 +0400)
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>
Signed-off-by: Steve French <smfrench@gmail.com>
fs/cifs/cifsfs.c
fs/cifs/misc.c

index 2e9929dc2072cfc0f5ddf3b64cec7212da5e6a77..7a7cda9f7912d1a7a05baa4e78b3507e1492d23e 100644 (file)
@@ -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;
@@ -980,6 +983,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 */
@@ -991,8 +1002,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;
index 64601146f1573fb3265edfeeab95284c4ef316e2..ad2538a64c7089531ecd2c46abf6116f21559a04 100644 (file)
@@ -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);