Lines Matching defs:uio
60 * of the move, and the I/O parameters are provided in "uio", which is
65 zfs_uiomove_iov(void *p, size_t n, zfs_uio_rw_t rw, zfs_uio_t *uio)
67 const struct iovec *iov = uio->uio_iov;
68 size_t skip = uio->uio_skip;
71 ASSERT3S(uio->uio_segflg, ==, UIO_SYSSPACE);
72 while (n && uio->uio_resid) {
81 uio->uio_iov = (++iov);
82 uio->uio_iovcnt--;
84 uio->uio_skip = skip;
85 uio->uio_resid -= cnt;
86 uio->uio_loffset += cnt;
94 zfs_uiomove_bvec_impl(void *p, size_t n, zfs_uio_rw_t rw, zfs_uio_t *uio)
96 const struct bio_vec *bv = uio->uio_bvec;
97 size_t skip = uio->uio_skip;
100 while (n && uio->uio_resid) {
117 uio->uio_bvec = (++bv);
118 uio->uio_iovcnt--;
120 uio->uio_skip = skip;
121 uio->uio_resid -= cnt;
122 uio->uio_loffset += cnt;
148 * by the request in the uio.
151 zfs_uiomove_bvec_rq(void *p, size_t n, zfs_uio_rw_t rw, zfs_uio_t *uio)
153 struct request *rq = uio->rq;
165 * uio->uio_loffset will be modified over time).
181 if (uio->uio_loffset >= this_seg_start &&
182 uio->uio_loffset <= this_seg_end) {
193 skip_in_seg = uio->uio_loffset - this_seg_start;
206 uio->uio_resid -= copy_from_seg;
207 uio->uio_loffset += copy_from_seg;
216 uio->uio_resid = 0;
222 zfs_uiomove_bvec(void *p, size_t n, zfs_uio_rw_t rw, zfs_uio_t *uio)
224 if (uio->rq != NULL)
225 return (zfs_uiomove_bvec_rq(p, n, rw, uio));
226 return (zfs_uiomove_bvec_impl(p, n, rw, uio));
230 zfs_uiomove_iter(void *p, size_t n, zfs_uio_rw_t rw, zfs_uio_t *uio,
233 size_t cnt = MIN(n, uio->uio_resid);
235 if (uio->uio_skip)
236 iov_iter_advance(uio->uio_iter, uio->uio_skip);
239 cnt = copy_to_iter(p, cnt, uio->uio_iter);
241 cnt = copy_from_iter(p, cnt, uio->uio_iter);
253 * to avoid consuming the uio and its iov_iter structure.
256 iov_iter_revert(uio->uio_iter, cnt);
258 uio->uio_resid -= cnt;
259 uio->uio_loffset += cnt;
265 zfs_uiomove(void *p, size_t n, zfs_uio_rw_t rw, zfs_uio_t *uio)
267 if (uio->uio_segflg == UIO_BVEC)
268 return (zfs_uiomove_bvec(p, n, rw, uio));
269 else if (uio->uio_segflg == UIO_ITER)
270 return (zfs_uiomove_iter(p, n, rw, uio, B_FALSE));
272 return (zfs_uiomove_iov(p, n, rw, uio));
277 * Fault in the pages of the first n bytes specified by the uio structure.
278 * 1 byte in each page is touched and the uio struct is unmodified. Any
283 zfs_uio_prefaultpages(ssize_t n, zfs_uio_t *uio)
285 if (uio->uio_segflg == UIO_SYSSPACE || uio->uio_segflg == UIO_BVEC ||
286 (uio->uio_extflg & UIO_DIRECT)) {
294 ASSERT3S(uio->uio_segflg, ==, UIO_ITER);
299 if (iov_iter_fault_in_readable(uio->uio_iter, n))
308 * The same as zfs_uiomove() but doesn't modify uio structure.
312 zfs_uiocopy(void *p, size_t n, zfs_uio_rw_t rw, zfs_uio_t *uio, size_t *cbytes)
317 memcpy(&uio_copy, uio, sizeof (zfs_uio_t));
319 if (uio->uio_segflg == UIO_BVEC)
321 else if (uio->uio_segflg == UIO_ITER)
326 *cbytes = uio->uio_resid - uio_copy.uio_resid;
333 * Drop the next n chars out of *uio.
336 zfs_uioskip(zfs_uio_t *uio, size_t n)
338 if (n > uio->uio_resid)
341 * When using a uio with a struct request, we simply
347 if (uio->uio_segflg == UIO_BVEC && uio->rq == NULL) {
348 uio->uio_skip += n;
349 while (uio->uio_iovcnt &&
350 uio->uio_skip >= uio->uio_bvec->bv_len) {
351 uio->uio_skip -= uio->uio_bvec->bv_len;
352 uio->uio_bvec++;
353 uio->uio_iovcnt--;
355 } else if (uio->uio_segflg == UIO_ITER) {
356 iov_iter_advance(uio->uio_iter, n);
358 ASSERT3S(uio->uio_segflg, ==, UIO_SYSSPACE);
359 uio->uio_skip += n;
360 while (uio->uio_iovcnt &&
361 uio->uio_skip >= uio->uio_iov->iov_len) {
362 uio->uio_skip -= uio->uio_iov->iov_len;
363 uio->uio_iov++;
364 uio->uio_iovcnt--;
368 uio->uio_loffset += n;
369 uio->uio_resid -= n;
374 * Check if the uio is page-aligned in memory.
377 zfs_uio_page_aligned(zfs_uio_t *uio)
381 if (uio->uio_segflg == UIO_SYSSPACE) {
382 const struct iovec *iov = uio->uio_iov;
383 size_t skip = uio->uio_skip;
385 for (int i = uio->uio_iovcnt; i > 0; iov++, i--) {
395 } else if (uio->uio_segflg == UIO_ITER) {
397 iov_iter_alignment(uio->uio_iter);
446 zfs_uio_dio_check_for_zero_page(zfs_uio_t *uio)
448 ASSERT3P(uio->uio_dio.pages, !=, NULL);
450 for (long i = 0; i < uio->uio_dio.npages; i++) {
451 struct page *p = uio->uio_dio.pages[i];
468 uio->uio_dio.pages[i] =
470 zfs_mark_page(uio->uio_dio.pages[i]);
479 zfs_uio_free_dio_pages(zfs_uio_t *uio, zfs_uio_rw_t rw)
482 ASSERT(uio->uio_extflg & UIO_DIRECT);
483 ASSERT3P(uio->uio_dio.pages, !=, NULL);
486 unpin_user_pages(uio->uio_dio.pages, uio->uio_dio.npages);
488 for (long i = 0; i < uio->uio_dio.npages; i++) {
489 struct page *p = uio->uio_dio.pages[i];
500 vmem_free(uio->uio_dio.pages,
501 uio->uio_dio.npages * sizeof (struct page *));
506 zfs_uio_pin_user_pages(zfs_uio_t *uio, zfs_uio_rw_t rw)
509 size_t skip = uio->uio_skip;
510 size_t len = uio->uio_resid - skip;
527 if (iter_is_ubuf(uio->uio_iter)) {
529 addr = (unsigned long)uio->uio_iter->ubuf + skip;
531 &uio->uio_dio.pages[uio->uio_dio.npages], gup_flags);
535 uio->uio_dio.npages += res;
538 uio->uio_dio.npages += res;
542 const struct iovec *iovp = zfs_uio_iter_iov(uio->uio_iter);
543 for (int i = 0; i < uio->uio_iovcnt; i++) {
554 &uio->uio_dio.pages[uio->uio_dio.npages], gup_flags);
558 uio->uio_dio.npages += res;
563 uio->uio_dio.npages += res;
575 zfs_uio_get_dio_pages_iov_iter(zfs_uio_t *uio, zfs_uio_rw_t rw)
578 size_t wanted = uio->uio_resid - uio->uio_skip;
584 cnt = iov_iter_get_pages(uio->uio_iter,
585 &uio->uio_dio.pages[uio->uio_dio.npages],
588 iov_iter_revert(uio->uio_iter, rollback);
595 uio->uio_dio.npages += DIV_ROUND_UP(cnt, PAGE_SIZE);
598 iov_iter_advance(uio->uio_iter, cnt);
601 ASSERT3U(rollback, ==, uio->uio_resid - uio->uio_skip);
602 iov_iter_revert(uio->uio_iter, rollback);
615 zfs_uio_get_dio_pages_alloc(zfs_uio_t *uio, zfs_uio_rw_t rw)
618 long npages = DIV_ROUND_UP(uio->uio_resid, PAGE_SIZE);
621 if (uio->uio_segflg == UIO_ITER) {
622 uio->uio_dio.pages = vmem_alloc(size, KM_SLEEP);
624 error = zfs_uio_pin_user_pages(uio, rw);
626 error = zfs_uio_get_dio_pages_iov_iter(uio, rw);
632 ASSERT3S(uio->uio_dio.npages, >=, 0);
636 unpin_user_pages(uio->uio_dio.pages, uio->uio_dio.npages);
638 for (long i = 0; i < uio->uio_dio.npages; i++)
639 put_page(uio->uio_dio.pages[i]);
641 vmem_free(uio->uio_dio.pages, size);
644 ASSERT3S(uio->uio_dio.npages, ==, npages);
649 zfs_uio_dio_check_for_zero_page(uio);
652 uio->uio_extflg |= UIO_DIRECT;