zstream recompress: fix zero recompressed buffer and output
If compression happend, any garbage past the compress size was not zeroed out. If compression didn't happen, then the payload size was still set to the rounded-up return from zio_compress_data(), which is dependent on the input, which is not necessarily the logical size. So that's all fixed too, mostly from stealing the math from zio.c. Sponsored-by: Klara, Inc. Sponsored-by: Wasabi Technology, Inc. Signed-off-by: Rob Norris <rob.norris@klarasystems.com>
This commit is contained in:
parent
d728c6e8ef
commit
25fbb01fee
|
@ -287,24 +287,26 @@ zstream_do_recompress(int argc, char *argv[])
|
||||||
dbuf, drrw->drr_logical_size);
|
dbuf, drrw->drr_logical_size);
|
||||||
abd_t *pabd =
|
abd_t *pabd =
|
||||||
abd_get_from_buf_struct(&abd, buf, bufsz);
|
abd_get_from_buf_struct(&abd, buf, bufsz);
|
||||||
payload_size = P2ROUNDUP(zio_compress_data(
|
size_t csize = zio_compress_data(ctype, &dabd,
|
||||||
ctype, &dabd, &pabd,
|
&pabd, drrw->drr_logical_size, level);
|
||||||
drrw->drr_logical_size, level),
|
size_t rounded =
|
||||||
SPA_MINBLOCKSIZE);
|
P2ROUNDUP(csize, SPA_MINBLOCKSIZE);
|
||||||
if (payload_size != drrw->drr_logical_size) {
|
if (rounded >= drrw->drr_logical_size) {
|
||||||
drrw->drr_compressiontype = ctype;
|
|
||||||
drrw->drr_compressed_size =
|
|
||||||
payload_size;
|
|
||||||
} else {
|
|
||||||
memcpy(buf, dbuf, payload_size);
|
memcpy(buf, dbuf, payload_size);
|
||||||
drrw->drr_compressiontype = 0;
|
drrw->drr_compressiontype = 0;
|
||||||
drrw->drr_compressed_size = 0;
|
drrw->drr_compressed_size = 0;
|
||||||
|
} else {
|
||||||
|
abd_zero_off(pabd, csize,
|
||||||
|
rounded - csize);
|
||||||
|
drrw->drr_compressiontype = ctype;
|
||||||
|
drrw->drr_compressed_size =
|
||||||
|
payload_size = rounded;
|
||||||
}
|
}
|
||||||
abd_free(&abd);
|
abd_free(&abd);
|
||||||
abd_free(&dabd);
|
abd_free(&dabd);
|
||||||
free(dbuf);
|
free(dbuf);
|
||||||
} else {
|
} else {
|
||||||
drrw->drr_compressiontype = ctype;
|
drrw->drr_compressiontype = 0;
|
||||||
drrw->drr_compressed_size = 0;
|
drrw->drr_compressed_size = 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue