[PATCH] blktrace: improve poll() handling, relayfs uses subbuffer granularity
authorJens Axboe <axboe@suse.de>
Wed, 18 Jan 2006 19:27:10 +0000 (20:27 +0100)
committerJens Axboe <axboe@suse.de>
Wed, 18 Jan 2006 19:27:10 +0000 (20:27 +0100)
blktrace.c

index 364b0a3b511b45e9ed810bf64841d623e96f84d5..a73195ca5ed4782858eecfa77128c3424f979a06 100644 (file)
@@ -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)