Lines Matching defs:subreq

22 static void netfs_clear_unread(struct netfs_io_subrequest *subreq)
26 iov_iter_xarray(&iter, ITER_DEST, &subreq->rreq->mapping->i_pages,
27 subreq->start + subreq->transferred,
28 subreq->len - subreq->transferred);
35 struct netfs_io_subrequest *subreq = priv;
37 netfs_subreq_terminated(subreq, transferred_or_error, was_async);
42 * - Eats the caller's ref on subreq.
45 struct netfs_io_subrequest *subreq,
53 subreq->start + subreq->transferred,
54 subreq->len - subreq->transferred);
56 cres->ops->read(cres, subreq->start, &iter, read_hole,
57 netfs_cache_read_terminated, subreq);
64 struct netfs_io_subrequest *subreq)
67 __set_bit(NETFS_SREQ_CLEAR_TAIL, &subreq->flags);
68 netfs_subreq_terminated(subreq, 0, false);
74 * The netfs is expected to read from subreq->pos + subreq->transferred to
75 * subreq->pos + subreq->len - 1. It may not backtrack and write data into the
88 struct netfs_io_subrequest *subreq)
91 rreq->netfs_ops->issue_read(subreq);
113 struct netfs_io_subrequest *subreq;
120 list_for_each_entry(subreq, &rreq->subrequests, rreq_link) {
121 XA_STATE(xas, &rreq->mapping->i_pages, subreq->start / PAGE_SIZE);
123 xas_for_each(&xas, folio, (subreq->start + subreq->len - 1) / PAGE_SIZE) {
145 struct netfs_io_subrequest *subreq = priv;
146 struct netfs_io_request *rreq = subreq->rreq;
150 trace_netfs_failure(rreq, subreq, transferred_or_error,
156 trace_netfs_sreq(subreq, netfs_sreq_trace_write_term);
162 netfs_put_subrequest(subreq, was_async, netfs_sreq_trace_put_terminated);
172 struct netfs_io_subrequest *subreq, *next, *p;
183 list_for_each_entry_safe(subreq, p, &rreq->subrequests, rreq_link) {
184 if (!test_bit(NETFS_SREQ_COPY_TO_CACHE, &subreq->flags)) {
185 list_del_init(&subreq->rreq_link);
186 netfs_put_subrequest(subreq, false,
191 list_for_each_entry(subreq, &rreq->subrequests, rreq_link) {
193 while (!list_is_last(&subreq->rreq_link, &rreq->subrequests)) {
194 next = list_next_entry(subreq, rreq_link);
195 if (next->start != subreq->start + subreq->len)
197 subreq->len += next->len;
203 ret = cres->ops->prepare_write(cres, &subreq->start, &subreq->len,
206 trace_netfs_failure(rreq, subreq, ret, netfs_fail_prepare_write);
207 trace_netfs_sreq(subreq, netfs_sreq_trace_write_skip);
212 subreq->start, subreq->len);
216 netfs_get_subrequest(subreq, netfs_sreq_trace_get_copy_to_cache);
217 trace_netfs_sreq(subreq, netfs_sreq_trace_write);
218 cres->ops->write(cres, subreq->start, &iter,
219 netfs_rreq_copy_terminated, subreq);
246 struct netfs_io_subrequest *subreq)
248 __clear_bit(NETFS_SREQ_SHORT_IO, &subreq->flags);
249 __set_bit(NETFS_SREQ_SEEK_DATA_READ, &subreq->flags);
252 trace_netfs_sreq(subreq, netfs_sreq_trace_resubmit_short);
254 netfs_get_subrequest(subreq, netfs_sreq_trace_get_short_read);
256 if (subreq->source == NETFS_READ_FROM_CACHE)
257 netfs_read_from_cache(rreq, subreq, NETFS_READ_HOLE_CLEAR);
259 netfs_read_from_server(rreq, subreq);
268 struct netfs_io_subrequest *subreq;
280 list_for_each_entry(subreq, &rreq->subrequests, rreq_link) {
281 if (subreq->error) {
282 if (subreq->source != NETFS_READ_FROM_CACHE)
284 subreq->source = NETFS_DOWNLOAD_FROM_SERVER;
285 subreq->error = 0;
287 trace_netfs_sreq(subreq, netfs_sreq_trace_download_instead);
288 netfs_get_subrequest(subreq, netfs_sreq_trace_get_resubmit);
290 netfs_read_from_server(rreq, subreq);
291 } else if (test_bit(NETFS_SREQ_SHORT_IO, &subreq->flags)) {
292 netfs_rreq_short_read(rreq, subreq);
309 struct netfs_io_subrequest *subreq;
315 list_for_each_entry(subreq, &rreq->subrequests, rreq_link) {
316 if (subreq->source == NETFS_READ_FROM_CACHE) {
317 subreq->error = -ESTALE;
379 * @subreq: The I/O request that has terminated.
395 void netfs_subreq_terminated(struct netfs_io_subrequest *subreq,
399 struct netfs_io_request *rreq = subreq->rreq;
403 subreq->debug_index, subreq->start, subreq->flags,
406 switch (subreq->source) {
418 subreq->error = transferred_or_error;
419 trace_netfs_failure(rreq, subreq, transferred_or_error,
424 if (WARN(transferred_or_error > subreq->len - subreq->transferred,
426 rreq->debug_id, subreq->debug_index,
427 transferred_or_error, subreq->len, subreq->transferred))
428 transferred_or_error = subreq->len - subreq->transferred;
430 subreq->error = 0;
431 subreq->transferred += transferred_or_error;
432 if (subreq->transferred < subreq->len)
436 __clear_bit(NETFS_SREQ_NO_PROGRESS, &subreq->flags);
437 if (test_bit(NETFS_SREQ_COPY_TO_CACHE, &subreq->flags))
441 trace_netfs_sreq(subreq, netfs_sreq_trace_terminated);
450 netfs_put_subrequest(subreq, was_async, netfs_sreq_trace_put_terminated);
454 if (test_bit(NETFS_SREQ_CLEAR_TAIL, &subreq->flags)) {
455 netfs_clear_unread(subreq);
456 subreq->transferred = subreq->len;
461 if (__test_and_set_bit(NETFS_SREQ_NO_PROGRESS, &subreq->flags)) {
462 subreq->error = -ENODATA;
466 __clear_bit(NETFS_SREQ_NO_PROGRESS, &subreq->flags);
469 __set_bit(NETFS_SREQ_SHORT_IO, &subreq->flags);
474 if (subreq->source == NETFS_READ_FROM_CACHE) {
480 rreq->error = subreq->error;
486 static enum netfs_io_source netfs_cache_prepare_read(struct netfs_io_subrequest *subreq,
489 struct netfs_io_request *rreq = subreq->rreq;
493 return cres->ops->prepare_read(subreq, i_size);
494 if (subreq->start >= rreq->i_size)
504 struct netfs_io_subrequest *subreq)
508 _enter("%llx-%llx,%llx", subreq->start, subreq->start + subreq->len, rreq->i_size);
510 source = netfs_cache_prepare_read(subreq, rreq->i_size);
521 if (subreq->len > rreq->i_size - subreq->start)
522 subreq->len = rreq->i_size - subreq->start;
525 !rreq->netfs_ops->clamp_length(subreq)) {
531 if (WARN_ON(subreq->len == 0))
535 subreq->source = source;
536 trace_netfs_sreq(subreq, netfs_sreq_trace_prepare);
546 struct netfs_io_subrequest *subreq;
549 subreq = netfs_alloc_subrequest(rreq);
550 if (!subreq)
553 subreq->debug_index = (*_debug_index)++;
554 subreq->start = rreq->start + rreq->submitted;
555 subreq->len = rreq->len - rreq->submitted;
557 _debug("slice %llx,%zx,%zx", subreq->start, subreq->len, rreq->submitted);
558 list_add_tail(&subreq->rreq_link, &rreq->subrequests);
561 * subset. It tells us in subreq->flags what it decided should be done
562 * and adjusts subreq->len down if the subset crosses a cache boundary.
568 source = netfs_rreq_prepare_read(rreq, subreq);
574 rreq->submitted += subreq->len;
576 trace_netfs_sreq(subreq, netfs_sreq_trace_submit);
579 netfs_fill_with_zeroes(rreq, subreq);
582 netfs_read_from_server(rreq, subreq);
585 netfs_read_from_cache(rreq, subreq, NETFS_READ_HOLE_IGNORE);
594 rreq->error = subreq->error;
595 netfs_put_subrequest(subreq, false, netfs_sreq_trace_put_failed);