summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/bfstd.c9
-rw-r--r--src/bfstd.h10
-rw-r--r--src/bftw.c2
-rw-r--r--src/ioq.c32
-rw-r--r--src/ioq.h6
5 files changed, 33 insertions, 26 deletions
diff --git a/src/bfstd.c b/src/bfstd.c
index 15e8667..0a9b87c 100644
--- a/src/bfstd.c
+++ b/src/bfstd.c
@@ -59,6 +59,15 @@ bool errno_is_like(int category) {
return error_is_like(errno, category);
}
+int try(int ret) {
+ if (ret >= 0) {
+ return ret;
+ } else {
+ bfs_assert(errno > 0, "errno should be positive, was %d\n", errno);
+ return -errno;
+ }
+}
+
char *xdirname(const char *path) {
size_t i = xbaseoff(path);
diff --git a/src/bfstd.h b/src/bfstd.h
index 8953b9b..d160c88 100644
--- a/src/bfstd.h
+++ b/src/bfstd.h
@@ -63,6 +63,16 @@ bool error_is_like(int error, int category);
*/
bool errno_is_like(int category);
+/**
+ * Apply the "negative errno" convention.
+ *
+ * @param ret
+ * The return value of the attempted operation.
+ * @return
+ * ret, if non-negative, otherwise -errno.
+ */
+int try(int ret);
+
#include <fcntl.h>
#ifndef O_EXEC
diff --git a/src/bftw.c b/src/bftw.c
index 49f07df..952b090 100644
--- a/src/bftw.c
+++ b/src/bftw.c
@@ -621,7 +621,7 @@ static int bftw_ioq_pop(struct bftw_state *state, bool block) {
}
dir = ent->opendir.dir;
- if (ent->ret == 0) {
+ if (ent->result >= 0) {
bftw_file_set_dir(cache, file, dir);
} else {
bftw_freedir(cache, dir);
diff --git a/src/ioq.c b/src/ioq.c
index 2739338..89ebb3e 100644
--- a/src/ioq.c
+++ b/src/ioq.c
@@ -455,42 +455,35 @@ static bool ioq_check_cancel(struct ioq *ioq, struct ioq_ent *ent) {
return false;
}
- ent->ret = -1;
- ent->error = EINTR;
+ ent->result = -EINTR;
ioqq_push(ioq->ready, ent);
return true;
}
/** Handle a single request synchronously. */
static void ioq_handle(struct ioq *ioq, struct ioq_ent *ent) {
- int ret;
-
switch (ent->op) {
case IOQ_CLOSE:
- ret = xclose(ent->close.fd);
+ ent->result = try(xclose(ent->close.fd));
break;
case IOQ_OPENDIR:
- ret = bfs_opendir(ent->opendir.dir, ent->opendir.dfd, ent->opendir.path, ent->opendir.flags);
- if (ret == 0) {
+ ent->result = try(bfs_opendir(ent->opendir.dir, ent->opendir.dfd, ent->opendir.path, ent->opendir.flags));
+ if (ent->result >= 0) {
bfs_polldir(ent->opendir.dir);
}
break;
case IOQ_CLOSEDIR:
- ret = bfs_closedir(ent->closedir.dir);
+ ent->result = try(bfs_closedir(ent->closedir.dir));
break;
default:
bfs_bug("Unknown ioq_op %d", (int)ent->op);
- ret = -1;
- errno = ENOSYS;
+ ent->result = -ENOSYS;
break;
}
- ent->ret = ret;
- ent->error = ret == 0 ? 0 : errno;
-
ioqq_push(ioq->ready, ent);
}
@@ -603,24 +596,21 @@ static void ioq_ring_reap(struct ioq_ring_state *state) {
}
struct ioq_ent *ent = io_uring_cqe_get_data(cqe);
- ent->ret = cqe->res >= 0 ? cqe->res : -1;
- ent->error = cqe->res < 0 ? -cqe->res : 0;
+ ent->result = cqe->res;
io_uring_cqe_seen(ring, cqe);
--state->submitted;
- if (ent->op == IOQ_OPENDIR && ent->ret >= 0) {
- int fd = ent->ret;
+ if (ent->op == IOQ_OPENDIR && ent->result >= 0) {
+ int fd = ent->result;
if (ioq_check_cancel(ioq, ent)) {
xclose(fd);
continue;
}
- ent->ret = bfs_opendir(ent->opendir.dir, fd, NULL, ent->opendir.flags);
- if (ent->ret == 0) {
+ ent->result = try(bfs_opendir(ent->opendir.dir, fd, NULL, ent->opendir.flags));
+ if (ent->result >= 0) {
// TODO: io_uring_prep_getdents()
bfs_polldir(ent->opendir.dir);
- } else {
- ent->error = errno;
}
}
diff --git a/src/ioq.h b/src/ioq.h
index 87727cb..e1e5052 100644
--- a/src/ioq.h
+++ b/src/ioq.h
@@ -36,10 +36,8 @@ struct ioq_ent {
/** The I/O operation. */
enum ioq_op op;
- /** The return value of the operation. */
- int ret;
- /** The error code, if the operation failed. */
- int error;
+ /** The return value (on success) or negative error code (on failure). */
+ int result;
/** Arbitrary user data. */
void *ptr;