From bbabf03a6476d57c8e6507857fb7bf5b29018432 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Wed, 18 Jan 2006 20:27:10 +0100 Subject: [PATCH] [PATCH] blktrace: improve poll() handling, relayfs uses subbuffer granularity --- blktrace.c | 51 ++++++++++++++++++++++++++------------------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/blktrace.c b/blktrace.c index 364b0a3..a73195c 100644 --- a/blktrace.c +++ b/blktrace.c @@ -282,40 +282,41 @@ static void wait_for_data(struct thread_information *tip) static int __read_data(struct thread_information *tip, void *buf, int len, int block) { - char *p = buf; - int ret, bytes_done = 0; - - while (!is_done() && bytes_done < len) { - ret = read(tip->fd, p, len - bytes_done); - if (ret == (len - bytes_done)) - return len; + int ret = 0, waited = 0; - if (ret < 0) { - if (errno == EAGAIN) { - if (bytes_done || !block) - break; - wait_for_data(tip); - } else { + while (!is_done() || waited) { + ret = read(tip->fd, buf, len); + waited = 0; + fprintf(stderr, "got %d, block %d\n", ret, block); + if (ret > 0) + break; + else if (!ret) { + if (!block) + break; + /* + * the waited logic is needed, because the relayfs + * poll works on a sub-buffer granularity + */ + wait_for_data(tip); + waited = 1; + } else { + if (errno != EAGAIN) { perror(tip->fn); fprintf(stderr,"Thread %d failed read of %s\n", tip->cpu, tip->fn); break; } - } else if (ret > 0) { - p += ret; - bytes_done += ret; - } else if (bytes_done || !block) - break; - else + if (!block) { + ret = 0; + break; + } + wait_for_data(tip); + waited = 0; + } } - if (bytes_done) - return bytes_done; - if (!block) - return 0; - - return -1; + return ret; } #define can_grow_ring(tip) ((tip)->fd_max_size < RING_MAX_NR * buf_size * buf_nr) -- 2.25.1