smb: client: insert compression check/call on write requests
authorEnzo Matsumiya <ematsumiya@suse.de>
Wed, 11 Sep 2024 21:10:24 +0000 (16:10 -0500)
committerSteve French <stfrench@microsoft.com>
Sun, 15 Sep 2024 15:42:44 +0000 (10:42 -0500)
On smb2_async_writev(), set CIFS_COMPRESS_REQ on request flags if
should_compress() returns true.

On smb_send_rqst() check the flags, and compress and send the request to
the server.

(*) If the compression fails with -EMSGSIZE (i.e. compressed size is >=
uncompressed size), the original uncompressed request is sent instead.

Signed-off-by: Enzo Matsumiya <ematsumiya@suse.de>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/client/smb2pdu.c
fs/smb/client/transport.c

index 0b236cb625726c5bb00c895fea6103d63da9c9c2..f68746becd6463d9085b1472193b839f4d8b024f 100644 (file)
@@ -42,6 +42,7 @@
 #include "dfs_cache.h"
 #endif
 #include "cached_dir.h"
+#include "compress.h"
 
 /*
  *  The following table defines the expected "StructureSize" of SMB2 requests
@@ -5020,6 +5021,10 @@ smb2_async_writev(struct cifs_io_subrequest *wdata)
                flags |= CIFS_HAS_CREDITS;
        }
 
+       /* XXX: compression + encryption is unsupported for now */
+       if (((flags & CIFS_TRANSFORM_REQ) != CIFS_TRANSFORM_REQ) && should_compress(tcon, &rqst))
+               flags |= CIFS_COMPRESS_REQ;
+
        rc = cifs_call_async(server, &rqst, NULL, smb2_writev_callback, NULL,
                             wdata, flags, &wdata->credits);
        /* Can't touch wdata if rc == 0 */
index 6e68aaf5bd20357e35b0aa090ca75acc9f3b4017..fd5a85d437590b80a4210b6482b6a422fb5d3188 100644 (file)
@@ -28,6 +28,7 @@
 #include "cifs_debug.h"
 #include "smb2proto.h"
 #include "smbdirect.h"
+#include "compress.h"
 
 /* Max number of iovectors we can use off the stack when sending requests. */
 #define CIFS_MAX_IOV_SIZE 8
@@ -432,6 +433,9 @@ smb_send_rqst(struct TCP_Server_Info *server, int num_rqst,
        struct kvec *iov;
        int rc;
 
+       if (flags & CIFS_COMPRESS_REQ)
+               return smb_compress(server, &rqst[0], __smb_send_rqst);
+
        if (!(flags & CIFS_TRANSFORM_REQ))
                return __smb_send_rqst(server, num_rqst, rqst);