Commit 969b3010 authored by David Howells's avatar David Howells Committed by Steve French
Browse files

cifs: Only pick a channel once per read request



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: default avatarDavid 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: default avatarSteve French <stfrench@microsoft.com>
parent ce5291e5
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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 */
+3 −11
Original line number Diff line number Diff line
@@ -134,17 +134,15 @@ static void cifs_issue_write(struct netfs_io_subrequest *subreq)
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);
	}

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;