trace-cmd recorder: Make sure to write as much as was read in read_data()

It is possible that the write() call in read_data() may not write as much as
what was read. In that case, loop to make sure all the data that was read is
written to the output.

Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
diff --git a/trace-recorder.c b/trace-recorder.c
index 16a3cfa..eb6413e 100644
--- a/trace-recorder.c
+++ b/trace-recorder.c
@@ -388,22 +388,31 @@
 static long read_data(struct tracecmd_recorder *recorder)
 {
 	char buf[recorder->page_size];
-	long ret;
+	long left;
+	long r, w;
 
-	ret = read(recorder->trace_fd, buf, recorder->page_size);
-	if (ret < 0) {
+	r = read(recorder->trace_fd, buf, recorder->page_size);
+	if (r < 0) {
 		if (errno != EAGAIN && errno != EINTR) {
 			warning("recorder error in read output");
 			return -1;
 		}
-		ret = 0;
-	}
-	if (ret > 0) {
-		write(recorder->fd, buf, ret);
-		update_fd(recorder, ret);
+		return 0;
 	}
 
-	return ret;
+	left = r;
+	do {
+		w = write(recorder->fd, buf + (r - left), left);
+		if (w > 0) {
+			left -= w;
+			update_fd(recorder, w);
+		}
+	} while (w >= 0 && left);
+
+	if (w < 0)
+		r = w;
+
+	return r;
 }
 
 static void set_nonblock(struct tracecmd_recorder *recorder)