aboutsummaryrefslogtreecommitdiffstats
path: root/fs/aio.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2015-04-15 16:22:56 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2015-04-15 16:22:56 -0400
commitfa927894bbb4a4c7669c72bad1924991022fda38 (patch)
tree93560f1a096973235fe9ff50c436f5239c1c499a /fs/aio.c
parentc841e12add6926d64aa608687893465330b5a03e (diff)
parent8436318205b9f29e45db88850ec60e326327e241 (diff)
Merge branch 'for-linus-2' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull second vfs update from Al Viro: "Now that net-next went in... Here's the next big chunk - killing ->aio_read() and ->aio_write(). There'll be one more pile today (direct_IO changes and generic_write_checks() cleanups/fixes), but I'd prefer to keep that one separate" * 'for-linus-2' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (37 commits) ->aio_read and ->aio_write removed pcm: another weird API abuse infinibad: weird APIs switched to ->write_iter() kill do_sync_read/do_sync_write fuse: use iov_iter_get_pages() for non-splice path fuse: switch to ->read_iter/->write_iter switch drivers/char/mem.c to ->read_iter/->write_iter make new_sync_{read,write}() static coredump: accept any write method switch /dev/loop to vfs_iter_write() serial2002: switch to __vfs_read/__vfs_write ashmem: use __vfs_read() export __vfs_read() autofs: switch to __vfs_write() new helper: __vfs_write() switch hugetlbfs to ->read_iter() coda: switch to ->read_iter/->write_iter ncpfs: switch to ->read_iter/->write_iter net/9p: remove (now-)unused helpers p9_client_attach(): set fid->uid correctly ...
Diffstat (limited to 'fs/aio.c')
-rw-r--r--fs/aio.c23
1 files changed, 3 insertions, 20 deletions
diff --git a/fs/aio.c b/fs/aio.c
index 1ab60010cf6c..5785c4b58fea 100644
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -692,8 +692,7 @@ static struct kioctx *ioctx_alloc(unsigned nr_events)
692 nr_events *= 2; 692 nr_events *= 2;
693 693
694 /* Prevent overflows */ 694 /* Prevent overflows */
695 if ((nr_events > (0x10000000U / sizeof(struct io_event))) || 695 if (nr_events > (0x10000000U / sizeof(struct io_event))) {
696 (nr_events > (0x10000000U / sizeof(struct kiocb)))) {
697 pr_debug("ENOMEM: nr_events too high\n"); 696 pr_debug("ENOMEM: nr_events too high\n");
698 return ERR_PTR(-EINVAL); 697 return ERR_PTR(-EINVAL);
699 } 698 }
@@ -1356,8 +1355,6 @@ SYSCALL_DEFINE1(io_destroy, aio_context_t, ctx)
1356 return -EINVAL; 1355 return -EINVAL;
1357} 1356}
1358 1357
1359typedef ssize_t (aio_rw_op)(struct kiocb *, const struct iovec *,
1360 unsigned long, loff_t);
1361typedef ssize_t (rw_iter_op)(struct kiocb *, struct iov_iter *); 1358typedef ssize_t (rw_iter_op)(struct kiocb *, struct iov_iter *);
1362 1359
1363static int aio_setup_vectored_rw(int rw, char __user *buf, size_t len, 1360static int aio_setup_vectored_rw(int rw, char __user *buf, size_t len,
@@ -1386,7 +1383,6 @@ static ssize_t aio_run_iocb(struct kiocb *req, unsigned opcode,
1386 ssize_t ret; 1383 ssize_t ret;
1387 int rw; 1384 int rw;
1388 fmode_t mode; 1385 fmode_t mode;
1389 aio_rw_op *rw_op;
1390 rw_iter_op *iter_op; 1386 rw_iter_op *iter_op;
1391 struct iovec inline_vecs[UIO_FASTIOV], *iovec = inline_vecs; 1387 struct iovec inline_vecs[UIO_FASTIOV], *iovec = inline_vecs;
1392 struct iov_iter iter; 1388 struct iov_iter iter;
@@ -1396,7 +1392,6 @@ static ssize_t aio_run_iocb(struct kiocb *req, unsigned opcode,
1396 case IOCB_CMD_PREADV: 1392 case IOCB_CMD_PREADV:
1397 mode = FMODE_READ; 1393 mode = FMODE_READ;
1398 rw = READ; 1394 rw = READ;
1399 rw_op = file->f_op->aio_read;
1400 iter_op = file->f_op->read_iter; 1395 iter_op = file->f_op->read_iter;
1401 goto rw_common; 1396 goto rw_common;
1402 1397
@@ -1404,14 +1399,13 @@ static ssize_t aio_run_iocb(struct kiocb *req, unsigned opcode,
1404 case IOCB_CMD_PWRITEV: 1399 case IOCB_CMD_PWRITEV:
1405 mode = FMODE_WRITE; 1400 mode = FMODE_WRITE;
1406 rw = WRITE; 1401 rw = WRITE;
1407 rw_op = file->f_op->aio_write;
1408 iter_op = file->f_op->write_iter; 1402 iter_op = file->f_op->write_iter;
1409 goto rw_common; 1403 goto rw_common;
1410rw_common: 1404rw_common:
1411 if (unlikely(!(file->f_mode & mode))) 1405 if (unlikely(!(file->f_mode & mode)))
1412 return -EBADF; 1406 return -EBADF;
1413 1407
1414 if (!rw_op && !iter_op) 1408 if (!iter_op)
1415 return -EINVAL; 1409 return -EINVAL;
1416 1410
1417 if (opcode == IOCB_CMD_PREADV || opcode == IOCB_CMD_PWRITEV) 1411 if (opcode == IOCB_CMD_PREADV || opcode == IOCB_CMD_PWRITEV)
@@ -1431,21 +1425,10 @@ rw_common:
1431 1425
1432 len = ret; 1426 len = ret;
1433 1427
1434 /* XXX: move/kill - rw_verify_area()? */
1435 /* This matches the pread()/pwrite() logic */
1436 if (req->ki_pos < 0) {
1437 ret = -EINVAL;
1438 break;
1439 }
1440
1441 if (rw == WRITE) 1428 if (rw == WRITE)
1442 file_start_write(file); 1429 file_start_write(file);
1443 1430
1444 if (iter_op) { 1431 ret = iter_op(req, &iter);
1445 ret = iter_op(req, &iter);
1446 } else {
1447 ret = rw_op(req, iter.iov, iter.nr_segs, req->ki_pos);
1448 }
1449 1432
1450 if (rw == WRITE) 1433 if (rw == WRITE)
1451 file_end_write(file); 1434 file_end_write(file);