examples/io_uring-test: don't error on shorter files
The example currently assumes the file is at least 4*4096 bytes,
and errors when we get 0 reads on EOF. Fix this up.
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
#include <unistd.h>
#include "liburing.h"
@@ -21,6 +23,8 @@ int main(int argc, char *argv[])
struct io_uring_sqe *sqe;
struct io_uring_cqe *cqe;
struct iovec *iovecs;
+ struct stat sb;
+ ssize_t fsize;
off_t offset;
void *buf;
@@ -41,12 +45,19 @@ int main(int argc, char *argv[])
return 1;
}
+ if (fstat(fd, &sb) < 0) {
+ perror("fstat");
+ return 1;
+ }
+
+ fsize = 0;
iovecs = calloc(QD, sizeof(struct iovec));
for (i = 0; i < QD; i++) {
if (posix_memalign(&buf, 4096, 4096))
return 1;
iovecs[i].iov_base = buf;
iovecs[i].iov_len = 4096;
+ fsize += 4096;
}
offset = 0;
@@ -58,16 +69,22 @@ int main(int argc, char *argv[])
io_uring_prep_readv(sqe, fd, &iovecs[i], 1, offset);
offset += iovecs[i].iov_len;
i++;
+ if (offset > sb.st_size)
+ break;
} while (1);
ret = io_uring_submit(&ring);
if (ret < 0) {
fprintf(stderr, "io_uring_submit: %s\n", strerror(-ret));
return 1;
+ } else if (ret != i) {
+ fprintf(stderr, "io_uring_submit submitted less %d\n", ret);
+ return 1;
}
done = 0;
pending = ret;
+ fsize = 0;
for (i = 0; i < pending; i++) {
ret = io_uring_wait_cqe(&ring, &cqe);
if (ret < 0) {
@@ -77,16 +94,18 @@ int main(int argc, char *argv[])
done++;
ret = 0;
- if (cqe->res != 4096) {
+ if (cqe->res != 4096 && cqe->res + fsize != sb.st_size) {
fprintf(stderr, "ret=%d, wanted 4096\n", cqe->res);
ret = 1;
}
+ fsize += cqe->res;
io_uring_cqe_seen(&ring, cqe);
if (ret)
break;
}
- printf("Submitted=%d, completed=%d\n", pending, done);
+ printf("Submitted=%d, completed=%d, bytes=%lu\n", pending, done,
+ (unsigned long) fsize);
close(fd);
io_uring_queue_exit(&ring);
return 0;
