aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com>2022-04-11 07:10:38 +0300
committerSteven Rostedt (Google) <rostedt@goodmis.org>2022-04-11 20:27:09 -0400
commit66c2f0904ab8f805e3962a43fdbae53a95417bf0 (patch)
tree70daddc8bf8f8c3c0672bf864bca60a74df7e2e7
parent4053010ee2834b270470c3a5c3c2da2dee5a901b (diff)
downloadtrace-cmd-66c2f0904ab8f805e3962a43fdbae53a95417bf0.tar.gz
trace-cmd: Write the actual size of compressed block in the trace file
Before a data block is compressed using the chosen compression algorithm, a hook function is called to calculate the size of the required buffer to compress the data. In most cases that size is bigger than the actual size of the compressed data. The current logic writes into the trace file that buffer with its calculated size, even though part of it is not used. In the trace file should be written only the compressed data block, with its real size. Link: https://lore.kernel.org/linux-trace-devel/20220411041038.132453-1-tz.stoyanov@gmail.com fixes: 3f8447b1 ("trace-cmd library: Add support for compression algorithms") Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com> Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
-rw-r--r--lib/trace-cmd/trace-compress.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/lib/trace-cmd/trace-compress.c b/lib/trace-cmd/trace-compress.c
index aa03d17c..a63295e6 100644
--- a/lib/trace-cmd/trace-compress.c
+++ b/lib/trace-cmd/trace-compress.c
@@ -303,7 +303,7 @@ error:
*/
int tracecmd_compress_block(struct tracecmd_compression *handle)
{
- unsigned int size;
+ unsigned int size, real_size;
char *buf;
int endian4;
int ret;
@@ -318,12 +318,14 @@ int tracecmd_compress_block(struct tracecmd_compression *handle)
if (!buf)
return -1;
- ret = handle->proto->compress_block(handle->context, handle->buffer, handle->pointer, buf, size);
- if (ret < 0)
+ real_size = handle->proto->compress_block(handle->context, handle->buffer, handle->pointer, buf, size);
+ if (real_size < 0) {
+ ret = real_size;
goto out;
+ }
/* Write compressed data size */
- endian4 = tep_read_number(handle->tep, &ret, 4);
+ endian4 = tep_read_number(handle->tep, &real_size, 4);
ret = do_write(handle, &endian4, 4);
if (ret != 4)
goto out;
@@ -337,8 +339,8 @@ int tracecmd_compress_block(struct tracecmd_compression *handle)
}
/* Write compressed data */
- ret = do_write(handle, buf, size);
- if (ret != size) {
+ ret = do_write(handle, buf, real_size);
+ if (ret != real_size) {
ret = -1;
goto out;
}