+static unsigned int binject_read_commands(struct thread_data *td, void *p,
+ int left, int *err)
+{
+ struct binject_file *bf;
+ struct fio_file *f;
+ int i, ret, events;
+
+one_more:
+ events = 0;
+ for_each_file(td, f, i) {
+ bf = (struct binject_file *) f->engine_data;
+ ret = read(bf->fd, p, left * sizeof(struct b_user_cmd));
+ if (ret < 0) {
+ if (errno == EAGAIN)
+ continue;
+ *err = -errno;
+ td_verror(td, errno, "read");
+ break;
+ } else if (ret) {
+ p += ret;
+ events += ret / sizeof(struct b_user_cmd);
+ }
+ }
+
+ if (*err || events)
+ return events;
+
+ usleep(1000);
+ goto one_more;
+}
+