zio
zio_t *zio = arg;
indirect_vsd_t *iv = zio->io_vsd;
zio->io_error = ENOMEM;
zio_t *zio = arg;
zio->io_error = ENOMEM;
zio->io_error = ENOMEM;
zio->io_error = ENOMEM;
if (zio->io_error != 0)
if (zio->io_error != 0)
vdev_indirect_map_free(zio_t *zio)
indirect_vsd_t *iv = zio->io_vsd;
zio_t zio;
bzero(&zio, sizeof(zio));
zio.io_spa = spa;
zio.io_bp = (blkptr_t *)bp;
zio.io_data = buf;
zio.io_size = bytes;
zio.io_offset = offset;
zio.io_vd = vdev;
zio.io_vsd = iv;
vdev_indirect_remap(vdev, offset, bytes, &zio);
if (zio.io_error != 0)
return (zio.io_error);
if (first->is_size == zio.io_size) {
rc = first->is_vdev->v_read(first->is_vdev, zio.io_bp,
zio.io_data, first->is_target_offset, bytes);
char *ptr = zio.io_data;
rc = is->is_vdev->v_read(is->is_vdev, zio.io_bp,
if (zio_checksum_verify(spa, zio.io_bp, zio.io_data))
vdev_indirect_map_free(&zio);
rc = zio.io_error;
if (vdev_dtl_contains(cvd, DTL_MISSING, zio->io_txg, 1)) {
struct tarfs_zio *zio;
tarfs_zio_update_index(struct tarfs_zio *zio, off_t i, off_t o)
if (++zio->curidx >= zio->nidx) {
if (++zio->nidx > zio->szidx) {
zio->szidx *= 2;
zio->idx = realloc(zio->idx,
zio->szidx * sizeof(*zio->idx),
zio->idx[zio->curidx].i = i;
zio->idx[zio->curidx].o = o;
zio->curidx, (size_t)zio->idx[zio->curidx].i,
(size_t)zio->idx[zio->curidx].o);
MPASS(zio->idx[zio->curidx].i == i);
MPASS(zio->idx[zio->curidx].o == o);
struct tarfs_zio *zio = vp->v_data;
struct tarfs_mount *tmp = zio->tmp;
struct tarfs_zio *zio = vp->v_data;
struct tarfs_mount *tmp = zio->tmp;
vap->va_size = zio->idx[zio->nidx - 1].o;
tarfs_zread_zstd(struct tarfs_zio *zio, struct uio *uiop)
struct tarfs_mount *tmp = zio->tmp;
struct tarfs_zstd *zstd = zio->zstd;
if (off < zio->opos) {
while (zio->curidx > 0 && off < zio->idx[zio->curidx].o)
zio->curidx--;
if (off > zio->opos) {
while (zio->curidx < zio->nidx - 1 &&
off >= zio->idx[zio->curidx + 1].o) {
zio->curidx++;
zio->ipos = zio->idx[zio->curidx].i;
zio->opos = zio->idx[zio->curidx].o;
zio->curidx, (size_t)zio->ipos, (size_t)zio->opos);
(size_t)zio->ipos, (size_t)zio->opos);
MPASS(zio->opos <= off);
rl = vn_rangelock_rlock(tmp->vp, zio->ipos, OFF_MAX);
if (zio->ipos >= zsize) {
auio.uio_offset = zio->ipos;
(size_t)zio->ipos, bsize,
(size_t)zio->ipos, bsize - auio.uio_resid);
(size_t)zio->ipos, (size_t)zio->opos);
if (zio->opos < off) {
zob.size = MIN(off - zio->opos, len);
zob.pos = zio->opos - off;
zio->ipos += ilen = zib.pos - ipos;
zio->opos += olen = zob.pos - opos;
if (zio->opos > off)
(size_t)zio->ipos, (size_t)zio->opos, ZSTD_getErrorName(zerror));
(size_t)zio->ipos, (size_t)zio->opos);
(size_t)zio->ipos, (size_t)zio->opos);
tarfs_zio_update_index(zio, zio->ipos, zio->opos);
zio->curidx = 0;
zio->ipos = zio->idx[0].i;
zio->opos = zio->idx[0].o;
struct tarfs_zio *zio = vp->v_data;
if (zio->zstd != NULL) {
error = tarfs_zread_zstd(zio, uiop);
SYSCTL_NODE(_vfs_tarfs, OID_AUTO, zio, CTLFLAG_RD, 0,
struct tarfs_zio *zio;
zio = malloc(sizeof(*zio), M_TARFSZSTATE, M_ZERO | M_WAITOK);
zio->tmp = tmp;
zio->szidx = 128;
zio->idx = malloc(zio->szidx * sizeof(*zio->idx), M_TARFSZSTATE,
zio->curidx = 0;
zio->nidx = 1;
zio->idx[zio->curidx].i = zio->ipos = i;
zio->idx[zio->curidx].o = zio->opos = o;
tmp->zio = zio;
zvp->v_data = zio;
return (zio);
struct tarfs_zio *zio = NULL;
zio = tarfs_zio_init(tmp, 0, 0);
zio->zstd = malloc(sizeof(*zio->zstd), M_TARFSZSTATE, M_WAITOK);
zio->zstd->zds = ZSTD_createDStream_advanced(tarfs_zstd_mem);
(void)ZSTD_initDStream(zio->zstd->zds);
struct tarfs_zio *zio = tmp->zio;
if (zio->zstd != NULL) {
ZSTD_freeDStream(zio->zstd->zds);
free(zio->zstd, M_TARFSZSTATE);
if (zio->idx != NULL) {
free(zio->idx, M_TARFSZSTATE);
free(zio, M_TARFSZSTATE);
tmp->zio = NULL;
if (tmp->zio != NULL) {