Commit 904fbcb1 authored by Jens Axboe's avatar Jens Axboe
Browse files

io_uring: remove 'fd is io_uring' from close path



The attempt protecting us from closing the ring itself wasn't really
complete, and we actually don't need it. The referencing of requests
themselve, and the references they hold on the ring, ensures that the
life time of the ring is sane. With the check removed, we can also
remove the need to have the close operation fget() the file.

Reported-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 63ff8223
Loading
Loading
Loading
Loading
+4 −6
Original line number Diff line number Diff line
@@ -786,7 +786,6 @@ static const struct io_op_def io_op_defs[] = {
		.needs_fs		= 1,
	},
	[IORING_OP_CLOSE] = {
		.needs_file		= 1,
		.file_table		= 1,
	},
	[IORING_OP_FILES_UPDATE] = {
@@ -3399,10 +3398,6 @@ static int io_close_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
		return -EBADF;

	req->close.fd = READ_ONCE(sqe->fd);
	if (req->file->f_op == &io_uring_fops ||
	    req->close.fd == req->ctx->ring_fd)
		return -EBADF;

	return 0;
}

@@ -3434,8 +3429,11 @@ static int io_close(struct io_kiocb *req, bool force_nonblock)

	req->close.put_file = NULL;
	ret = __close_fd_get_file(req->close.fd, &req->close.put_file);
	if (ret < 0)
	if (ret < 0) {
		if (ret == -ENOENT)
			ret = -EBADF;
		return ret;
	}

	/* if the file has a flush method, be safe and punt to async */
	if (req->close.put_file->f_op->flush && force_nonblock) {