Move the credits into the cifs_io_subrequest struct rather than placing them on the stack. They are then allocated by netfslib when it allocates its netfs_io_subrequest. Signed-off-by: David Howells <dhowells@xxxxxxxxxx> cc: Steve French <sfrench@xxxxxxxxx> cc: Shyam Prasad N <nspmangalore@xxxxxxxxx> cc: Rohith Surabattula <rohiths.msft@xxxxxxxxx> cc: linux-cifs@xxxxxxxxxxxxxxx --- fs/cifs/file.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/fs/cifs/file.c b/fs/cifs/file.c index fb2885134154..fc3a46f7e2cf 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c @@ -3450,7 +3450,6 @@ static void cifs_req_issue_read(struct netfs_io_subrequest *subreq) struct cifs_io_subrequest *rdata = container_of(subreq, struct cifs_io_subrequest, subreq); struct cifsFileInfo *open_file = rreq->netfs_priv; struct cifs_sb_info *cifs_sb = CIFS_SB(rreq->inode->i_sb); - struct cifs_credits credits_on_stack, *credits = &credits_on_stack; unsigned int xid; pid_t pid; int rc = 0; @@ -3482,7 +3481,8 @@ static void cifs_req_issue_read(struct netfs_io_subrequest *subreq) server->ops->negotiate_rsize(tlink_tcon(open_file->tlink), cifs_sb->ctx); - rc = server->ops->wait_mtu_credits(server, cifs_sb->ctx->rsize, &rsize, credits); + rc = server->ops->wait_mtu_credits(server, cifs_sb->ctx->rsize, &rsize, + &rdata->credits); if (rc) goto out; @@ -3492,7 +3492,6 @@ static void cifs_req_issue_read(struct netfs_io_subrequest *subreq) rdata->offset = subreq->start + subreq->transferred; rdata->bytes = subreq->len - subreq->transferred; rdata->pid = pid; - rdata->credits = credits_on_stack; rc = adjust_credits(server, &rdata->credits, rdata->bytes); if (!rc) { @@ -3502,11 +3501,6 @@ static void cifs_req_issue_read(struct netfs_io_subrequest *subreq) rc = server->ops->async_readv(rdata); } - if (rc) { - add_credits_and_wake_if(server, &rdata->credits, 0); - /* Fallback to the readpage in error/reconnect cases */ - } - out: free_xid(xid); if (rc) @@ -3584,6 +3578,8 @@ static void cifs_free_subrequest(struct netfs_io_subrequest *subreq) rdata->mr = NULL; } #endif + + add_credits_and_wake_if(rdata->server, &rdata->credits, 0); if (rdata->cfile) cifsFileInfo_put(rdata->cfile); }