server: require poll before fio_net_recv_cmd()

Signed-off-by: Jens Axboe <axboe@kernel.dk>
diff --git a/client.c b/client.c
index 5a6fc39..cd850c5 100644
--- a/client.c
+++ b/client.c
@@ -42,7 +42,7 @@
 
 static FLIST_HEAD(client_list);
 
-static int handle_client(struct fio_client *client, int one, int block);
+static int handle_client(struct fio_client *client);
 
 static struct fio_client *find_client_by_fd(int fd)
 {
@@ -154,6 +154,8 @@
 		hent = gethostbyname(client->hostname);
 		if (!hent) {
 			log_err("fio: gethostbyname: %s\n", strerror(errno));
+			log_err("fio: failed looking up hostname %s\n",
+					client->hostname);
 			return 1;
 		}
 
@@ -217,7 +219,7 @@
 	dprint(FD_NET, "client: send probe\n");
 
 	fio_net_send_simple_cmd(client->fd, FIO_NET_CMD_PROBE, 0);
-	handle_client(client, 1, 1);
+	handle_client(client);
 }
 
 static int send_client_cmd_line(struct fio_client *client)
@@ -280,7 +282,7 @@
 
 	fd = open(filename, O_RDONLY);
 	if (fd < 0) {
-		log_err("fio: job file open: %s\n", strerror(errno));
+		log_err("fio: job file <%s> open: %s\n", filename, strerror(errno));
 		return 1;
 	}
 
@@ -479,72 +481,67 @@
 		probe->fio_minor, probe->fio_patch);
 }
 
-static int handle_client(struct fio_client *client, int one, int block)
+static int handle_client(struct fio_client *client)
 {
 	struct fio_net_cmd *cmd;
-	int done = 0, did_cmd = 0;
 
 	dprint(FD_NET, "client: handle %s\n", client->hostname);
 
-	while ((cmd = fio_net_recv_cmd(client->fd, block)) != NULL) {
-		did_cmd++;
+	cmd = fio_net_recv_cmd(client->fd);
+	if (!cmd)
+		return 0;
 
-		dprint(FD_NET, "client: got cmd op %d from %s\n",
+	dprint(FD_NET, "client: got cmd op %d from %s\n",
 					cmd->opcode, client->hostname);
 
-		switch (cmd->opcode) {
-		case FIO_NET_CMD_QUIT:
-			remove_client(client);
-			free(cmd);
-			done = 1;
-			break;
-		case FIO_NET_CMD_TEXT: {
-			const char *buf = (const char *) cmd->payload;
-			int fio_unused ret;
+	switch (cmd->opcode) {
+	case FIO_NET_CMD_QUIT:
+		remove_client(client);
+		free(cmd);
+		break;
+	case FIO_NET_CMD_TEXT: {
+		const char *buf = (const char *) cmd->payload;
+		int fio_unused ret;
 
-			if (!client->skip_newline)
-				fprintf(f_out, "<%s> ", client->hostname);
-			ret = fwrite(buf, cmd->pdu_len, 1, f_out);
-			fflush(f_out);
-			client->skip_newline = strchr(buf, '\n') == NULL;
-			free(cmd);
-			break;
-			}
-		case FIO_NET_CMD_TS:
-			handle_ts(cmd);
-			free(cmd);
-			break;
-		case FIO_NET_CMD_GS:
-			handle_gs(cmd);
-			free(cmd);
-			break;
-		case FIO_NET_CMD_ETA:
-			handle_eta(cmd);
-			free(cmd);
-			break;
-		case FIO_NET_CMD_PROBE:
-			handle_probe(cmd);
-			free(cmd);
-			break;
-		case FIO_NET_CMD_START:
-			client->state = Client_started;
-			free(cmd);
-			break;
-		case FIO_NET_CMD_STOP:
-			client->state = Client_stopped;
-			free(cmd);
-			break;
-		default:
-			log_err("fio: unknown client op: %d\n", cmd->opcode);
-			free(cmd);
-			break;
+		if (!client->skip_newline)
+			fprintf(f_out, "<%s> ", client->hostname);
+		ret = fwrite(buf, cmd->pdu_len, 1, f_out);
+		fflush(f_out);
+		client->skip_newline = strchr(buf, '\n') == NULL;
+		free(cmd);
+		break;
 		}
-
-		if (done || one)
-			break;
+	case FIO_NET_CMD_TS:
+		handle_ts(cmd);
+		free(cmd);
+		break;
+	case FIO_NET_CMD_GS:
+		handle_gs(cmd);
+		free(cmd);
+		break;
+	case FIO_NET_CMD_ETA:
+		handle_eta(cmd);
+		free(cmd);
+		break;
+	case FIO_NET_CMD_PROBE:
+		handle_probe(cmd);
+		free(cmd);
+		break;
+	case FIO_NET_CMD_START:
+		client->state = Client_started;
+		free(cmd);
+		break;
+	case FIO_NET_CMD_STOP:
+		client->state = Client_stopped;
+		free(cmd);
+		break;
+	default:
+		log_err("fio: unknown client op: %d\n", cmd->opcode);
+		free(cmd);
+		break;
 	}
 
-	return did_cmd;
+	return 1;
 }
 
 int fio_handle_clients(void)
@@ -588,7 +585,7 @@
 				log_err("fio: unknown client\n");
 				continue;
 			}
-			if (!handle_client(client, 0, 0)) {
+			if (!handle_client(client)) {
 				log_info("client: host=%s disconnected\n",
 						client->hostname);
 				remove_client(client);
diff --git a/server.c b/server.c
index f586235..2aff062 100644
--- a/server.c
+++ b/server.c
@@ -113,7 +113,7 @@
 /*
  * Read (and defragment, if necessary) incoming commands
  */
-struct fio_net_cmd *fio_net_recv_cmd(int sk, int block)
+struct fio_net_cmd *fio_net_recv_cmd(int sk)
 {
 	struct fio_net_cmd cmd, *cmdret = NULL;
 	size_t cmd_size = 0, pdu_offset = 0;
@@ -122,37 +122,6 @@
 	void *pdu = NULL;
 
 	do {
-		struct pollfd pfd;
-
-		pfd.fd = sk;
-		pfd.events = POLLIN;
-		ret = 0;
-		do {
-			int timeo = block ? 100 : 10;
-
-			ret = poll(&pfd, 1, timeo);
-			if (ret < 0) {
-				if (errno == EINTR)
-					break;
-				log_err("fio: poll: %s\n", strerror(errno));
-				break;
-			} else if (!ret) {
-				if (!block)
-					return NULL;
-				continue;
-			}
-
-			if (pfd.revents & POLLIN)
-				break;
-			if (pfd.revents & (POLLERR|POLLHUP)) {
-				ret = 1;
-				break;
-			}
-		} while (ret >= 0 && block);
-
-		if (ret < 0)
-			break;
-
 		ret = fio_recv_data(sk, &cmd, sizeof(cmd));
 		if (ret)
 			break;
@@ -376,7 +345,34 @@
 
 	/* read forever */
 	while (!exit_backend) {
-		cmd = fio_net_recv_cmd(sk, block);
+		struct pollfd pfd = {
+			.fd	= sk,
+			.events	= POLLIN,
+		};
+
+		ret = 0;
+		do {
+			ret = poll(&pfd, 1, 100);
+			if (ret < 0) {
+				if (errno == EINTR)
+					break;
+				log_err("fio: poll: %s\n", strerror(errno));
+				break;
+			} else if (!ret)
+				continue;
+
+			if (pfd.revents & POLLIN)
+				break;
+			if (pfd.revents & (POLLERR|POLLHUP)) {
+				ret = 1;
+				break;
+			}
+		} while (1);
+
+		if (ret < 0)
+			break;
+
+		cmd = fio_net_recv_cmd(sk);
 		if (!cmd) {
 			ret = -1;
 			break;
diff --git a/server.h b/server.h
index 3d1d79c..82a6db6 100644
--- a/server.h
+++ b/server.h
@@ -92,7 +92,7 @@
 extern int fio_recv_data(int sk, void *p, unsigned int len);
 extern int fio_send_data(int sk, const void *p, unsigned int len);
 extern void fio_net_cmd_crc(struct fio_net_cmd *);
-extern struct fio_net_cmd *fio_net_recv_cmd(int sk, int block);
+extern struct fio_net_cmd *fio_net_recv_cmd(int sk);
 
 extern int exit_backend;
 extern int fio_net_port;