aio: simplify KIOCB_KEY handling
authorChristoph Hellwig <hch@lst.de>
Fri, 30 Mar 2018 09:19:25 +0000 (11:19 +0200)
committerChristoph Hellwig <hch@lst.de>
Sat, 26 May 2018 07:16:44 +0000 (09:16 +0200)
No need to pass the key field to lookup_iocb to compare it with KIOCB_KEY,
as we can do that right after retrieving it from userspace.  Also move the
KIOCB_KEY definition to aio.c as it is an internal value not used by any
other place in the kernel.

Signed-off-by: Christoph Hellwig <hch@lst.de>
fs/aio.c
include/linux/aio.h

index 1c383bb44b2dc26bf32f41b6553c82ccbbe44376..50a90e5581ed72013122968d796f1ef83dfbdc57 100644 (file)
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -46,6 +46,8 @@
 
 #include "internal.h"
 
+#define KIOCB_KEY              0
+
 #define AIO_RING_MAGIC                 0xa10a10a1
 #define AIO_RING_COMPAT_FEATURES       1
 #define AIO_RING_INCOMPAT_FEATURES     0
@@ -1811,15 +1813,12 @@ COMPAT_SYSCALL_DEFINE3(io_submit, compat_aio_context_t, ctx_id,
  *     Finds a given iocb for cancellation.
  */
 static struct aio_kiocb *
-lookup_kiocb(struct kioctx *ctx, struct iocb __user *iocb, u32 key)
+lookup_kiocb(struct kioctx *ctx, struct iocb __user *iocb)
 {
        struct aio_kiocb *kiocb;
 
        assert_spin_locked(&ctx->ctx_lock);
 
-       if (key != KIOCB_KEY)
-               return NULL;
-
        /* TODO: use a hash or array, this sucks. */
        list_for_each_entry(kiocb, &ctx->active_reqs, ki_list) {
                if (kiocb->ki_user_iocb == iocb)
@@ -1846,9 +1845,10 @@ SYSCALL_DEFINE3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb,
        u32 key;
        int ret;
 
-       ret = get_user(key, &iocb->aio_key);
-       if (unlikely(ret))
+       if (unlikely(get_user(key, &iocb->aio_key)))
                return -EFAULT;
+       if (unlikely(key != KIOCB_KEY))
+               return -EINVAL;
 
        ctx = lookup_ioctx(ctx_id);
        if (unlikely(!ctx))
@@ -1856,7 +1856,7 @@ SYSCALL_DEFINE3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb,
 
        spin_lock_irq(&ctx->ctx_lock);
 
-       kiocb = lookup_kiocb(ctx, iocb, key);
+       kiocb = lookup_kiocb(ctx, iocb);
        if (kiocb)
                ret = kiocb_cancel(kiocb);
        else
index 9d8aabecfe2d40634352ee3729b26da4c760a670..b83e68dd006f1ea8aa4f740163c903bc05db2d1c 100644 (file)
@@ -8,8 +8,6 @@ struct kioctx;
 struct kiocb;
 struct mm_struct;
 
-#define KIOCB_KEY              0
-
 typedef int (kiocb_cancel_fn)(struct kiocb *);
 
 /* prototypes */