Lines Matching +full:pre +full:- +full:filled

1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* kiocb-using read/write
31 unsigned int inval_counter; /* Copy of cookie->inval_counter */
37 if (refcount_dec_and_test(&ki->ki_refcnt)) { in cachefiles_put_kiocb()
38 cachefiles_put_object(ki->object, cachefiles_obj_put_ioreq); in cachefiles_put_kiocb()
39 fput(ki->iocb.ki_filp); in cachefiles_put_kiocb()
50 struct inode *inode = file_inode(ki->iocb.ki_filp); in cachefiles_read_complete()
55 trace_cachefiles_io_error(ki->object, inode, ret, in cachefiles_read_complete()
58 if (ki->term_func) { in cachefiles_read_complete()
60 if (ki->object->cookie->inval_counter == ki->inval_counter) in cachefiles_read_complete()
61 ki->skipped += ret; in cachefiles_read_complete()
63 ret = -ESTALE; in cachefiles_read_complete()
66 ki->term_func(ki->term_func_priv, ret, ki->was_async); in cachefiles_read_complete()
86 ssize_t ret = -ENOBUFS; in cachefiles_read()
97 file, file_inode(file)->i_ino, start_pos, len, in cachefiles_read()
109 if (off2 < 0 && off2 >= (loff_t)-MAX_ERRNO && off2 != -ENXIO) { in cachefiles_read()
115 if (off2 == -ENXIO || off2 >= start_pos + len) { in cachefiles_read()
120 ret = -ENODATA; in cachefiles_read()
130 skipped = off2 - off; in cachefiles_read()
134 ret = -ENOMEM; in cachefiles_read()
139 refcount_set(&ki->ki_refcnt, 2); in cachefiles_read()
140 ki->iocb.ki_filp = file; in cachefiles_read()
141 ki->iocb.ki_pos = start_pos + skipped; in cachefiles_read()
142 ki->iocb.ki_flags = IOCB_DIRECT; in cachefiles_read()
143 ki->iocb.ki_ioprio = get_current_ioprio(); in cachefiles_read()
144 ki->skipped = skipped; in cachefiles_read()
145 ki->object = object; in cachefiles_read()
146 ki->inval_counter = cres->inval_counter; in cachefiles_read()
147 ki->term_func = term_func; in cachefiles_read()
148 ki->term_func_priv = term_func_priv; in cachefiles_read()
149 ki->was_async = true; in cachefiles_read()
151 if (ki->term_func) in cachefiles_read()
152 ki->iocb.ki_complete = cachefiles_read_complete; in cachefiles_read()
154 get_file(ki->iocb.ki_filp); in cachefiles_read()
157 trace_cachefiles_read(object, file_inode(file), ki->iocb.ki_pos, len - skipped); in cachefiles_read()
161 ret = vfs_iocb_iter_read(file, &ki->iocb, iter); in cachefiles_read()
164 case -EIOCBQUEUED: in cachefiles_read()
167 case -ERESTARTSYS: in cachefiles_read()
168 case -ERESTARTNOINTR: in cachefiles_read()
169 case -ERESTARTNOHAND: in cachefiles_read()
170 case -ERESTART_RESTARTBLOCK: in cachefiles_read()
174 ret = -EINTR; in cachefiles_read()
177 ki->was_async = false; in cachefiles_read()
178 cachefiles_read_complete(&ki->iocb, ret); in cachefiles_read()
207 *_data_start = -1; in cachefiles_query_occupancy()
211 return -ENOBUFS; in cachefiles_query_occupancy()
215 granularity = max_t(size_t, object->volume->cache->bsize, granularity); in cachefiles_query_occupancy()
218 file, file_inode(file)->i_ino, start, len, in cachefiles_query_occupancy()
224 if (off == -ENXIO) in cachefiles_query_occupancy()
225 return -ENODATA; /* Beyond EOF */ in cachefiles_query_occupancy()
226 if (off < 0 && off >= (loff_t)-MAX_ERRNO) in cachefiles_query_occupancy()
227 return -ENOBUFS; /* Error. */ in cachefiles_query_occupancy()
229 return -ENODATA; /* No data in range */ in cachefiles_query_occupancy()
234 if (off2 == -ENXIO) in cachefiles_query_occupancy()
235 return -ENODATA; /* Beyond EOF */ in cachefiles_query_occupancy()
236 if (off2 < 0 && off2 >= (loff_t)-MAX_ERRNO) in cachefiles_query_occupancy()
237 return -ENOBUFS; /* Error. */ in cachefiles_query_occupancy()
243 return -ENODATA; in cachefiles_query_occupancy()
249 *_data_len = off2 - off; in cachefiles_query_occupancy()
259 struct cachefiles_object *object = ki->object; in cachefiles_write_complete()
260 struct inode *inode = file_inode(ki->iocb.ki_filp); in cachefiles_write_complete()
264 if (ki->was_async) in cachefiles_write_complete()
271 atomic_long_sub(ki->b_writing, &object->volume->cache->b_writing); in cachefiles_write_complete()
272 set_bit(FSCACHE_COOKIE_HAVE_DATA, &object->cookie->flags); in cachefiles_write_complete()
273 if (ki->term_func) in cachefiles_write_complete()
274 ki->term_func(ki->term_func_priv, ret, ki->was_async); in cachefiles_write_complete()
295 cache = object->volume->cache; in __cachefiles_write()
298 file, file_inode(file)->i_ino, start_pos, len, in __cachefiles_write()
304 term_func(term_func_priv, -ENOMEM, false); in __cachefiles_write()
305 return -ENOMEM; in __cachefiles_write()
308 refcount_set(&ki->ki_refcnt, 2); in __cachefiles_write()
309 ki->iocb.ki_filp = file; in __cachefiles_write()
310 ki->iocb.ki_pos = start_pos; in __cachefiles_write()
311 ki->iocb.ki_flags = IOCB_DIRECT | IOCB_WRITE; in __cachefiles_write()
312 ki->iocb.ki_ioprio = get_current_ioprio(); in __cachefiles_write()
313 ki->object = object; in __cachefiles_write()
314 ki->start = start_pos; in __cachefiles_write()
315 ki->len = len; in __cachefiles_write()
316 ki->term_func = term_func; in __cachefiles_write()
317 ki->term_func_priv = term_func_priv; in __cachefiles_write()
318 ki->was_async = true; in __cachefiles_write()
319 ki->b_writing = (len + (1 << cache->bshift) - 1) >> cache->bshift; in __cachefiles_write()
321 if (ki->term_func) in __cachefiles_write()
322 ki->iocb.ki_complete = cachefiles_write_complete; in __cachefiles_write()
323 atomic_long_add(ki->b_writing, &cache->b_writing); in __cachefiles_write()
325 get_file(ki->iocb.ki_filp); in __cachefiles_write()
328 trace_cachefiles_write(object, file_inode(file), ki->iocb.ki_pos, len); in __cachefiles_write()
332 ret = vfs_iocb_iter_write(file, &ki->iocb, iter); in __cachefiles_write()
335 case -EIOCBQUEUED: in __cachefiles_write()
338 case -ERESTARTSYS: in __cachefiles_write()
339 case -ERESTARTNOINTR: in __cachefiles_write()
340 case -ERESTARTNOHAND: in __cachefiles_write()
341 case -ERESTART_RESTARTBLOCK: in __cachefiles_write()
345 ret = -EINTR; in __cachefiles_write()
348 ki->was_async = false; in __cachefiles_write()
349 cachefiles_write_complete(&ki->iocb, ret); in __cachefiles_write()
369 term_func(term_func_priv, -ENOBUFS, false); in cachefiles_write()
371 return -ENOBUFS; in cachefiles_write()
394 ino_t ino = file ? file_inode(file)->i_ino : 0; in cachefiles_do_prepare_read()
405 if (test_bit(FSCACHE_COOKIE_NO_DATA_TO_READ, &cookie->flags)) { in cachefiles_do_prepare_read()
420 ino = file_inode(file)->i_ino; in cachefiles_do_prepare_read()
424 cache = object->volume->cache; in cachefiles_do_prepare_read()
430 if (off < 0 && off >= (loff_t)-MAX_ERRNO) { in cachefiles_do_prepare_read()
431 if (off == (loff_t)-ENXIO) { in cachefiles_do_prepare_read()
447 off = round_up(off, cache->bsize); in cachefiles_do_prepare_read()
448 len = off - start; in cachefiles_do_prepare_read()
457 if (to < 0 && to >= (loff_t)-MAX_ERRNO) { in cachefiles_do_prepare_read()
466 to = round_up(to, cache->bsize); in cachefiles_do_prepare_read()
468 to = round_down(to, cache->bsize); in cachefiles_do_prepare_read()
469 len = to - start; in cachefiles_do_prepare_read()
501 return cachefiles_do_prepare_read(&subreq->rreq->cache_resources, in cachefiles_prepare_read()
502 subreq->start, &subreq->len, i_size, in cachefiles_prepare_read()
503 &subreq->flags, subreq->rreq->inode->i_ino); in cachefiles_prepare_read()
507 * Prepare an on-demand read operation, shortening it to a cached/uncached
526 struct cachefiles_cache *cache = object->volume->cache; in __cachefiles_prepare_write()
539 return -ENOBUFS; in __cachefiles_prepare_write()
545 * the write - but we can skip that check if we have space already in __cachefiles_prepare_write()
554 if (pos < 0 && pos >= (loff_t)-MAX_ERRNO) { in __cachefiles_prepare_write()
555 if (pos == -ENXIO) in __cachefiles_prepare_write()
564 /* We have a block that's at least partially filled - if we're low on in __cachefiles_prepare_write()
575 if (pos < 0 && pos >= (loff_t)-MAX_ERRNO) { in __cachefiles_prepare_write()
594 ret = -EIO; in __cachefiles_prepare_write()
609 struct cachefiles_cache *cache = object->volume->cache; in cachefiles_prepare_write()
615 return -ENOBUFS; in cachefiles_prepare_write()
617 return -ENOBUFS; in cachefiles_prepare_write()
630 struct netfs_io_request *wreq = subreq->rreq; in cachefiles_prepare_write_subreq()
631 struct netfs_cache_resources *cres = &wreq->cache_resources; in cachefiles_prepare_write_subreq()
632 struct netfs_io_stream *stream = &wreq->io_streams[subreq->stream_nr]; in cachefiles_prepare_write_subreq()
634 _enter("W=%x[%x] %llx", wreq->debug_id, subreq->debug_index, subreq->start); in cachefiles_prepare_write_subreq()
636 stream->sreq_max_len = MAX_RW_COUNT; in cachefiles_prepare_write_subreq()
637 stream->sreq_max_segs = BIO_MAX_VECS; in cachefiles_prepare_write_subreq()
649 struct netfs_io_request *wreq = subreq->rreq; in cachefiles_issue_write()
650 struct netfs_cache_resources *cres = &wreq->cache_resources; in cachefiles_issue_write()
652 struct cachefiles_cache *cache = object->volume->cache; in cachefiles_issue_write()
653 struct netfs_io_stream *stream = &wreq->io_streams[subreq->stream_nr]; in cachefiles_issue_write()
655 size_t off, pre, post, len = subreq->len; in cachefiles_issue_write() local
656 loff_t start = subreq->start; in cachefiles_issue_write()
659 _enter("W=%x[%x] %llx-%llx", in cachefiles_issue_write()
660 wreq->debug_id, subreq->debug_index, start, start + len - 1); in cachefiles_issue_write()
663 off = start & (CACHEFILES_DIO_BLOCK_SIZE - 1); in cachefiles_issue_write()
665 pre = CACHEFILES_DIO_BLOCK_SIZE - off; in cachefiles_issue_write()
666 if (pre >= len) { in cachefiles_issue_write()
671 subreq->transferred += pre; in cachefiles_issue_write()
672 start += pre; in cachefiles_issue_write()
673 len -= pre; in cachefiles_issue_write()
674 iov_iter_advance(&subreq->io_iter, pre); in cachefiles_issue_write()
678 if (start + len == wreq->i_size) { in cachefiles_issue_write()
680 size_t need = CACHEFILES_DIO_BLOCK_SIZE - part; in cachefiles_issue_write()
682 if (part && stream->submit_extendable_to >= need) { in cachefiles_issue_write()
684 subreq->len += need; in cachefiles_issue_write()
685 subreq->io_iter.count += need; in cachefiles_issue_write()
689 post = len & (CACHEFILES_DIO_BLOCK_SIZE - 1); in cachefiles_issue_write()
691 len -= post; in cachefiles_issue_write()
697 iov_iter_truncate(&subreq->io_iter, len); in cachefiles_issue_write()
711 cachefiles_write(&subreq->rreq->cache_resources, in cachefiles_issue_write()
712 subreq->start, &subreq->io_iter, in cachefiles_issue_write()
749 cres->ops = &cachefiles_netfs_cache_ops; in cachefiles_begin_operation()
750 if (object->file) { in cachefiles_begin_operation()
751 spin_lock(&object->lock); in cachefiles_begin_operation()
752 if (!cres->cache_priv2 && object->file) in cachefiles_begin_operation()
753 cres->cache_priv2 = get_file(object->file); in cachefiles_begin_operation()
754 spin_unlock(&object->lock); in cachefiles_begin_operation()
759 pr_err("failed to get cres->file\n"); in cachefiles_begin_operation()