]> www.infradead.org Git - nvme.git/commitdiff
cifs: Only pick a channel once per read request
authorDavid Howells <dhowells@redhat.com>
Thu, 20 Jun 2024 17:31:28 +0000 (18:31 +0100)
committerSteve French <stfrench@microsoft.com>
Thu, 20 Jun 2024 20:21:44 +0000 (15:21 -0500)
In cifs, only pick a channel when setting up a read request rather than
doing so individually for every subrequest and instead use that channel for
all.  This mirrors what the code in v6.9 does.

Signed-off-by: David Howells <dhowells@redhat.com>
cc: Steve French <sfrench@samba.org>
cc: Paulo Alcantara <pc@manguebit.com>
cc: Jeff Layton <jlayton@kernel.org>
cc: linux-cifs@vger.kernel.org
cc: netfs@lists.linux.dev
cc: linux-fsdevel@vger.kernel.org
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/client/cifsglob.h
fs/smb/client/file.c

index 73482734a8d8e9523940b8d0e791320edc6b6863..0978997ddfa6bcf1ff96a5d8125dd3018e8ebe66 100644 (file)
@@ -1494,6 +1494,7 @@ struct cifs_aio_ctx {
 struct cifs_io_request {
        struct netfs_io_request         rreq;
        struct cifsFileInfo             *cfile;
+       struct TCP_Server_Info          *server;
 };
 
 /* asynchronous read support */
index 1e269e0bc75b352027e83694e73c2a4f76a69eeb..4dbd80168a2bcdb8548e7bd5c67777ee331926c2 100644 (file)
@@ -134,17 +134,15 @@ fail:
 static bool cifs_clamp_length(struct netfs_io_subrequest *subreq)
 {
        struct netfs_io_request *rreq = subreq->rreq;
-       struct TCP_Server_Info *server;
        struct cifs_io_subrequest *rdata = container_of(subreq, struct cifs_io_subrequest, subreq);
        struct cifs_io_request *req = container_of(subreq->rreq, struct cifs_io_request, rreq);
+       struct TCP_Server_Info *server = req->server;
        struct cifs_sb_info *cifs_sb = CIFS_SB(rreq->inode->i_sb);
        size_t rsize = 0;
        int rc;
 
        rdata->xid = get_xid();
        rdata->have_xid = true;
-
-       server = cifs_pick_channel(tlink_tcon(req->cfile->tlink)->ses);
        rdata->server = server;
 
        if (cifs_sb->ctx->rsize == 0)
@@ -203,14 +201,7 @@ static void cifs_req_issue_read(struct netfs_io_subrequest *subreq)
        __set_bit(NETFS_SREQ_CLEAR_TAIL, &subreq->flags);
        rdata->pid = pid;
 
-       rc = adjust_credits(rdata->server, &rdata->credits, rdata->subreq.len);
-       if (!rc) {
-               if (rdata->req->cfile->invalidHandle)
-                       rc = -EAGAIN;
-               else
-                       rc = rdata->server->ops->async_readv(rdata);
-       }
-
+       rc = rdata->server->ops->async_readv(rdata);
 out:
        if (rc)
                netfs_subreq_terminated(subreq, rc, false);
@@ -250,6 +241,7 @@ static int cifs_init_request(struct netfs_io_request *rreq, struct file *file)
                open_file = file->private_data;
                rreq->netfs_priv = file->private_data;
                req->cfile = cifsFileInfo_get(open_file);
+               req->server = cifs_pick_channel(tlink_tcon(req->cfile->tlink)->ses);
        } else if (rreq->origin != NETFS_WRITEBACK) {
                WARN_ON_ONCE(1);
                return -EIO;