diff options
author | Adam Manzanares <adam.manzanares@wdc.com> | 2018-05-22 10:52:19 -0700 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2018-05-31 10:50:55 -0400 |
commit | d9a08a9e616beeccdbd0e7262b7225ffdfa49e92 (patch) | |
tree | f2f7985aa07ccee2337631273f4b906389649477 /fs/aio.c | |
parent | fc28724d67c90ff48b976e0687caf79993160bed (diff) | |
download | lwn-d9a08a9e616beeccdbd0e7262b7225ffdfa49e92.tar.gz lwn-d9a08a9e616beeccdbd0e7262b7225ffdfa49e92.zip |
fs: Add aio iopriority support
This is the per-I/O equivalent of the ioprio_set system call.
When IOCB_FLAG_IOPRIO is set on the iocb aio_flags field, then we set the
newly added kiocb ki_ioprio field to the value in the iocb aio_reqprio field.
This patch depends on block: add ioprio_check_cap function.
Signed-off-by: Adam Manzanares <adam.manzanares@wdc.com>
Reviewed-by: Jeff Moyer <jmoyer@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/aio.c')
-rw-r--r-- | fs/aio.c | 16 |
1 files changed, 16 insertions, 0 deletions
@@ -1435,6 +1435,22 @@ static int aio_prep_rw(struct kiocb *req, struct iocb *iocb) if (iocb->aio_flags & IOCB_FLAG_RESFD) req->ki_flags |= IOCB_EVENTFD; req->ki_hint = ki_hint_validate(file_write_hint(req->ki_filp)); + if (iocb->aio_flags & IOCB_FLAG_IOPRIO) { + /* + * If the IOCB_FLAG_IOPRIO flag of aio_flags is set, then + * aio_reqprio is interpreted as an I/O scheduling + * class and priority. + */ + ret = ioprio_check_cap(iocb->aio_reqprio); + if (ret) { + pr_debug("aio ioprio check cap error\n"); + return -EINVAL; + } + + req->ki_ioprio = iocb->aio_reqprio; + } else + req->ki_ioprio = IOPRIO_PRIO_VALUE(IOPRIO_CLASS_NONE, 0); + ret = kiocb_set_rw_flags(req, iocb->aio_rw_flags); if (unlikely(ret)) fput(req->ki_filp); |