diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-04-15 16:22:56 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-04-15 16:22:56 -0400 |
commit | fa927894bbb4a4c7669c72bad1924991022fda38 (patch) | |
tree | 93560f1a096973235fe9ff50c436f5239c1c499a /fs/aio.c | |
parent | c841e12add6926d64aa608687893465330b5a03e (diff) | |
parent | 8436318205b9f29e45db88850ec60e326327e241 (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.c | 23 |
1 files changed, 3 insertions, 20 deletions
@@ -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 | ||
1359 | typedef ssize_t (aio_rw_op)(struct kiocb *, const struct iovec *, | ||
1360 | unsigned long, loff_t); | ||
1361 | typedef ssize_t (rw_iter_op)(struct kiocb *, struct iov_iter *); | 1358 | typedef ssize_t (rw_iter_op)(struct kiocb *, struct iov_iter *); |
1362 | 1359 | ||
1363 | static int aio_setup_vectored_rw(int rw, char __user *buf, size_t len, | 1360 | static 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; |
1410 | rw_common: | 1404 | rw_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); |