Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bdf20073 authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Jens Axboe
Browse files

io_uring: use __kernel_timespec in timeout ABI



All system calls use struct __kernel_timespec instead of the old struct
timespec, but this one was just added with the old-style ABI. Change it
now to enforce the use of __kernel_timespec, avoiding ABI confusion and
the need for compat handlers on 32-bit architectures.

Any user space caller will have to use __kernel_timespec now, but this
is unambiguous and works for any C library regardless of the time_t
definition. A nicer way to specify the timeout would have been a less
ambiguous 64-bit nanosecond value, but I suppose it's too late now to
change that as this would impact both 32-bit and 64-bit users.

Fixes: 5262f567 ("io_uring: IORING_OP_TIMEOUT support")
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 85560117
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -1892,15 +1892,15 @@ static int io_timeout(struct io_kiocb *req, const struct io_uring_sqe *sqe)
	unsigned count, req_dist, tail_index;
	struct io_ring_ctx *ctx = req->ctx;
	struct list_head *entry;
	struct timespec ts;
	struct timespec64 ts;

	if (unlikely(ctx->flags & IORING_SETUP_IOPOLL))
		return -EINVAL;
	if (sqe->flags || sqe->ioprio || sqe->buf_index || sqe->timeout_flags ||
	    sqe->len != 1)
		return -EINVAL;
	if (copy_from_user(&ts, (void __user *) (unsigned long) sqe->addr,
	    sizeof(ts)))

	if (get_timespec64(&ts, u64_to_user_ptr(sqe->addr)))
		return -EFAULT;

	/*
@@ -1934,7 +1934,7 @@ static int io_timeout(struct io_kiocb *req, const struct io_uring_sqe *sqe)

	hrtimer_init(&req->timeout.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
	req->timeout.timer.function = io_timeout_fn;
	hrtimer_start(&req->timeout.timer, timespec_to_ktime(ts),
	hrtimer_start(&req->timeout.timer, timespec64_to_ktime(ts),
			HRTIMER_MODE_REL);
	return 0;
}