fs: Use RWF_* flags for AIO operations

aio_rw_flags is introduced in struct iocb (using aio_reserved1) which will
carry the RWF_* flags. We cannot use aio_flags because they are not
checked for validity which may break existing applications.

Note, the only place RWF_HIPRI comes in effect is dio_await_one().
All the rest of the locations, aio code return -EIOCBQUEUED before the
checks for RWF_HIPRI.

Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
Goldwyn Rodrigues 2017-06-20 07:05:42 -05:00 committed by Jens Axboe
parent 7fc9e47224
commit 9830f4be15
2 changed files with 8 additions and 2 deletions

View File

@ -1541,7 +1541,7 @@ static int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb,
ssize_t ret; ssize_t ret;
/* enforce forwards compatibility on users */ /* enforce forwards compatibility on users */
if (unlikely(iocb->aio_reserved1 || iocb->aio_reserved2)) { if (unlikely(iocb->aio_reserved2)) {
pr_debug("EINVAL: reserve field set\n"); pr_debug("EINVAL: reserve field set\n");
return -EINVAL; return -EINVAL;
} }
@ -1586,6 +1586,12 @@ static int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb,
req->common.ki_flags |= IOCB_EVENTFD; req->common.ki_flags |= IOCB_EVENTFD;
} }
ret = kiocb_set_rw_flags(&req->common, iocb->aio_rw_flags);
if (unlikely(ret)) {
pr_debug("EINVAL: aio_rw_flags\n");
goto out_put_req;
}
ret = put_user(KIOCB_KEY, &user_iocb->aio_key); ret = put_user(KIOCB_KEY, &user_iocb->aio_key);
if (unlikely(ret)) { if (unlikely(ret)) {
pr_debug("EFAULT: aio_key\n"); pr_debug("EFAULT: aio_key\n");

View File

@ -79,7 +79,7 @@ struct io_event {
struct iocb { struct iocb {
/* these are internal to the kernel/libc. */ /* these are internal to the kernel/libc. */
__u64 aio_data; /* data to be returned in event's data */ __u64 aio_data; /* data to be returned in event's data */
__u32 PADDED(aio_key, aio_reserved1); __u32 PADDED(aio_key, aio_rw_flags);
/* the kernel sets aio_key to the req # */ /* the kernel sets aio_key to the req # */
/* common fields */ /* common fields */