Send to the session daemon the eventual error returned by splice.
Signed-off-by: David Goulet <david.goulet@polymtl.ca>
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;
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.
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;
}
[ 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",
};
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 */
};