Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752164AbdFOA2i (ORCPT ); Wed, 14 Jun 2017 20:28:38 -0400 Received: from out4-smtp.messagingengine.com ([66.111.4.28]:56269 "EHLO out4-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752044AbdFOA2d (ORCPT ); Wed, 14 Jun 2017 20:28:33 -0400 X-ME-Sender: X-Sasl-enc: iOUy3kKWgrfSzCbLMsMyNHO9zMOuTQKZPDbRxxS+3EFv 1497486512 From: Michael Sartain To: Steven Rostedt Cc: Michael Sartain , linux-kernel@vger.kernel.org Subject: [PATCH v3 3/6] Handle EINTR signal interrupts for read, write, open calls Date: Wed, 14 Jun 2017 18:27:58 -0600 Message-Id: X-Mailer: git-send-email 2.11.0 In-Reply-To: References: In-Reply-To: References: Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2655 Lines: 95 Read/write/open calls weren't handling EINTR in trace-input.c This patch uses the standard GNU C TEMP_FAILURE_RETRY macro to handle EINTR return values, and updates read/write calls in trace-msg.c to match. Signed-off-by: Michael Sartain --- trace-cmd-local.h | 2 +- trace-input.c | 8 ++++---- trace-msg.c | 8 ++------ 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/trace-cmd-local.h b/trace-cmd-local.h index 9412f9d..8595a8a 100644 --- a/trace-cmd-local.h +++ b/trace-cmd-local.h @@ -31,7 +31,7 @@ static ssize_t __do_write(int fd, const void *data, size_t size) ssize_t w; do { - w = write(fd, data, size - tot); + w = TEMP_FAILURE_RETRY(write(fd, data, size - tot)); tot += w; if (!w) diff --git a/trace-input.c b/trace-input.c index 89ddcf5..251d32b 100644 --- a/trace-input.c +++ b/trace-input.c @@ -202,7 +202,7 @@ static ssize_t do_read(struct tracecmd_input *handle, void *data, size_t size) ssize_t r; do { - r = read(handle->fd, data, size - tot); + r = TEMP_FAILURE_RETRY(read(handle->fd, data, size - tot)); tot += r; if (!r) @@ -774,7 +774,7 @@ static int read_page(struct tracecmd_input *handle, off64_t offset, off64_t ret; if (handle->use_pipe) { - ret = read(handle->cpu_data[cpu].pipe_fd, map, handle->page_size); + ret = TEMP_FAILURE_RETRY(read(handle->cpu_data[cpu].pipe_fd, map, handle->page_size)); /* Set EAGAIN if the pipe is empty */ if (ret < 0) { errno = EAGAIN; @@ -2645,7 +2645,7 @@ struct tracecmd_input *tracecmd_alloc(const char *file) { int fd; - fd = open(file, O_RDONLY); + fd = TEMP_FAILURE_RETRY(open(file, O_RDONLY)); if (fd < 0) return NULL; @@ -2686,7 +2686,7 @@ struct tracecmd_input *tracecmd_open(const char *file) { int fd; - fd = open(file, O_RDONLY); + fd = TEMP_FAILURE_RETRY(open(file, O_RDONLY)); if (fd < 0) return NULL; diff --git a/trace-msg.c b/trace-msg.c index 3991985..d358318 100644 --- a/trace-msg.c +++ b/trace-msg.c @@ -291,10 +291,8 @@ static int msg_read(int fd, void *buf, u32 size, int *n) ssize_t r; while (size) { - r = read(fd, buf + *n, size); + r = TEMP_FAILURE_RETRY(read(fd, buf + *n, size)); if (r < 0) { - if (errno == EINTR) - continue; return -errno; } else if (!r) return -ENOTCONN; @@ -662,10 +660,8 @@ int tracecmd_msg_collect_metadata(int ifd, int ofd) t = n; s = 0; do { - s = write(ofd, msg.data.meta.buf+s, t); + s = TEMP_FAILURE_RETRY(write(ofd, msg.data.meta.buf+s, t)); if (s < 0) { - if (errno == EINTR) - continue; warning("writing to file"); return -errno; } -- 2.11.0