cifs: Fix prepare_write to negotiate wsize if needed
authorDavid Howells <dhowells@redhat.com>
Wed, 18 Jun 2025 15:39:47 +0000 (16:39 +0100)
committerSteve French <stfrench@microsoft.com>
Sat, 21 Jun 2025 16:03:24 +0000 (11:03 -0500)
Fix cifs_prepare_write() to negotiate the wsize if it is unset.

Reviewed-by: Shyam Prasad N <nspmangalore@gmail.com>
Reviewed-by: Bharath SM <bharathsm@microsoft.com>
Signed-off-by: David Howells <dhowells@redhat.com>
cc: Paulo Alcantara <pc@manguebit.org>
cc: netfs@lists.linux.dev
cc: linux-fsdevel@vger.kernel.org
cc: linux-cifs@vger.kernel.org
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/client/file.c

index 9835672267d2776c8ed7edded2d4bdf942e77541..e9212da32f01e02beb38d3d8081bc2c5df9dd5d8 100644 (file)
@@ -52,6 +52,7 @@ static void cifs_prepare_write(struct netfs_io_subrequest *subreq)
        struct netfs_io_stream *stream = &req->rreq.io_streams[subreq->stream_nr];
        struct TCP_Server_Info *server;
        struct cifsFileInfo *open_file = req->cfile;
+       struct cifs_sb_info *cifs_sb = CIFS_SB(wdata->rreq->inode->i_sb);
        size_t wsize = req->rreq.wsize;
        int rc;
 
@@ -63,6 +64,10 @@ static void cifs_prepare_write(struct netfs_io_subrequest *subreq)
        server = cifs_pick_channel(tlink_tcon(open_file->tlink)->ses);
        wdata->server = server;
 
+       if (cifs_sb->ctx->wsize == 0)
+               cifs_negotiate_wsize(server, cifs_sb->ctx,
+                                    tlink_tcon(req->cfile->tlink));
+
 retry:
        if (open_file->invalidHandle) {
                rc = cifs_reopen_file(open_file, false);
@@ -160,10 +165,9 @@ static int cifs_prepare_read(struct netfs_io_subrequest *subreq)
        server = cifs_pick_channel(tlink_tcon(req->cfile->tlink)->ses);
        rdata->server = server;
 
-       if (cifs_sb->ctx->rsize == 0) {
+       if (cifs_sb->ctx->rsize == 0)
                cifs_negotiate_rsize(server, cifs_sb->ctx,
                                     tlink_tcon(req->cfile->tlink));
-       }
 
        rc = server->ops->wait_mtu_credits(server, cifs_sb->ctx->rsize,
                                           &size, &rdata->credits);