[PATCH 09/14] cifs: Put credits into cifs_io_subrequest, not on the stack

From: David Howells
Date: Wed Apr 06 2022 - 19:05:17 EST


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);
}