- switch (stream->chan->output) {
- case CONSUMER_CHANNEL_SPLICE:
- /*
- * XXX: The lttng-modules splice "actor" does not handle copying
- * partial pages hence only using the subbuffer size without the
- * padding makes the splice fail.
- */
- subbuf_size = len;
- padding = 0;
-
- /* splice the subbuffer to the tracefile */
- ret = lttng_consumer_on_read_subbuffer_splice(ctx, stream, subbuf_size,
- padding, &index);
- /*
- * XXX: Splice does not support network streaming so the return value
- * is simply checked against subbuf_size and not like the mmap() op.
- */
- if (ret != subbuf_size) {
- /*
- * display the error but continue processing to try
- * to release the subbuffer
- */
- ERR("Error splicing to tracefile (ret: %zd != len: %lu)",
- ret, subbuf_size);
- write_index = 0;
- }
- break;
- case CONSUMER_CHANNEL_MMAP:
- /* Get subbuffer size without padding */
- err = kernctl_get_subbuf_size(infd, &subbuf_size);
- if (err != 0) {
- PERROR("Getting sub-buffer len failed.");
- err = kernctl_put_subbuf(infd);
- if (err != 0) {
- if (err == -EFAULT) {
- PERROR("Error in unreserving sub buffer\n");
- } else if (err == -EIO) {
- /* Should never happen with newer LTTng versions */
- PERROR("Reader has been pushed by the writer, last sub-buffer corrupted.");
- }
- ret = err;
- goto error;
- }
- ret = err;
- goto error;
- }