Lines Matching refs:wreq

18  * @wreq: The write request this is storing from.
27 struct netfs_io_subrequest *netfs_create_write_request(struct netfs_io_request *wreq,
34 subreq = netfs_alloc_subrequest(wreq);
40 subreq->debug_index = wreq->subreq_counter++;
53 subreq->io_iter = wreq->io_iter;
54 iov_iter_advance(&subreq->io_iter, subreq->start - wreq->start);
57 trace_netfs_sreq_ref(wreq->debug_id, subreq->debug_index,
60 atomic_inc(&wreq->nr_outstanding);
61 list_add_tail(&subreq->rreq_link, &wreq->subrequests);
73 static void netfs_write_terminated(struct netfs_io_request *wreq, bool was_async)
76 struct netfs_inode *ctx = netfs_inode(wreq->inode);
79 _enter("R=%x[]", wreq->debug_id);
81 trace_netfs_rreq(wreq, netfs_rreq_trace_write_done);
83 list_for_each_entry(subreq, &wreq->subrequests, rreq_link) {
90 wreq->transferred = transferred;
92 list_for_each_entry(subreq, &wreq->subrequests, rreq_link) {
101 if (!wreq->error)
102 wreq->error = subreq->error;
110 ctx->ops->invalidate_cache(wreq);
115 if (!wreq->error)
116 wreq->error = -EIO;
121 wreq->cleanup(wreq);
123 if (wreq->origin == NETFS_DIO_WRITE &&
124 wreq->mapping->nrpages) {
125 pgoff_t first = wreq->start >> PAGE_SHIFT;
126 pgoff_t last = (wreq->start + wreq->transferred - 1) >> PAGE_SHIFT;
127 invalidate_inode_pages2_range(wreq->mapping, first, last);
130 if (wreq->origin == NETFS_DIO_WRITE)
131 inode_dio_end(wreq->inode);
134 trace_netfs_rreq(wreq, netfs_rreq_trace_wake_ip);
135 clear_bit_unlock(NETFS_RREQ_IN_PROGRESS, &wreq->flags);
136 wake_up_bit(&wreq->flags, NETFS_RREQ_IN_PROGRESS);
138 if (wreq->iocb) {
139 wreq->iocb->ki_pos += transferred;
140 if (wreq->iocb->ki_complete)
141 wreq->iocb->ki_complete(
142 wreq->iocb, wreq->error ? wreq->error : transferred);
145 netfs_clear_subrequests(wreq, was_async);
146 netfs_put_request(wreq, was_async, netfs_rreq_trace_put_complete);
156 struct netfs_io_request *wreq = subreq->rreq;
159 _enter("%x[%x] %zd", wreq->debug_id, subreq->debug_index, transferred_or_error);
176 trace_netfs_failure(wreq, subreq, transferred_or_error,
183 wreq->debug_id, subreq->debug_index,
192 wreq->debug_id, subreq->debug_index,
204 u = atomic_dec_return(&wreq->nr_outstanding);
206 netfs_write_terminated(wreq, was_async);
208 wake_up_var(&wreq->nr_outstanding);
224 set_bit(NETFS_RREQ_INCOMPLETE_IO, &wreq->flags);
231 set_bit(NETFS_RREQ_INCOMPLETE_IO, &wreq->flags);
235 set_bit(NETFS_RREQ_FAILED, &wreq->flags);
236 wreq->error = subreq->error;
247 struct netfs_io_request *wreq = subreq->rreq;
248 struct netfs_cache_resources *cres = &wreq->cache_resources;
281 static void netfs_set_up_write_to_cache(struct netfs_io_request *wreq)
283 struct netfs_cache_resources *cres = &wreq->cache_resources;
285 struct netfs_inode *ctx = netfs_inode(wreq->inode);
287 loff_t start = wreq->start;
288 size_t len = wreq->len;
292 clear_bit(NETFS_RREQ_WRITE_TO_CACHE, &wreq->flags);
301 ret = cres->ops->prepare_write(cres, &start, &len, wreq->upper_len,
302 i_size_read(wreq->inode), true);
306 subreq = netfs_create_write_request(wreq, NETFS_WRITE_TO_CACHE, start, len,
339 int netfs_begin_write(struct netfs_io_request *wreq, bool may_wait,
342 struct netfs_inode *ctx = netfs_inode(wreq->inode);
345 wreq->debug_id, wreq->start, wreq->start + wreq->len - 1,
346 wreq->flags);
348 trace_netfs_write(wreq, what);
349 if (wreq->len == 0 || wreq->iter.count == 0) {
350 pr_err("Zero-sized write [R=%x]\n", wreq->debug_id);
354 if (wreq->origin == NETFS_DIO_WRITE)
355 inode_dio_begin(wreq->inode);
357 wreq->io_iter = wreq->iter;
360 netfs_get_request(wreq, netfs_rreq_trace_get_for_outstanding);
361 atomic_set(&wreq->nr_outstanding, 1);
370 if (test_bit(NETFS_RREQ_WRITE_TO_CACHE, &wreq->flags))
371 netfs_set_up_write_to_cache(wreq);
376 if (test_bit(NETFS_RREQ_UPLOAD_TO_SERVER, &wreq->flags))
377 ctx->ops->create_write_requests(wreq, wreq->start, wreq->len);
379 if (atomic_dec_and_test(&wreq->nr_outstanding))
380 netfs_write_terminated(wreq, false);
385 wait_on_bit(&wreq->flags, NETFS_RREQ_IN_PROGRESS,
387 return wreq->error;
395 struct netfs_io_request *wreq;
398 wreq = netfs_alloc_request(file->f_mapping, file, iocb->ki_pos, len,
400 if (IS_ERR(wreq))
401 return wreq;
403 trace_netfs_write(wreq, netfs_write_trace_writethrough);
405 __set_bit(NETFS_RREQ_UPLOAD_TO_SERVER, &wreq->flags);
406 iov_iter_xarray(&wreq->iter, ITER_SOURCE, &wreq->mapping->i_pages, wreq->start, 0);
407 wreq->io_iter = wreq->iter;
410 netfs_get_request(wreq, netfs_rreq_trace_get_for_outstanding);
411 atomic_set(&wreq->nr_outstanding, 1);
412 return wreq;
415 static void netfs_submit_writethrough(struct netfs_io_request *wreq, bool final)
417 struct netfs_inode *ictx = netfs_inode(wreq->inode);
421 if (!test_bit(NETFS_RREQ_UPLOAD_TO_SERVER, &wreq->flags))
424 start = wreq->start + wreq->submitted;
425 len = wreq->iter.count - wreq->submitted;
427 len /= wreq->wsize; /* Round to number of maximum packets */
428 len *= wreq->wsize;
431 ictx->ops->create_write_requests(wreq, start, len);
432 wreq->submitted += len;
441 int netfs_advance_writethrough(struct netfs_io_request *wreq, size_t copied, bool to_page_end)
444 wreq->iter.count, wreq->submitted, wreq->wsize, copied, to_page_end);
446 wreq->iter.count += copied;
447 wreq->io_iter.count += copied;
448 if (to_page_end && wreq->io_iter.count - wreq->submitted >= wreq->wsize)
449 netfs_submit_writethrough(wreq, false);
451 return wreq->error;
457 int netfs_end_writethrough(struct netfs_io_request *wreq, struct kiocb *iocb)
462 wreq->iter.count, wreq->submitted, wreq->wsize);
464 if (wreq->submitted < wreq->io_iter.count)
465 netfs_submit_writethrough(wreq, true);
467 if (atomic_dec_and_test(&wreq->nr_outstanding))
468 netfs_write_terminated(wreq, false);
471 wait_on_bit(&wreq->flags, NETFS_RREQ_IN_PROGRESS,
473 ret = wreq->error;
476 netfs_put_request(wreq, false, netfs_rreq_trace_put_return);