Lines Matching +full:reset +full:- +full:n +full:- +full:io
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
5 * Copyright (c) 2022-2023 Klara, Inc.
79 if (req->newptr != NULL) { in tarfs_sysctl_handle_zio_reset()
89 SYSCTL_PROC(_vfs_tarfs_zio, OID_AUTO, reset,
92 "Reset compression counters.");
120 off_t off = uiop->uio_offset; in tarfs_io_read()
121 size_t len = uiop->uio_resid; in tarfs_io_read()
124 if (raw || tmp->znode == NULL) { in tarfs_io_read()
125 rl = vn_rangelock_rlock(tmp->vp, off, off + len); in tarfs_io_read()
126 error = vn_lock(tmp->vp, LK_SHARED); in tarfs_io_read()
128 error = VOP_READ(tmp->vp, uiop, IO_NODELOCKED, in tarfs_io_read()
129 uiop->uio_td->td_ucred); in tarfs_io_read()
130 VOP_UNLOCK(tmp->vp); in tarfs_io_read()
132 vn_rangelock_unlock(tmp->vp, rl); in tarfs_io_read()
134 error = vn_lock(tmp->znode, LK_EXCLUSIVE); in tarfs_io_read()
136 error = VOP_READ(tmp->znode, uiop, in tarfs_io_read()
138 uiop->uio_td->td_ucred); in tarfs_io_read()
139 VOP_UNLOCK(tmp->znode); in tarfs_io_read()
142 TARFS_DPF(IO, "%s(%zu, %zu) = %d (resid %zd)\n", __func__, in tarfs_io_read()
143 (size_t)off, len, error, uiop->uio_resid); in tarfs_io_read()
163 TARFS_DPF(IO, "%s(%zu, %zu) null\n", __func__, in tarfs_io_read_buf()
178 TARFS_DPF(IO, "%s(%zu, %zu) error %d\n", __func__, in tarfs_io_read_buf()
180 return (-error); in tarfs_io_read_buf()
182 res = len - auio.uio_resid; in tarfs_io_read_buf()
184 TARFS_DPF(IO, "%s(%zu, %zu) eof\n", __func__, in tarfs_io_read_buf()
187 TARFS_DPF(IO, "%s(%zu, %zu) read %zd | %*D\n", __func__, in tarfs_io_read_buf()
232 if (++zio->curidx >= zio->nidx) { in tarfs_zio_update_index()
233 if (++zio->nidx > zio->szidx) { in tarfs_zio_update_index()
234 zio->szidx *= 2; in tarfs_zio_update_index()
235 zio->idx = realloc(zio->idx, in tarfs_zio_update_index()
236 zio->szidx * sizeof(*zio->idx), in tarfs_zio_update_index()
238 TARFS_DPF(ALLOC, "%s: resized zio index\n", __func__); in tarfs_zio_update_index()
240 zio->idx[zio->curidx].i = i; in tarfs_zio_update_index()
241 zio->idx[zio->curidx].o = o; in tarfs_zio_update_index()
242 TARFS_DPF(ZIDX, "%s: index %u = i %zu o %zu\n", __func__, in tarfs_zio_update_index()
243 zio->curidx, (size_t)zio->idx[zio->curidx].i, in tarfs_zio_update_index()
244 (size_t)zio->idx[zio->curidx].o); in tarfs_zio_update_index()
246 MPASS(zio->idx[zio->curidx].i == i); in tarfs_zio_update_index()
247 MPASS(zio->idx[zio->curidx].o == o); in tarfs_zio_update_index()
257 struct vnode *vp = ap->a_vp; in tarfs_zaccess()
258 struct tarfs_zio *zio = vp->v_data; in tarfs_zaccess()
259 struct tarfs_mount *tmp = zio->tmp; in tarfs_zaccess()
260 accmode_t accmode = ap->a_accmode; in tarfs_zaccess()
264 error = vn_lock(tmp->vp, LK_SHARED); in tarfs_zaccess()
266 error = VOP_ACCESS(tmp->vp, accmode, ap->a_cred, ap->a_td); in tarfs_zaccess()
267 VOP_UNLOCK(tmp->vp); in tarfs_zaccess()
270 TARFS_DPF(ZIO, "%s(%d) = %d\n", __func__, accmode, error); in tarfs_zaccess()
281 struct vnode *vp = ap->a_vp; in tarfs_zgetattr()
282 struct tarfs_zio *zio = vp->v_data; in tarfs_zgetattr()
283 struct tarfs_mount *tmp = zio->tmp; in tarfs_zgetattr()
284 struct vattr *vap = ap->a_vap; in tarfs_zgetattr()
288 error = vn_lock(tmp->vp, LK_SHARED); in tarfs_zgetattr()
290 error = VOP_GETATTR(tmp->vp, &va, ap->a_cred); in tarfs_zgetattr()
291 VOP_UNLOCK(tmp->vp); in tarfs_zgetattr()
293 vap->va_type = VREG; in tarfs_zgetattr()
294 vap->va_mode = va.va_mode; in tarfs_zgetattr()
295 vap->va_nlink = 1; in tarfs_zgetattr()
296 vap->va_gid = va.va_gid; in tarfs_zgetattr()
297 vap->va_uid = va.va_uid; in tarfs_zgetattr()
298 vap->va_fsid = vp->v_mount->mnt_stat.f_fsid.val[0]; in tarfs_zgetattr()
299 vap->va_fileid = TARFS_ZIOINO; in tarfs_zgetattr()
300 vap->va_size = zio->idx[zio->nidx - 1].o; in tarfs_zgetattr()
301 vap->va_blocksize = vp->v_mount->mnt_stat.f_iosize; in tarfs_zgetattr()
302 vap->va_atime = va.va_atime; in tarfs_zgetattr()
303 vap->va_ctime = va.va_ctime; in tarfs_zgetattr()
304 vap->va_mtime = va.va_mtime; in tarfs_zgetattr()
305 vap->va_birthtime = tmp->root->birthtime; in tarfs_zgetattr()
306 vap->va_bytes = va.va_bytes; in tarfs_zgetattr()
309 TARFS_DPF(ZIO, "%s() = %d\n", __func__, error); in tarfs_zgetattr()
323 struct tarfs_mount *tmp = zio->tmp; in tarfs_zread_zstd()
324 struct tarfs_zstd *zstd = zio->zstd; in tarfs_zread_zstd()
332 off_t off = uiop->uio_offset; in tarfs_zread_zstd()
333 size_t len = uiop->uio_resid; in tarfs_zread_zstd()
334 size_t resid = uiop->uio_resid; in tarfs_zread_zstd()
337 bool reset = false; in tarfs_zread_zstd() local
340 if (off < zio->opos) { in tarfs_zread_zstd()
341 while (zio->curidx > 0 && off < zio->idx[zio->curidx].o) in tarfs_zread_zstd()
342 zio->curidx--; in tarfs_zread_zstd()
343 reset = true; in tarfs_zread_zstd()
346 if (off > zio->opos) { in tarfs_zread_zstd()
348 while (zio->curidx < zio->nidx - 1 && in tarfs_zread_zstd()
349 off >= zio->idx[zio->curidx + 1].o) { in tarfs_zread_zstd()
350 zio->curidx++; in tarfs_zread_zstd()
351 reset = true; in tarfs_zread_zstd()
354 /* reset the decompression stream if needed */ in tarfs_zread_zstd()
355 if (reset) { in tarfs_zread_zstd()
356 zio->ipos = zio->idx[zio->curidx].i; in tarfs_zread_zstd()
357 zio->opos = zio->idx[zio->curidx].o; in tarfs_zread_zstd()
358 ZSTD_resetDStream(zstd->zds); in tarfs_zread_zstd()
359 TARFS_DPF(ZIDX, "%s: skipping to index %u = i %zu o %zu\n", __func__, in tarfs_zread_zstd()
360 zio->curidx, (size_t)zio->ipos, (size_t)zio->opos); in tarfs_zread_zstd()
362 TARFS_DPF(ZIDX, "%s: continuing at i %zu o %zu\n", __func__, in tarfs_zread_zstd()
363 (size_t)zio->ipos, (size_t)zio->opos); in tarfs_zread_zstd()
387 MPASS(zio->opos <= off); in tarfs_zread_zstd()
388 MPASS(uiop->uio_iovcnt == 1); in tarfs_zread_zstd()
389 MPASS(uiop->uio_iov->iov_len >= len); in tarfs_zread_zstd()
390 if (uiop->uio_segflg == UIO_SYSSPACE) { in tarfs_zread_zstd()
391 zob.dst = uiop->uio_iov->iov_base; in tarfs_zread_zstd()
393 TARFS_DPF(BOUNCE, "%s: allocating %zu-byte bounce buffer\n", in tarfs_zread_zstd()
401 rl = vn_rangelock_rlock(tmp->vp, zio->ipos, OFF_MAX); in tarfs_zread_zstd()
402 error = vn_lock(tmp->vp, LK_SHARED); in tarfs_zread_zstd()
407 error = vn_getsize_locked(tmp->vp, &zsize, td->td_ucred); in tarfs_zread_zstd()
411 if (zio->ipos >= zsize) { in tarfs_zread_zstd()
423 auio.uio_offset = zio->ipos; in tarfs_zread_zstd()
428 error = VOP_READ(tmp->vp, &auio, IO_NODELOCKED, in tarfs_zread_zstd()
429 td->td_ucred); in tarfs_zread_zstd()
432 TARFS_DPF(ZIO, "%s: req %zu+%zu got %zu+%zu\n", __func__, in tarfs_zread_zstd()
433 (size_t)zio->ipos, bsize, in tarfs_zread_zstd()
434 (size_t)zio->ipos, bsize - auio.uio_resid); in tarfs_zread_zstd()
436 zib.size = bsize - auio.uio_resid; in tarfs_zread_zstd()
441 TARFS_DPF(ZIO, "%s: end of file after i %zu o %zu\n", __func__, in tarfs_zread_zstd()
442 (size_t)zio->ipos, (size_t)zio->opos); in tarfs_zread_zstd()
445 if (zio->opos < off) { in tarfs_zread_zstd()
447 zob.size = min(off - zio->opos, len); in tarfs_zread_zstd()
451 zob.pos = zio->opos - off; in tarfs_zread_zstd()
456 zerror = ZSTD_decompressStream(zstd->zds, &zob, &zib); in tarfs_zread_zstd()
457 zio->ipos += ilen = zib.pos - ipos; in tarfs_zread_zstd()
458 zio->opos += olen = zob.pos - opos; in tarfs_zread_zstd()
459 if (zio->opos > off) in tarfs_zread_zstd()
460 resid -= olen; in tarfs_zread_zstd()
462 TARFS_DPF(ZIO, "%s: inflate failed after i %zu o %zu: %s\n", __func__, in tarfs_zread_zstd()
463 (size_t)zio->ipos, (size_t)zio->opos, ZSTD_getErrorName(zerror)); in tarfs_zread_zstd()
468 TARFS_DPF(ZIO, "%s: end of stream after i %zu o %zu\n", __func__, in tarfs_zread_zstd()
469 (size_t)zio->ipos, (size_t)zio->opos); in tarfs_zread_zstd()
473 TARFS_DPF(ZIO, "%s: end of frame after i %zu o %zu\n", __func__, in tarfs_zread_zstd()
474 (size_t)zio->ipos, (size_t)zio->opos); in tarfs_zread_zstd()
475 tarfs_zio_update_index(zio, zio->ipos, zio->opos); in tarfs_zread_zstd()
477 TARFS_DPF(ZIO, "%s: inflated %zu\n", __func__, olen); in tarfs_zread_zstd()
483 VOP_UNLOCK(tmp->vp); in tarfs_zread_zstd()
486 if (uiop->uio_segflg == UIO_SYSSPACE) { in tarfs_zread_zstd()
487 uiop->uio_resid = resid; in tarfs_zread_zstd()
489 TARFS_DPF(BOUNCE, "%s: bounced %zu bytes\n", __func__, in tarfs_zread_zstd()
490 len - resid); in tarfs_zread_zstd()
491 error = uiomove(obuf, len - resid, uiop); in tarfs_zread_zstd()
493 counter_u64_add(tarfs_zio_bounced, len - resid); in tarfs_zread_zstd()
498 TARFS_DPF(BOUNCE, "%s: freeing bounce buffer\n", __func__); in tarfs_zread_zstd()
502 vn_rangelock_unlock(tmp->vp, rl); in tarfs_zread_zstd()
505 TARFS_DPF(ZIO, "%s(%zu, %zu) = %d (resid %zd)\n", __func__, in tarfs_zread_zstd()
506 (size_t)off, len, error, uiop->uio_resid); in tarfs_zread_zstd()
508 counter_u64_add(tarfs_zio_consumed, len - uiop->uio_resid); in tarfs_zread_zstd()
511 zio->curidx = 0; in tarfs_zread_zstd()
512 zio->ipos = zio->idx[0].i; in tarfs_zread_zstd()
513 zio->opos = zio->idx[0].o; in tarfs_zread_zstd()
514 ZSTD_resetDStream(zstd->zds); in tarfs_zread_zstd()
527 struct vnode *vp = ap->a_vp; in tarfs_zread()
528 struct tarfs_zio *zio = vp->v_data; in tarfs_zread()
529 struct uio *uiop = ap->a_uio; in tarfs_zread()
532 off_t off = uiop->uio_offset; in tarfs_zread()
533 size_t len = uiop->uio_resid; in tarfs_zread()
537 TARFS_DPF(ZIO, "%s(%zu, %zu)\n", __func__, in tarfs_zread()
540 if (zio->zstd != NULL) { in tarfs_zread()
545 TARFS_DPF(ZIO, "%s(%zu, %zu) = %d (resid %zd)\n", __func__, in tarfs_zread()
546 (size_t)off, len, error, uiop->uio_resid); in tarfs_zread()
556 struct vnode *vp = ap->a_vp; in tarfs_zreclaim()
558 TARFS_DPF(ZIO, "%s(%p)\n", __func__, vp); in tarfs_zreclaim()
559 vp->v_data = NULL; in tarfs_zreclaim()
571 struct vnode *vp = ap->a_vp; in tarfs_zstrategy()
572 struct buf *bp = ap->a_bp; in tarfs_zstrategy()
577 iov.iov_base = bp->b_data; in tarfs_zstrategy()
578 iov.iov_len = bp->b_bcount; in tarfs_zstrategy()
579 off = bp->b_iooffset; in tarfs_zstrategy()
580 len = bp->b_bcount; in tarfs_zstrategy()
581 bp->b_resid = len; in tarfs_zstrategy()
589 error = VOP_READ(vp, &auio, IO_DIRECT | IO_NODELOCKED, bp->b_rcred); in tarfs_zstrategy()
590 bp->b_flags |= B_DONE; in tarfs_zstrategy()
592 bp->b_ioflags |= BIO_ERROR; in tarfs_zstrategy()
593 bp->b_error = error; in tarfs_zstrategy()
620 TARFS_DPF(ALLOC, "%s: allocated zio\n", __func__); in tarfs_zio_init()
621 zio->tmp = tmp; in tarfs_zio_init()
622 zio->szidx = 128; in tarfs_zio_init()
623 zio->idx = malloc(zio->szidx * sizeof(*zio->idx), M_TARFSZSTATE, in tarfs_zio_init()
625 zio->curidx = 0; in tarfs_zio_init()
626 zio->nidx = 1; in tarfs_zio_init()
627 zio->idx[zio->curidx].i = zio->ipos = i; in tarfs_zio_init()
628 zio->idx[zio->curidx].o = zio->opos = o; in tarfs_zio_init()
629 tmp->zio = zio; in tarfs_zio_init()
630 TARFS_DPF(ALLOC, "%s: allocated zio index\n", __func__); in tarfs_zio_init()
631 (void)getnewvnode("tarfsz", tmp->vfs, &tarfs_znodeops, &zvp); in tarfs_zio_init()
632 zvp->v_data = zio; in tarfs_zio_init()
633 zvp->v_type = VREG; in tarfs_zio_init()
634 zvp->v_mount = tmp->vfs; in tarfs_zio_init()
636 tmp->znode = zvp; in tarfs_zio_init()
637 TARFS_DPF(ZIO, "%s: created zio node\n", __func__); in tarfs_zio_init()
657 block = malloc(tmp->iosize, M_TEMP, M_ZERO | M_WAITOK); in tarfs_io_init()
658 res = tarfs_io_read_buf(tmp, true, block, 0, tmp->iosize); in tarfs_io_init()
660 return (-res); in tarfs_io_init()
663 printf("xz compression not supported\n"); in tarfs_io_init()
667 printf("zlib compression not supported\n"); in tarfs_io_init()
673 zio->zstd = malloc(sizeof(*zio->zstd), M_TARFSZSTATE, M_WAITOK); in tarfs_io_init()
674 zio->zstd->zds = ZSTD_createDStream_advanced(tarfs_zstd_mem); in tarfs_io_init()
675 (void)ZSTD_initDStream(zio->zstd->zds); in tarfs_io_init()
677 printf("zstd compression not supported\n"); in tarfs_io_init()
694 struct tarfs_zio *zio = tmp->zio; in tarfs_zio_fini()
697 if (tmp->znode != NULL) { in tarfs_zio_fini()
698 error = vn_lock(tmp->znode, LK_EXCLUSIVE); in tarfs_zio_fini()
703 tmp->znode->v_mount = NULL; in tarfs_zio_fini()
704 vgone(tmp->znode); in tarfs_zio_fini()
705 vput(tmp->znode); in tarfs_zio_fini()
706 tmp->znode = NULL; in tarfs_zio_fini()
709 if (zio->zstd != NULL) { in tarfs_zio_fini()
710 TARFS_DPF(ALLOC, "%s: freeing zstd state\n", __func__); in tarfs_zio_fini()
711 ZSTD_freeDStream(zio->zstd->zds); in tarfs_zio_fini()
712 free(zio->zstd, M_TARFSZSTATE); in tarfs_zio_fini()
715 if (zio->idx != NULL) { in tarfs_zio_fini()
716 TARFS_DPF(ALLOC, "%s: freeing index\n", __func__); in tarfs_zio_fini()
717 free(zio->idx, M_TARFSZSTATE); in tarfs_zio_fini()
719 TARFS_DPF(ALLOC, "%s: freeing zio\n", __func__); in tarfs_zio_fini()
721 tmp->zio = NULL; in tarfs_zio_fini()
736 if (tmp->zio != NULL) { in tarfs_io_fini()