Move max_len/max_nr_segs from struct netfs_io_subrequest to struct
netfs_io_stream as we only issue one subreq at a time and then don't need
these values again for that subreq unless and until we have to retry it -
in which case we want to renegotiate them.

Signed-off-by: David Howells <dhowe...@redhat.com>
cc: Jeff Layton <jlay...@kernel.org>
cc: ne...@lists.linux.dev
cc: linux-fsde...@vger.kernel.org
---
 fs/afs/write.c           |  4 +++-
 fs/cachefiles/io.c       |  5 +++--
 fs/netfs/io.c            |  4 ++--
 fs/netfs/write_collect.c | 10 +++++-----
 fs/netfs/write_issue.c   | 14 +++++++-------
 fs/smb/client/file.c     | 15 ++++++++-------
 include/linux/netfs.h    |  4 ++--
 7 files changed, 30 insertions(+), 26 deletions(-)

diff --git a/fs/afs/write.c b/fs/afs/write.c
index e959640694c2..34107b55f834 100644
--- a/fs/afs/write.c
+++ b/fs/afs/write.c
@@ -89,10 +89,12 @@ static const struct afs_operation_ops 
afs_store_data_operation = {
  */
 void afs_prepare_write(struct netfs_io_subrequest *subreq)
 {
+       struct netfs_io_stream *stream = 
&subreq->rreq->io_streams[subreq->stream_nr];
+
        //if (test_bit(NETFS_SREQ_RETRYING, &subreq->flags))
        //      subreq->max_len = 512 * 1024;
        //else
-       subreq->max_len = 256 * 1024 * 1024;
+       stream->sreq_max_len = 256 * 1024 * 1024;
 }
 
 /*
diff --git a/fs/cachefiles/io.c b/fs/cachefiles/io.c
index a91acd03ee12..5b82ba7785cd 100644
--- a/fs/cachefiles/io.c
+++ b/fs/cachefiles/io.c
@@ -627,11 +627,12 @@ static void cachefiles_prepare_write_subreq(struct 
netfs_io_subrequest *subreq)
 {
        struct netfs_io_request *wreq = subreq->rreq;
        struct netfs_cache_resources *cres = &wreq->cache_resources;
+       struct netfs_io_stream *stream = &wreq->io_streams[subreq->stream_nr];
 
        _enter("W=%x[%x] %llx", wreq->debug_id, subreq->debug_index, 
subreq->start);
 
-       subreq->max_len = MAX_RW_COUNT;
-       subreq->max_nr_segs = BIO_MAX_VECS;
+       stream->sreq_max_len = MAX_RW_COUNT;
+       stream->sreq_max_segs = BIO_MAX_VECS;
 
        if (!cachefiles_cres_file(cres)) {
                if (!fscache_wait_for_operation(cres, FSCACHE_WANT_WRITE))
diff --git a/fs/netfs/io.c b/fs/netfs/io.c
index c93851b98368..27dbea0f3867 100644
--- a/fs/netfs/io.c
+++ b/fs/netfs/io.c
@@ -469,9 +469,9 @@ netfs_rreq_prepare_read(struct netfs_io_request *rreq,
                        goto out;
                }
 
-               if (subreq->max_nr_segs) {
+               if (rreq->io_streams[0].sreq_max_segs) {
                        lsize = netfs_limit_iter(io_iter, 0, subreq->len,
-                                                subreq->max_nr_segs);
+                                                
rreq->io_streams[0].sreq_max_segs);
                        if (subreq->len > lsize) {
                                subreq->len = lsize;
                                trace_netfs_sreq(subreq, 
netfs_sreq_trace_limited);
diff --git a/fs/netfs/write_collect.c b/fs/netfs/write_collect.c
index 426cf87aaf2e..e105ac270090 100644
--- a/fs/netfs/write_collect.c
+++ b/fs/netfs/write_collect.c
@@ -231,7 +231,7 @@ static void netfs_retry_write_stream(struct 
netfs_io_request *wreq,
                        __set_bit(NETFS_SREQ_RETRYING, &subreq->flags);
                        stream->prepare_write(subreq);
 
-                       part = min(len, subreq->max_len);
+                       part = min(len, stream->sreq_max_len);
                        subreq->len = part;
                        subreq->start = start;
                        subreq->transferred = 0;
@@ -271,8 +271,6 @@ static void netfs_retry_write_stream(struct 
netfs_io_request *wreq,
                        subreq = netfs_alloc_subrequest(wreq);
                        subreq->source          = to->source;
                        subreq->start           = start;
-                       subreq->max_len         = len;
-                       subreq->max_nr_segs     = INT_MAX;
                        subreq->debug_index     = 
atomic_inc_return(&wreq->subreq_counter);
                        subreq->stream_nr       = to->stream_nr;
                        __set_bit(NETFS_SREQ_RETRYING, &subreq->flags);
@@ -286,10 +284,12 @@ static void netfs_retry_write_stream(struct 
netfs_io_request *wreq,
                        to = list_next_entry(to, rreq_link);
                        trace_netfs_sreq(subreq, netfs_sreq_trace_retry);
 
+                       stream->sreq_max_len    = len;
+                       stream->sreq_max_segs   = INT_MAX;
                        switch (stream->source) {
                        case NETFS_UPLOAD_TO_SERVER:
                                netfs_stat(&netfs_n_wh_upload);
-                               subreq->max_len = min(len, wreq->wsize);
+                               stream->sreq_max_len = umin(len, wreq->wsize);
                                break;
                        case NETFS_WRITE_TO_CACHE:
                                netfs_stat(&netfs_n_wh_write);
@@ -300,7 +300,7 @@ static void netfs_retry_write_stream(struct 
netfs_io_request *wreq,
 
                        stream->prepare_write(subreq);
 
-                       part = min(len, subreq->max_len);
+                       part = umin(len, stream->sreq_max_len);
                        subreq->len = subreq->transferred + part;
                        len -= part;
                        start += part;
diff --git a/fs/netfs/write_issue.c b/fs/netfs/write_issue.c
index e7d4f39b8fdc..2f4f795124a8 100644
--- a/fs/netfs/write_issue.c
+++ b/fs/netfs/write_issue.c
@@ -156,8 +156,6 @@ static void netfs_prepare_write(struct netfs_io_request 
*wreq,
        subreq = netfs_alloc_subrequest(wreq);
        subreq->source          = stream->source;
        subreq->start           = start;
-       subreq->max_len         = ULONG_MAX;
-       subreq->max_nr_segs     = INT_MAX;
        subreq->stream_nr       = stream->stream_nr;
 
        _enter("R=%x[%x]", wreq->debug_id, subreq->debug_index);
@@ -168,10 +166,12 @@ static void netfs_prepare_write(struct netfs_io_request 
*wreq,
 
        trace_netfs_sreq(subreq, netfs_sreq_trace_prepare);
 
+       stream->sreq_max_len    = UINT_MAX;
+       stream->sreq_max_segs   = INT_MAX;
        switch (stream->source) {
        case NETFS_UPLOAD_TO_SERVER:
                netfs_stat(&netfs_n_wh_upload);
-               subreq->max_len = wreq->wsize;
+               stream->sreq_max_len = wreq->wsize;
                break;
        case NETFS_WRITE_TO_CACHE:
                netfs_stat(&netfs_n_wh_write);
@@ -288,13 +288,13 @@ int netfs_advance_write(struct netfs_io_request *wreq,
                netfs_prepare_write(wreq, stream, start);
        subreq = stream->construct;
 
-       part = min(subreq->max_len - subreq->len, len);
-       _debug("part %zx/%zx %zx/%zx", subreq->len, subreq->max_len, part, len);
+       part = umin(stream->sreq_max_len - subreq->len, len);
+       _debug("part %zx/%zx %zx/%zx", subreq->len, stream->sreq_max_len, part, 
len);
        subreq->len += part;
        subreq->nr_segs++;
 
-       if (subreq->len >= subreq->max_len ||
-           subreq->nr_segs >= subreq->max_nr_segs ||
+       if (subreq->len >= stream->sreq_max_len ||
+           subreq->nr_segs >= stream->sreq_max_segs ||
            to_eof) {
                netfs_issue_write(wreq, stream);
                subreq = NULL;
diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c
index fd9f82ff44b8..c1d8c5d2ac71 100644
--- a/fs/smb/client/file.c
+++ b/fs/smb/client/file.c
@@ -49,6 +49,7 @@ static void cifs_prepare_write(struct netfs_io_subrequest 
*subreq)
        struct cifs_io_subrequest *wdata =
                container_of(subreq, struct cifs_io_subrequest, subreq);
        struct cifs_io_request *req = wdata->req;
+       struct netfs_io_stream *stream = 
&req->rreq.io_streams[subreq->stream_nr];
        struct TCP_Server_Info *server;
        struct cifsFileInfo *open_file = req->cfile;
        size_t wsize = req->rreq.wsize;
@@ -73,7 +74,7 @@ static void cifs_prepare_write(struct netfs_io_subrequest 
*subreq)
                }
        }
 
-       rc = server->ops->wait_mtu_credits(server, wsize, 
&wdata->subreq.max_len,
+       rc = server->ops->wait_mtu_credits(server, wsize, &stream->sreq_max_len,
                                           &wdata->credits);
        if (rc < 0) {
                subreq->error = rc;
@@ -92,7 +93,7 @@ static void cifs_prepare_write(struct netfs_io_subrequest 
*subreq)
 
 #ifdef CONFIG_CIFS_SMB_DIRECT
        if (server->smbd_conn)
-               subreq->max_nr_segs = server->smbd_conn->max_frmr_depth;
+               stream->sreq_max_segs = server->smbd_conn->max_frmr_depth;
 #endif
 }
 
@@ -149,11 +150,11 @@ static void cifs_netfs_invalidate_cache(struct 
netfs_io_request *wreq)
 static bool cifs_clamp_length(struct netfs_io_subrequest *subreq)
 {
        struct netfs_io_request *rreq = subreq->rreq;
+       struct netfs_io_stream *stream = &rreq->io_streams[subreq->stream_nr];
        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();
@@ -166,8 +167,8 @@ static bool cifs_clamp_length(struct netfs_io_subrequest 
*subreq)
                                                     cifs_sb->ctx);
 
 
-       rc = server->ops->wait_mtu_credits(server, cifs_sb->ctx->rsize, &rsize,
-                                          &rdata->credits);
+       rc = server->ops->wait_mtu_credits(server, cifs_sb->ctx->rsize,
+                                          &stream->sreq_max_len, 
&rdata->credits);
        if (rc) {
                subreq->error = rc;
                return false;
@@ -183,11 +184,11 @@ static bool cifs_clamp_length(struct netfs_io_subrequest 
*subreq)
                              server->credits, server->in_flight, 0,
                              cifs_trace_rw_credits_read_submit);
 
-       subreq->len = min_t(size_t, subreq->len, rsize);
+       subreq->len = umin(subreq->len, stream->sreq_max_len);
 
 #ifdef CONFIG_CIFS_SMB_DIRECT
        if (server->smbd_conn)
-               subreq->max_nr_segs = server->smbd_conn->max_frmr_depth;
+               stream->sreq_max_segs = server->smbd_conn->max_frmr_depth;
 #endif
        return true;
 }
diff --git a/include/linux/netfs.h b/include/linux/netfs.h
index 2d438aaae685..aada40d2182b 100644
--- a/include/linux/netfs.h
+++ b/include/linux/netfs.h
@@ -136,6 +136,8 @@ static inline struct netfs_group *netfs_folio_group(struct 
folio *folio)
 struct netfs_io_stream {
        /* Submission tracking */
        struct netfs_io_subrequest *construct;  /* Op being constructed */
+       size_t                  sreq_max_len;   /* Maximum size of a subrequest 
*/
+       unsigned int            sreq_max_segs;  /* 0 or max number of segments 
in an iterator */
        unsigned int            submit_off;     /* Folio offset we're 
submitting from */
        unsigned int            submit_len;     /* Amount of data left to 
submit */
        unsigned int            submit_max_len; /* Amount I/O can be rounded up 
to */
@@ -179,14 +181,12 @@ struct netfs_io_subrequest {
        struct list_head        rreq_link;      /* Link in rreq->subrequests */
        struct iov_iter         io_iter;        /* Iterator for this subrequest 
*/
        unsigned long long      start;          /* Where to start the I/O */
-       size_t                  max_len;        /* Maximum size of the I/O */
        size_t                  len;            /* Size of the I/O */
        size_t                  transferred;    /* Amount of data transferred */
        refcount_t              ref;
        short                   error;          /* 0 or error that occurred */
        unsigned short          debug_index;    /* Index in list (for debugging 
output) */
        unsigned int            nr_segs;        /* Number of segs in io_iter */
-       unsigned int            max_nr_segs;    /* 0 or max number of segments 
in an iterator */
        enum netfs_io_source    source;         /* Where to read from/write to 
*/
        unsigned char           stream_nr;      /* I/O stream this belongs to */
        unsigned long           flags;

Reply via email to