summary refs log tree commit diff
path: root/fs/aio.c
diff options
context:
space:
mode:
authorAdam Manzanares <adam.manzanares@wdc.com>2018-05-22 10:52:19 -0700
committerAl Viro <viro@zeniv.linux.org.uk>2018-05-31 10:50:55 -0400
commitd9a08a9e616beeccdbd0e7262b7225ffdfa49e92 (patch)
treef2f7985aa07ccee2337631273f4b906389649477 /fs/aio.c
parentfc28724d67c90ff48b976e0687caf79993160bed (diff)
downloadlinux-d9a08a9e616beeccdbd0e7262b7225ffdfa49e92.tar.gz
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.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/fs/aio.c b/fs/aio.c
index 33299ece7540..9527ededa669 100644
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -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);