On 3/4/20 6:07 AM, Pavel Begunkov wrote: > On 04/03/2020 02:50, Jens Axboe wrote: >> In preparation for not needing req->file in on the prep side at all. >> >> Signed-off-by: Jens Axboe <axboe@xxxxxxxxx> >> --- >> fs/io_uring.c | 8 ++++---- >> 1 file changed, 4 insertions(+), 4 deletions(-) >> >> diff --git a/fs/io_uring.c b/fs/io_uring.c >> index 0464efbeba25..9d5e49a39dba 100644 >> --- a/fs/io_uring.c >> +++ b/fs/io_uring.c >> @@ -3367,10 +3367,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; >> } >> >> @@ -3400,6 +3396,10 @@ static int io_close(struct io_kiocb *req, bool force_nonblock) >> { >> int ret; >> >> + if (req->file->f_op == &io_uring_fops || >> + req->close.fd == req->ctx->ring_fd) >> + return -EBADF; >> + > > @ring_fd's and @ring_file's lifetimes are bound by call to io_submit_sqes(), and > they're undefined outside. For the same reason both of them should be used with > ctx->uring_lock hold. I've fixed this by splitting the check. -- Jens Axboe