Lines Matching +full:count +full:- +full:up

1 // SPDX-License-Identifier: GPL-2.0-or-later
17 * netfs_extract_user_iter - Extract the pages from a user iterator into a bvec
20 * @new: The iterator to be set up
24 * build up a second iterator that refers to all of those bits. This allows
27 * @extraction_flags can have ITER_ALLOW_P2PDMA set to request peer-to-peer DMA be
47 size_t count = orig_len, offset, len; in netfs_extract_user_iter() local
51 return -EIO; in netfs_extract_user_iter()
57 return -ENOMEM; in netfs_extract_user_iter()
61 * 0->last, we should be fine. in netfs_extract_user_iter()
64 pages = (void *)bv + bv_size - pg_size; in netfs_extract_user_iter()
66 while (count && npages < max_pages) { in netfs_extract_user_iter()
67 ret = iov_iter_extract_pages(orig, &pages, count, in netfs_extract_user_iter()
68 max_pages - npages, extraction_flags, in netfs_extract_user_iter()
71 ret = ret ?: -EIO; in netfs_extract_user_iter()
75 if (WARN(ret > count, in netfs_extract_user_iter()
77 __func__, ret, count)) { in netfs_extract_user_iter()
78 ret = -EIO; in netfs_extract_user_iter()
83 if (WARN(cur_npages > max_pages - npages, in netfs_extract_user_iter()
86 ret = -EIO; in netfs_extract_user_iter()
90 count -= ret; in netfs_extract_user_iter()
95 bvec_set_page(bv + npages + i, *pages++, len - offset, offset); in netfs_extract_user_iter()
96 ret -= len; in netfs_extract_user_iter()
103 /* Note: Don't try to clean up after EIO. Either we got no pages, so in netfs_extract_user_iter()
104 * nothing to clean up, or we got a buffer overrun, memory corruption in netfs_extract_user_iter()
108 if (ret < 0 && (ret == -ENOMEM || npages == 0)) { in netfs_extract_user_iter()
115 iov_iter_bvec(new, orig->data_source, bv, npages, orig_len - count); in netfs_extract_user_iter()
127 const struct bio_vec *bvecs = iter->bvec; in netfs_limit_bvec()
128 unsigned int nbv = iter->nr_segs, ix = 0, nsegs = 0; in netfs_limit_bvec()
129 size_t len, span = 0, n = iter->count; in netfs_limit_bvec()
130 size_t skip = iter->iov_offset + start_offset; in netfs_limit_bvec()
141 skip -= len; in netfs_limit_bvec()
142 n -= len; in netfs_limit_bvec()
147 len = min3(n, bvecs[ix].bv_len - skip, max_size); in netfs_limit_bvec()
154 n -= len; in netfs_limit_bvec()
168 const struct kvec *kvecs = iter->kvec; in netfs_limit_kvec()
169 unsigned int nkv = iter->nr_segs, ix = 0, nsegs = 0; in netfs_limit_kvec()
170 size_t len, span = 0, n = iter->count; in netfs_limit_kvec()
171 size_t skip = iter->iov_offset + start_offset; in netfs_limit_kvec()
182 skip -= len; in netfs_limit_kvec()
183 n -= len; in netfs_limit_kvec()
188 len = min3(n, kvecs[ix].iov_len - skip, max_size); in netfs_limit_kvec()
195 n -= len; in netfs_limit_kvec()
212 loff_t pos = iter->xarray_start + iter->iov_offset; in netfs_limit_xarray()
214 size_t span = 0, n = iter->count; in netfs_limit_xarray()
216 XA_STATE(xas, iter->xarray, index); in netfs_limit_xarray()
222 max_size = min(max_size, n - start_offset); in netfs_limit_xarray()
236 len = min(max_size, flen - offset); in netfs_limit_xarray()
255 const struct folio_queue *folioq = iter->folioq; in netfs_limit_folioq()
257 unsigned int slot = iter->folioq_slot; in netfs_limit_folioq()
258 size_t span = 0, n = iter->count; in netfs_limit_folioq()
264 max_size = umin(max_size, n - start_offset); in netfs_limit_folioq()
267 folioq = folioq->next; in netfs_limit_folioq()
271 start_offset += iter->iov_offset; in netfs_limit_folioq()
276 span += flen - start_offset; in netfs_limit_folioq()
280 start_offset -= flen; in netfs_limit_folioq()
287 folioq = folioq->next; in netfs_limit_folioq()