mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
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: 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>
This commit is contained in:
parent
ce5291e560
commit
969b3010cb
@ -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 */
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user