From: Al Viro <viro@ZenIV.linux.org.uk> To: linux-fsdevel@vger.kernel.org Cc: Christoph Hellwig <hch@lst.de> Subject: Re: [PATCH 4/4] aio: fold do_io_submit() into callers Date: Mon, 28 May 2018 00:14:13 +0100 [thread overview] Message-ID: <20180527231413.GV30522@ZenIV.linux.org.uk> (raw) In-Reply-To: <20180527222853.30715-4-viro@ZenIV.linux.org.uk> and now with dumb braino fixed: aio: fold do_io_submit() into callers sanitize the limit checking and get rid of insane "copy array of 32bit pointers into an array of native ones" glue. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> --- diff --git a/fs/aio.c b/fs/aio.c index 29fa2f3c3cba..ef33944aed7c 100644 --- a/fs/aio.c +++ b/fs/aio.c @@ -1813,8 +1813,20 @@ static int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb, return ret; } -static long do_io_submit(aio_context_t ctx_id, long nr, - struct iocb __user *__user *iocbpp, bool compat) +/* sys_io_submit: + * Queue the nr iocbs pointed to by iocbpp for processing. Returns + * the number of iocbs queued. May return -EINVAL if the aio_context + * specified by ctx_id is invalid, if nr is < 0, if the iocb at + * *iocbpp[0] is not properly initialized, if the operation specified + * is invalid for the file descriptor in the iocb. May fail with + * -EFAULT if any of the data structures point to invalid data. May + * fail with -EBADF if the file descriptor specified in the first + * iocb is invalid. May fail with -EAGAIN if insufficient resources + * are available to queue any iocbs. Will return 0 if nr is 0. Will + * fail with -ENOSYS if not implemented. + */ +SYSCALL_DEFINE3(io_submit, aio_context_t, ctx_id, long, nr, + struct iocb __user * __user *, iocbpp) { struct kioctx *ctx; long ret = 0; @@ -1824,33 +1836,25 @@ static long do_io_submit(aio_context_t ctx_id, long nr, if (unlikely(nr < 0)) return -EINVAL; - if (unlikely(nr > LONG_MAX/sizeof(*iocbpp))) - nr = LONG_MAX/sizeof(*iocbpp); - - if (unlikely(!access_ok(VERIFY_READ, iocbpp, (nr*sizeof(*iocbpp))))) - return -EFAULT; - ctx = lookup_ioctx(ctx_id); if (unlikely(!ctx)) { pr_debug("EINVAL: invalid context id\n"); return -EINVAL; } - blk_start_plug(&plug); + if (nr > ctx->nr_events) + nr = ctx->nr_events; - /* - * AKPM: should this return a partial result if some of the IOs were - * successfully submitted? - */ - for (i=0; i<nr; i++) { + blk_start_plug(&plug); + for (i = 0; i < nr; i++) { struct iocb __user *user_iocb; - if (unlikely(__get_user(user_iocb, iocbpp + i))) { + if (unlikely(get_user(user_iocb, iocbpp + i))) { ret = -EFAULT; break; } - ret = io_submit_one(ctx, user_iocb, compat); + ret = io_submit_one(ctx, user_iocb, false); if (ret) break; } @@ -1860,59 +1864,45 @@ static long do_io_submit(aio_context_t ctx_id, long nr, return i ? i : ret; } -/* sys_io_submit: - * Queue the nr iocbs pointed to by iocbpp for processing. Returns - * the number of iocbs queued. May return -EINVAL if the aio_context - * specified by ctx_id is invalid, if nr is < 0, if the iocb at - * *iocbpp[0] is not properly initialized, if the operation specified - * is invalid for the file descriptor in the iocb. May fail with - * -EFAULT if any of the data structures point to invalid data. May - * fail with -EBADF if the file descriptor specified in the first - * iocb is invalid. May fail with -EAGAIN if insufficient resources - * are available to queue any iocbs. Will return 0 if nr is 0. Will - * fail with -ENOSYS if not implemented. - */ -SYSCALL_DEFINE3(io_submit, aio_context_t, ctx_id, long, nr, - struct iocb __user * __user *, iocbpp) -{ - return do_io_submit(ctx_id, nr, iocbpp, 0); -} - #ifdef CONFIG_COMPAT -static inline long -copy_iocb(long nr, u32 __user *ptr32, struct iocb __user * __user *ptr64) -{ - compat_uptr_t uptr; - int i; - - for (i = 0; i < nr; ++i) { - if (get_user(uptr, ptr32 + i)) - return -EFAULT; - if (put_user(compat_ptr(uptr), ptr64 + i)) - return -EFAULT; - } - return 0; -} - -#define MAX_AIO_SUBMITS (PAGE_SIZE/sizeof(struct iocb *)) COMPAT_SYSCALL_DEFINE3(io_submit, compat_aio_context_t, ctx_id, - int, nr, u32 __user *, iocb) + int, nr, compat_uptr_t __user *, iocbpp) { - struct iocb __user * __user *iocb64; - long ret; + struct kioctx *ctx; + long ret = 0; + int i = 0; + struct blk_plug plug; if (unlikely(nr < 0)) return -EINVAL; - if (nr > MAX_AIO_SUBMITS) - nr = MAX_AIO_SUBMITS; + ctx = lookup_ioctx(ctx_id); + if (unlikely(!ctx)) { + pr_debug("EINVAL: invalid context id\n"); + return -EINVAL; + } + + if (nr > ctx->nr_events) + nr = ctx->nr_events; - iocb64 = compat_alloc_user_space(nr * sizeof(*iocb64)); - ret = copy_iocb(nr, iocb, iocb64); - if (!ret) - ret = do_io_submit(ctx_id, nr, iocb64, 1); - return ret; + blk_start_plug(&plug); + for (i = 0; i < nr; i++) { + compat_uptr_t user_iocb; + + if (unlikely(get_user(user_iocb, iocbpp + i))) { + ret = -EFAULT; + break; + } + + ret = io_submit_one(ctx, compat_ptr(user_iocb), true); + if (ret) + break; + } + blk_finish_plug(&plug); + + percpu_ref_put(&ctx->users); + return i ? i : ret; } #endif
next prev parent reply other threads:[~2018-05-27 23:14 UTC|newest] Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-05-23 19:19 aio poll and a new in-kernel poll API V13 Christoph Hellwig 2018-05-23 19:19 ` [PATCH 01/33] fix io_destroy()/aio_complete() race Christoph Hellwig 2018-05-23 19:19 ` [PATCH 02/33] uapi: turn __poll_t sparse checkin on by default Christoph Hellwig 2018-05-23 19:19 ` [PATCH 03/33] fs: unexport poll_schedule_timeout Christoph Hellwig 2018-05-23 19:19 ` [PATCH 04/33] fs: cleanup do_pollfd Christoph Hellwig 2018-05-23 19:19 ` [PATCH 05/33] fs: update documentation to mention __poll_t and match the code Christoph Hellwig 2018-05-23 19:19 ` [PATCH 06/33] fs: add new vfs_poll and file_can_poll helpers Christoph Hellwig 2018-05-23 19:19 ` [PATCH 07/33] fs: introduce new ->get_poll_head and ->poll_mask methods Christoph Hellwig 2018-05-23 19:19 ` [PATCH 08/33] aio: simplify KIOCB_KEY handling Christoph Hellwig 2018-05-23 19:19 ` [PATCH 09/33] aio: simplify cancellation Christoph Hellwig 2018-05-23 19:19 ` [PATCH 10/33] aio: implement IOCB_CMD_POLL Christoph Hellwig 2018-05-23 19:20 ` [PATCH 11/33] aio: try to complete poll iocbs without context switch Christoph Hellwig 2018-05-23 19:20 ` [PATCH 12/33] net: refactor socket_poll Christoph Hellwig 2018-05-23 19:20 ` [PATCH 13/33] net: add support for ->poll_mask in proto_ops Christoph Hellwig 2018-05-23 19:20 ` [PATCH 14/33] net: remove sock_no_poll Christoph Hellwig 2018-05-23 19:20 ` [PATCH 15/33] net/tcp: convert to ->poll_mask Christoph Hellwig 2018-05-23 19:20 ` [PATCH 16/33] net/unix: " Christoph Hellwig 2018-05-23 19:20 ` [PATCH 17/33] net: convert datagram_poll users tp ->poll_mask Christoph Hellwig 2018-05-23 19:20 ` [PATCH 18/33] net/dccp: convert to ->poll_mask Christoph Hellwig 2018-05-23 19:20 ` [PATCH 19/33] net/atm: " Christoph Hellwig 2018-05-23 19:20 ` [PATCH 20/33] net/vmw_vsock: " Christoph Hellwig 2018-05-23 19:20 ` [PATCH 21/33] net/tipc: " Christoph Hellwig 2018-05-23 19:20 ` [PATCH 22/33] net/sctp: " Christoph Hellwig 2018-05-23 19:20 ` [PATCH 23/33] net/bluetooth: " Christoph Hellwig 2018-05-23 19:20 ` [PATCH 24/33] net/caif: " Christoph Hellwig 2018-05-23 19:20 ` [PATCH 25/33] net/nfc: " Christoph Hellwig 2018-05-23 19:20 ` [PATCH 26/33] net/phonet: " Christoph Hellwig 2018-05-23 19:20 ` [PATCH 27/33] net/iucv: " Christoph Hellwig 2018-05-23 19:20 ` [PATCH 28/33] net/rxrpc: " Christoph Hellwig 2018-05-23 19:20 ` [PATCH 29/33] crypto: af_alg: " Christoph Hellwig 2018-05-23 19:20 ` [PATCH 30/33] pipe: " Christoph Hellwig 2018-05-23 19:20 ` [PATCH 31/33] eventfd: switch " Christoph Hellwig 2018-05-23 19:20 ` [PATCH 32/33] timerfd: convert " Christoph Hellwig 2018-05-23 19:20 ` [PATCH 33/33] random: " Christoph Hellwig 2018-05-26 0:11 ` aio poll and a new in-kernel poll API V13 Al Viro 2018-05-26 7:09 ` Al Viro 2018-05-26 7:23 ` Christoph Hellwig 2018-05-27 22:27 ` Al Viro 2018-05-27 22:28 ` [PATCH 1/4] aio: all callers of aio_{read,write,fsync,poll} treat 0 and -EIOCBQUEUED the same way Al Viro 2018-05-27 22:28 ` [PATCH 2/4] aio_read_events_ring(): make a bit more readable Al Viro 2018-05-27 22:28 ` [PATCH 3/4] aio: shift copyin of iocb into io_submit_one() Al Viro 2018-05-28 5:16 ` Christoph Hellwig 2018-05-27 22:28 ` [PATCH 4/4] aio: fold do_io_submit() into callers Al Viro 2018-05-27 23:14 ` Al Viro [this message] 2018-05-28 5:24 ` Christoph Hellwig 2018-05-28 5:15 ` [PATCH 1/4] aio: all callers of aio_{read,write,fsync,poll} treat 0 and -EIOCBQUEUED the same way Christoph Hellwig 2018-05-28 14:04 ` Al Viro 2018-05-28 17:54 ` Al Viro 2018-05-28 17:57 ` [PATCH v2 1/6] aio: take list removal to (some) callers of aio_complete() Al Viro 2018-05-28 17:57 ` [PATCH v2 2/6] aio: all callers of aio_{read,write,fsync,poll} treat 0 and -EIOCBQUEUED the same way Al Viro 2018-05-29 6:08 ` Christoph Hellwig 2018-05-28 17:57 ` [PATCH v2 3/6] aio_read_events_ring(): make a bit more readable Al Viro 2018-05-28 17:57 ` [PATCH v2 4/6] aio: shift copyin of iocb into io_submit_one() Al Viro 2018-05-28 17:57 ` [PATCH v2 5/6] aio: fold do_io_submit() into callers Al Viro 2018-05-29 6:10 ` Christoph Hellwig 2018-05-28 17:57 ` [PATCH v2 6/6] aio: sanitize the limit checking in io_submit(2) Al Viro 2018-05-29 6:10 ` Christoph Hellwig 2018-05-29 6:08 ` [PATCH v2 1/6] aio: take list removal to (some) callers of aio_complete() Christoph Hellwig 2018-05-28 22:20 ` [PATCH 1/4] vmsplice: lift import_iovec() into do_vmsplice() Al Viro 2018-05-28 22:20 ` [PATCH 2/4] vmsplice(): lift importing iovec into vmsplice(2) and compat counterpart Al Viro 2018-05-28 22:20 ` [PATCH 3/4] signalfd: lift sigmask copyin and size checks to callers of do_signalfd4() Al Viro 2018-05-28 22:20 ` [PATCH 4/4] orangefs: simplify compat ioctl handling Al Viro 2018-05-31 11:11 ` kbuild test robot 2018-05-31 20:54 ` Mike Marshall 2018-05-31 21:03 ` Al Viro 2018-06-01 21:13 ` Mike Marshall 2018-06-06 22:57 ` [1/4] vmsplice: lift import_iovec() into do_vmsplice() Andrei Vagin 2018-06-07 17:56 ` Andrei Vagin 2018-06-11 20:14 ` Cyrill Gorcunov 2018-06-11 20:16 ` Al Viro 2018-06-11 20:18 ` Cyrill Gorcunov 2018-06-14 22:22 ` Andrey Vagin
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20180527231413.GV30522@ZenIV.linux.org.uk \ --to=viro@zeniv.linux.org.uk \ --cc=hch@lst.de \ --cc=linux-fsdevel@vger.kernel.org \ --subject='Re: [PATCH 4/4] aio: fold do_io_submit() into callers' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).