Lines Matching refs:uio

53  * of the move, and the I/O parameters are provided in "uio", which is
58 zfs_uiomove_iov(void *p, size_t n, zfs_uio_rw_t rw, zfs_uio_t *uio)
60 const struct iovec *iov = uio->uio_iov;
61 size_t skip = uio->uio_skip;
64 while (n && uio->uio_resid) {
66 switch (uio->uio_segflg) {
77 if (uio->uio_fault_disable) {
95 uio->uio_skip += c_bytes;
96 ASSERT3U(uio->uio_skip, <,
98 uio->uio_resid -= c_bytes;
99 uio->uio_loffset += c_bytes;
116 uio->uio_iov = (++iov);
117 uio->uio_iovcnt--;
119 uio->uio_skip = skip;
120 uio->uio_resid -= cnt;
121 uio->uio_loffset += cnt;
129 zfs_uiomove_bvec_impl(void *p, size_t n, zfs_uio_rw_t rw, zfs_uio_t *uio)
131 const struct bio_vec *bv = uio->uio_bvec;
132 size_t skip = uio->uio_skip;
135 while (n && uio->uio_resid) {
152 uio->uio_bvec = (++bv);
153 uio->uio_iovcnt--;
155 uio->uio_skip = skip;
156 uio->uio_resid -= cnt;
157 uio->uio_loffset += cnt;
184 * by the request in the uio.
187 zfs_uiomove_bvec_rq(void *p, size_t n, zfs_uio_rw_t rw, zfs_uio_t *uio)
189 struct request *rq = uio->rq;
201 * uio->uio_loffset will be modified over time).
217 if (uio->uio_loffset >= this_seg_start &&
218 uio->uio_loffset <= this_seg_end) {
229 skip_in_seg = uio->uio_loffset - this_seg_start;
242 uio->uio_resid -= copy_from_seg;
243 uio->uio_loffset += copy_from_seg;
252 uio->uio_resid = 0;
259 zfs_uiomove_bvec(void *p, size_t n, zfs_uio_rw_t rw, zfs_uio_t *uio)
262 if (uio->rq != NULL)
263 return (zfs_uiomove_bvec_rq(p, n, rw, uio));
265 ASSERT3P(uio->rq, ==, NULL);
267 return (zfs_uiomove_bvec_impl(p, n, rw, uio));
272 zfs_uiomove_iter(void *p, size_t n, zfs_uio_rw_t rw, zfs_uio_t *uio,
275 size_t cnt = MIN(n, uio->uio_resid);
277 if (uio->uio_skip)
278 iov_iter_advance(uio->uio_iter, uio->uio_skip);
281 cnt = copy_to_iter(p, cnt, uio->uio_iter);
283 cnt = copy_from_iter(p, cnt, uio->uio_iter);
295 * to avoid consuming the uio and its iov_iter structure.
298 iov_iter_revert(uio->uio_iter, cnt);
300 uio->uio_resid -= cnt;
301 uio->uio_loffset += cnt;
308 zfs_uiomove(void *p, size_t n, zfs_uio_rw_t rw, zfs_uio_t *uio)
310 if (uio->uio_segflg == UIO_BVEC)
311 return (zfs_uiomove_bvec(p, n, rw, uio));
313 else if (uio->uio_segflg == UIO_ITER)
314 return (zfs_uiomove_iter(p, n, rw, uio, B_FALSE));
317 return (zfs_uiomove_iov(p, n, rw, uio));
322 * Fault in the pages of the first n bytes specified by the uio structure.
323 * 1 byte in each page is touched and the uio struct is unmodified. Any
328 zfs_uio_prefaultpages(ssize_t n, zfs_uio_t *uio)
330 if (uio->uio_segflg == UIO_SYSSPACE || uio->uio_segflg == UIO_BVEC) {
334 } else if (uio->uio_segflg == UIO_ITER) {
339 if (iov_iter_fault_in_readable(uio->uio_iter, n))
344 ASSERT3S(uio->uio_segflg, ==, UIO_USERSPACE);
345 const struct iovec *iov = uio->uio_iov;
346 int iovcnt = uio->uio_iovcnt;
347 size_t skip = uio->uio_skip;
378 * The same as zfs_uiomove() but doesn't modify uio structure.
382 zfs_uiocopy(void *p, size_t n, zfs_uio_rw_t rw, zfs_uio_t *uio, size_t *cbytes)
387 memcpy(&uio_copy, uio, sizeof (zfs_uio_t));
389 if (uio->uio_segflg == UIO_BVEC)
392 else if (uio->uio_segflg == UIO_ITER)
398 *cbytes = uio->uio_resid - uio_copy.uio_resid;
405 * Drop the next n chars out of *uio.
408 zfs_uioskip(zfs_uio_t *uio, size_t n)
410 if (n > uio->uio_resid)
413 * When using a uio with a struct request, we simply
419 if (uio->uio_segflg == UIO_BVEC && uio->rq == NULL) {
420 uio->uio_skip += n;
421 while (uio->uio_iovcnt &&
422 uio->uio_skip >= uio->uio_bvec->bv_len) {
423 uio->uio_skip -= uio->uio_bvec->bv_len;
424 uio->uio_bvec++;
425 uio->uio_iovcnt--;
428 } else if (uio->uio_segflg == UIO_ITER) {
429 iov_iter_advance(uio->uio_iter, n);
432 uio->uio_skip += n;
433 while (uio->uio_iovcnt &&
434 uio->uio_skip >= uio->uio_iov->iov_len) {
435 uio->uio_skip -= uio->uio_iov->iov_len;
436 uio->uio_iov++;
437 uio->uio_iovcnt--;
440 uio->uio_loffset += n;
441 uio->uio_resid -= n;