From 0632499a602c5588da22d191c14827be3b86a01a Mon Sep 17 00:00:00 2001 From: Julien Desfossez Date: Tue, 24 May 2011 10:15:47 -0400 Subject: [PATCH] Handle splice errors Send to the session daemon the eventual error returned by splice. Signed-off-by: David Goulet --- kconsumerd/kconsumerd.c | 28 ++++++++++++++++++++++--- liblttsessiondcomm/liblttsessiondcomm.c | 4 ++++ liblttsessiondcomm/liblttsessiondcomm.h | 4 ++++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/kconsumerd/kconsumerd.c b/kconsumerd/kconsumerd.c index 7e166b8f1..a00f07932 100644 --- a/kconsumerd/kconsumerd.c +++ b/kconsumerd/kconsumerd.c @@ -260,16 +260,18 @@ static int on_read_subbuffer(struct ltt_kconsumerd_fd *kconsumerd_fd, SPLICE_F_MOVE | SPLICE_F_MORE); DBG("splice chan to pipe ret %ld", ret); if (ret < 0) { + ret = errno; perror("Error in relay splice"); - goto write_end; + goto splice_error; } ret = splice(thread_pipe[0], NULL, outfd, NULL, ret, SPLICE_F_MOVE | SPLICE_F_MORE); DBG("splice pipe to file %ld", ret); if (ret < 0) { + ret = errno; perror("Error in file splice"); - goto write_end; + goto splice_error; } if (ret >= len) { len = 0; @@ -279,7 +281,7 @@ static int on_read_subbuffer(struct ltt_kconsumerd_fd *kconsumerd_fd, SYNC_FILE_RANGE_WRITE); kconsumerd_fd->out_fd_offset += ret; } -write_end: + /* * This does a blocking write-and-wait on any page that belongs to the * subbuffer prior to the one we just wrote. @@ -307,6 +309,26 @@ write_end: posix_fadvise(outfd, orig_offset - kconsumerd_fd->max_sb_size, kconsumerd_fd->max_sb_size, POSIX_FADV_DONTNEED); } + goto end; + +splice_error: + /* send the appropriate error description to sessiond */ + switch(ret) { + case EBADF: + send_error(KCONSUMERD_SPLICE_EBADF); + break; + case EINVAL: + send_error(KCONSUMERD_SPLICE_EINVAL); + break; + case ENOMEM: + send_error(KCONSUMERD_SPLICE_ENOMEM); + break; + case ESPIPE: + send_error(KCONSUMERD_SPLICE_ESPIPE); + break; + } + +end: return ret; } diff --git a/liblttsessiondcomm/liblttsessiondcomm.c b/liblttsessiondcomm/liblttsessiondcomm.c index d754f59da..19bda8388 100644 --- a/liblttsessiondcomm/liblttsessiondcomm.c +++ b/liblttsessiondcomm/liblttsessiondcomm.c @@ -60,6 +60,10 @@ static const char *lttcomm_readable_code[] = { [ LTTCOMM_ERR_INDEX(KCONSUMERD_EXIT_SUCCESS) ] = "Kconsumerd exiting normally", [ LTTCOMM_ERR_INDEX(KCONSUMERD_EXIT_FAILURE) ] = "Kconsumerd exiting on error", [ LTTCOMM_ERR_INDEX(KCONSUMERD_OUTFD_ERROR) ] = "Kconsumerd error opening the tracefile", + [ LTTCOMM_ERR_INDEX(KCONSUMERD_SPLICE_EBADF) ] = "Kconsumerd splice EBADF", + [ LTTCOMM_ERR_INDEX(KCONSUMERD_SPLICE_EINVAL) ] = "Kconsumerd splice EINVAL", + [ LTTCOMM_ERR_INDEX(KCONSUMERD_SPLICE_ENOMEM) ] = "Kconsumerd splice ENOMEM", + [ LTTCOMM_ERR_INDEX(KCONSUMERD_SPLICE_ESPIPE) ] = "Kconsumerd splice ESPIPE", [ LTTCOMM_ERR_INDEX(LTTCOMM_NO_EVENT) ] = "No event found", }; diff --git a/liblttsessiondcomm/liblttsessiondcomm.h b/liblttsessiondcomm/liblttsessiondcomm.h index 8e6a862ef..580d4c2c7 100644 --- a/liblttsessiondcomm/liblttsessiondcomm.h +++ b/liblttsessiondcomm/liblttsessiondcomm.h @@ -112,6 +112,10 @@ enum lttcomm_return_code { KCONSUMERD_EXIT_SUCCESS, /* kconsumerd exiting normally */ KCONSUMERD_EXIT_FAILURE, /* kconsumerd exiting on error */ KCONSUMERD_OUTFD_ERROR, /* error opening the tracefile */ + KCONSUMERD_SPLICE_EBADF, /* EBADF from splice(2) */ + KCONSUMERD_SPLICE_EINVAL, /* EINVAL from splice(2) */ + KCONSUMERD_SPLICE_ENOMEM, /* ENOMEM from splice(2) */ + KCONSUMERD_SPLICE_ESPIPE, /* ESPIPE from splice(2) */ /* MUST be last element */ LTTCOMM_NR, /* Last element */ }; -- 2.34.1