io_uring/uring_cmd: ensure that device supports IOPOLL
It's possible for a file type to support uring commands, but not
pollable ones. Hence before issuing one of those, we should check
that it is supported and error out upfront if it isn't.
Cc: stable@vger.kernel.org
Fixes: 5756a3a7e7
("io_uring: add iopoll infrastructure for io_uring_cmd")
Link: https://github.com/axboe/liburing/issues/816
Reviewed-by: Kanchan Joshi <joshi.k@samsung.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
Родитель
01e68ce08a
Коммит
03b3d6be73
|
@ -108,7 +108,7 @@ int io_uring_cmd(struct io_kiocb *req, unsigned int issue_flags)
|
||||||
struct file *file = req->file;
|
struct file *file = req->file;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!req->file->f_op->uring_cmd)
|
if (!file->f_op->uring_cmd)
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
ret = security_uring_cmd(ioucmd);
|
ret = security_uring_cmd(ioucmd);
|
||||||
|
@ -120,6 +120,8 @@ int io_uring_cmd(struct io_kiocb *req, unsigned int issue_flags)
|
||||||
if (ctx->flags & IORING_SETUP_CQE32)
|
if (ctx->flags & IORING_SETUP_CQE32)
|
||||||
issue_flags |= IO_URING_F_CQE32;
|
issue_flags |= IO_URING_F_CQE32;
|
||||||
if (ctx->flags & IORING_SETUP_IOPOLL) {
|
if (ctx->flags & IORING_SETUP_IOPOLL) {
|
||||||
|
if (!file->f_op->uring_cmd_iopoll)
|
||||||
|
return -EOPNOTSUPP;
|
||||||
issue_flags |= IO_URING_F_IOPOLL;
|
issue_flags |= IO_URING_F_IOPOLL;
|
||||||
req->iopoll_completed = 0;
|
req->iopoll_completed = 0;
|
||||||
WRITE_ONCE(ioucmd->cookie, NULL);
|
WRITE_ONCE(ioucmd->cookie, NULL);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче