Changeset View
Changeset View
Standalone View
Standalone View
sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
Show First 20 Lines • Show All 401 Lines • ▼ Show 20 Lines | if (zio->io_type == ZIO_TYPE_READ) | ||||
abd_copy(data, zio->io_abd, size); | abd_copy(data, zio->io_abd, size); | ||||
} | } | ||||
static void | static void | ||||
zio_decompress(zio_t *zio, abd_t *data, uint64_t size) | zio_decompress(zio_t *zio, abd_t *data, uint64_t size) | ||||
{ | { | ||||
if (zio->io_error == 0) { | if (zio->io_error == 0) { | ||||
void *tmp = abd_borrow_buf(data, size); | void *tmp = abd_borrow_buf(data, size); | ||||
int ret = zio_decompress_data(BP_GET_COMPRESS(zio->io_bp), | int ret; | ||||
if (BP_GET_COMPRESS(zio->io_bp) == ZIO_COMPRESS_ZSTD) { | |||||
ret = zio_decompress_getlevel( | |||||
BP_GET_COMPRESS(zio->io_bp), zio->io_abd, tmp, | |||||
zio->io_size, size, &zio->io_prop.zp_zstd_level); | |||||
} else { | |||||
ret = zio_decompress_data(BP_GET_COMPRESS(zio->io_bp), | |||||
zio->io_abd, tmp, zio->io_size, size); | zio->io_abd, tmp, zio->io_size, size); | ||||
} | |||||
abd_return_buf_copy(data, tmp, size); | abd_return_buf_copy(data, tmp, size); | ||||
if (ret != 0) | if (ret != 0) | ||||
zio->io_error = SET_ERROR(EIO); | zio->io_error = SET_ERROR(EIO); | ||||
} | } | ||||
} | } | ||||
/* | /* | ||||
▲ Show 20 Lines • Show All 1,024 Lines • ▼ Show 20 Lines | if (!BP_IS_HOLE(bp) && bp->blk_birth == zio->io_txg) { | ||||
/* Make sure someone doesn't change their mind on overwrites */ | /* Make sure someone doesn't change their mind on overwrites */ | ||||
ASSERT(BP_IS_EMBEDDED(bp) || MIN(zp->zp_copies + BP_IS_GANG(bp), | ASSERT(BP_IS_EMBEDDED(bp) || MIN(zp->zp_copies + BP_IS_GANG(bp), | ||||
spa_max_replication(spa)) == BP_GET_NDVAS(bp)); | spa_max_replication(spa)) == BP_GET_NDVAS(bp)); | ||||
} | } | ||||
/* If it's a compressed write that is not raw, compress the buffer. */ | /* If it's a compressed write that is not raw, compress the buffer. */ | ||||
if (compress != ZIO_COMPRESS_OFF && psize == lsize) { | if (compress != ZIO_COMPRESS_OFF && psize == lsize) { | ||||
void *cbuf = zio_buf_alloc(lsize); | void *cbuf = zio_buf_alloc(lsize); | ||||
psize = zio_compress_data(compress, zio->io_abd, cbuf, lsize); | psize = zio_compress_data(compress, zio->io_abd, cbuf, lsize, | ||||
zp); | |||||
if (psize == 0 || psize == lsize) { | if (psize == 0 || psize == lsize) { | ||||
compress = ZIO_COMPRESS_OFF; | compress = ZIO_COMPRESS_OFF; | ||||
zio_buf_free(cbuf, lsize); | zio_buf_free(cbuf, lsize); | ||||
} else if (!zp->zp_dedup && psize <= BPE_PAYLOAD_SIZE && | } else if (!zp->zp_dedup && psize <= BPE_PAYLOAD_SIZE && | ||||
zp->zp_level == 0 && !DMU_OT_HAS_FILL(zp->zp_type) && | zp->zp_level == 0 && !DMU_OT_HAS_FILL(zp->zp_type) && | ||||
spa_feature_is_enabled(spa, SPA_FEATURE_EMBEDDED_DATA)) { | spa_feature_is_enabled(spa, SPA_FEATURE_EMBEDDED_DATA)) { | ||||
encode_embedded_bp_compressed(bp, | encode_embedded_bp_compressed(bp, | ||||
cbuf, compress, lsize, psize); | cbuf, compress, lsize, psize); | ||||
▲ Show 20 Lines • Show All 934 Lines • ▼ Show 20 Lines | zio_write_gang_block(zio_t *pio) | ||||
*/ | */ | ||||
for (int g = 0; resid != 0; resid -= lsize, g++) { | for (int g = 0; resid != 0; resid -= lsize, g++) { | ||||
lsize = P2ROUNDUP(resid / (SPA_GBH_NBLKPTRS - g), | lsize = P2ROUNDUP(resid / (SPA_GBH_NBLKPTRS - g), | ||||
SPA_MINBLOCKSIZE); | SPA_MINBLOCKSIZE); | ||||
ASSERT(lsize >= SPA_MINBLOCKSIZE && lsize <= resid); | ASSERT(lsize >= SPA_MINBLOCKSIZE && lsize <= resid); | ||||
zp.zp_checksum = gio->io_prop.zp_checksum; | zp.zp_checksum = gio->io_prop.zp_checksum; | ||||
zp.zp_compress = ZIO_COMPRESS_OFF; | zp.zp_compress = ZIO_COMPRESS_OFF; | ||||
zp.zp_zstd_level = ZIO_ZSTDLVL_DEFAULT; | |||||
zp.zp_type = DMU_OT_NONE; | zp.zp_type = DMU_OT_NONE; | ||||
zp.zp_level = 0; | zp.zp_level = 0; | ||||
zp.zp_copies = gio->io_prop.zp_copies; | zp.zp_copies = gio->io_prop.zp_copies; | ||||
zp.zp_dedup = B_FALSE; | zp.zp_dedup = B_FALSE; | ||||
zp.zp_dedup_verify = B_FALSE; | zp.zp_dedup_verify = B_FALSE; | ||||
zp.zp_nopwrite = B_FALSE; | zp.zp_nopwrite = B_FALSE; | ||||
zio_t *cio = zio_write(zio, spa, txg, &gbh->zg_blkptr[g], | zio_t *cio = zio_write(zio, spa, txg, &gbh->zg_blkptr[g], | ||||
▲ Show 20 Lines • Show All 1,836 Lines • Show Last 20 Lines |