Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

netfs: Provide an iterator-reset function

Provide a function to reset the iterator on a subrequest.

Signed-off-by: David Howells <dhowells@redhat.com>
cc: Jeff Layton <jlayton@kernel.org>
cc: netfs@lists.linux.dev
cc: linux-fsdevel@vger.kernel.org
Link: https://lore.kernel.org/r/20240814203850.2240469-17-dhowells@redhat.com/ # v2
Signed-off-by: Christian Brauner <brauner@kernel.org>

authored by

David Howells and committed by
Christian Brauner
bfaa33b8 cd0277ed

+23 -8
+1 -3
fs/netfs/internal.h
··· 69 69 bool needs_put); 70 70 struct folio_queue *netfs_delete_buffer_head(struct netfs_io_request *wreq); 71 71 void netfs_clear_buffer(struct netfs_io_request *rreq); 72 + void netfs_reset_iter(struct netfs_io_subrequest *subreq); 72 73 73 74 /* 74 75 * objects.c ··· 162 161 void netfs_reissue_write(struct netfs_io_stream *stream, 163 162 struct netfs_io_subrequest *subreq, 164 163 struct iov_iter *source); 165 - int netfs_advance_write(struct netfs_io_request *wreq, 166 - struct netfs_io_stream *stream, 167 - loff_t start, size_t len, bool to_eof); 168 164 struct netfs_io_request *netfs_begin_writethrough(struct kiocb *iocb, size_t len); 169 165 int netfs_advance_writethrough(struct netfs_io_request *wreq, struct writeback_control *wbc, 170 166 struct folio *folio, size_t copied, bool to_page_end,
+18
fs/netfs/misc.c
··· 84 84 } 85 85 } 86 86 87 + /* 88 + * Reset the subrequest iterator to refer just to the region remaining to be 89 + * read. The iterator may or may not have been advanced by socket ops or 90 + * extraction ops to an extent that may or may not match the amount actually 91 + * read. 92 + */ 93 + void netfs_reset_iter(struct netfs_io_subrequest *subreq) 94 + { 95 + struct iov_iter *io_iter = &subreq->io_iter; 96 + size_t remain = subreq->len - subreq->transferred; 97 + 98 + if (io_iter->count > remain) 99 + iov_iter_advance(io_iter, io_iter->count - remain); 100 + else if (io_iter->count < remain) 101 + iov_iter_revert(io_iter, remain - io_iter->count); 102 + iov_iter_truncate(&subreq->io_iter, remain); 103 + } 104 + 87 105 /** 88 106 * netfs_dirty_folio - Mark folio dirty and pin a cache object for writeback 89 107 * @mapping: The mapping the folio belongs to.
+1 -2
fs/netfs/write_collect.c
··· 226 226 /* Determine the set of buffers we're going to use. Each 227 227 * subreq gets a subset of a single overall contiguous buffer. 228 228 */ 229 + netfs_reset_iter(from); 229 230 source = from->io_iter; 230 - iov_iter_revert(&source, subreq->len - source.count); 231 - iov_iter_advance(&source, from->transferred); 232 231 source.count = len; 233 232 234 233 /* Work through the sublist. */
+3 -3
fs/netfs/write_issue.c
··· 261 261 * we can avoid overrunning the credits obtained (cifs) and try to parallelise 262 262 * content-crypto preparation with network writes. 263 263 */ 264 - int netfs_advance_write(struct netfs_io_request *wreq, 265 - struct netfs_io_stream *stream, 266 - loff_t start, size_t len, bool to_eof) 264 + static int netfs_advance_write(struct netfs_io_request *wreq, 265 + struct netfs_io_stream *stream, 266 + loff_t start, size_t len, bool to_eof) 267 267 { 268 268 struct netfs_io_subrequest *subreq = stream->construct; 269 269 size_t part;