From: "Steven Rostedt (Google)" <rostedt@xxxxxxxxxxx> The proxy agent will need to send data in two chunks, and will need to save the offset of the flushed cache so that it can be used later. Signed-off-by: Steven Rostedt (Google) <rostedt@xxxxxxxxxxx> --- .../include/private/trace-cmd-private.h | 1 + lib/trace-cmd/trace-msg.c | 29 +++++++++++++++---- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/lib/trace-cmd/include/private/trace-cmd-private.h b/lib/trace-cmd/include/private/trace-cmd-private.h index 8824dcae0b16..ef2351e8491f 100644 --- a/lib/trace-cmd/include/private/trace-cmd-private.h +++ b/lib/trace-cmd/include/private/trace-cmd-private.h @@ -389,6 +389,7 @@ struct tracecmd_msg_handle { short cpu_count; short version; /* Current protocol version */ unsigned long flags; + off64_t cache_start_offset; bool done; bool cache; int cfd; diff --git a/lib/trace-cmd/trace-msg.c b/lib/trace-cmd/trace-msg.c index c16e8e81e50a..963ef94e977b 100644 --- a/lib/trace-cmd/trace-msg.c +++ b/lib/trace-cmd/trace-msg.c @@ -184,13 +184,27 @@ static int __msg_write(int fd, struct tracecmd_msg *msg, bool network) __hidden off64_t msg_lseek(struct tracecmd_msg_handle *msg_handle, off64_t offset, int whence) { + off64_t cache_offset = msg_handle->cache_start_offset; + off64_t ret; + /* * lseek works only if the handle is in cache mode, * cannot seek on a network socket */ if (!msg_handle->cache || msg_handle->cfd < 0) return (off64_t)-1; - return lseek64(msg_handle->cfd, offset, whence); + + if (whence == SEEK_SET) { + if (offset < cache_offset) + return (off64_t)-1; + offset -= cache_offset; + } + + ret = lseek64(msg_handle->cfd, offset, whence); + if (ret == (off64_t)-1) + return ret; + + return ret + cache_offset; } static int msg_write(struct tracecmd_msg_handle *msg_handle, struct tracecmd_msg *msg) @@ -618,15 +632,16 @@ int tracecmd_msg_handle_cache(struct tracecmd_msg_handle *msg_handle) static int flush_cache(struct tracecmd_msg_handle *msg_handle) { char buf[MSG_MAX_DATA_LEN]; + int fd = msg_handle->cfd; int ret; - if (!msg_handle->cache || msg_handle->cfd < 0) + if (!msg_handle->cache || fd < 0) return 0; msg_handle->cache = false; - if (lseek64(msg_handle->cfd, 0, SEEK_SET) == (off64_t)-1) + if (lseek64(fd, 0, SEEK_SET) == (off64_t)-1) return -1; do { - ret = read(msg_handle->cfd, buf, MSG_MAX_DATA_LEN); + ret = read(fd, buf, MSG_MAX_DATA_LEN); if (ret <= 0) break; ret = tracecmd_msg_data_send(msg_handle, buf, ret); @@ -634,7 +649,11 @@ static int flush_cache(struct tracecmd_msg_handle *msg_handle) break; } while (ret >= 0); - close(msg_handle->cfd); + msg_handle->cache_start_offset = lseek64(fd, 0, SEEK_CUR); + if (msg_handle->cache_start_offset == (off64_t)-1) + return -1; + + close(fd); msg_handle->cfd = -1; return ret; } -- 2.35.1