Skip to content

Commit 4c185ce

Browse files
author
Al Viro
committed
aio: lift iov_iter_init() into aio_setup_..._rw()
the only non-trivial detail is that we do it before rw_verify_area(), so we'd better cap the length ourselves in aio_setup_single_rw() case (for vectored case rw_copy_check_uvector() will do that for us). Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
1 parent ac15ac0 commit 4c185ce

File tree

1 file changed

+11
-6
lines changed

1 file changed

+11
-6
lines changed

Diff for: fs/aio.c

+11-6
Original file line numberDiff line numberDiff line change
@@ -1357,7 +1357,8 @@ static ssize_t aio_setup_vectored_rw(struct kiocb *kiocb,
13571357
unsigned long *nr_segs,
13581358
size_t *len,
13591359
struct iovec **iovec,
1360-
bool compat)
1360+
bool compat,
1361+
struct iov_iter *iter)
13611362
{
13621363
ssize_t ret;
13631364

@@ -1378,21 +1379,26 @@ static ssize_t aio_setup_vectored_rw(struct kiocb *kiocb,
13781379

13791380
/* len now reflect bytes instead of segs */
13801381
*len = ret;
1382+
iov_iter_init(iter, rw, *iovec, *nr_segs, *len);
13811383
return 0;
13821384
}
13831385

13841386
static ssize_t aio_setup_single_vector(struct kiocb *kiocb,
13851387
int rw, char __user *buf,
13861388
unsigned long *nr_segs,
13871389
size_t len,
1388-
struct iovec *iovec)
1390+
struct iovec *iovec,
1391+
struct iov_iter *iter)
13891392
{
1393+
if (len > MAX_RW_COUNT)
1394+
len = MAX_RW_COUNT;
13901395
if (unlikely(!access_ok(!rw, buf, len)))
13911396
return -EFAULT;
13921397

13931398
iovec->iov_base = buf;
13941399
iovec->iov_len = len;
13951400
*nr_segs = 1;
1401+
iov_iter_init(iter, rw, iovec, *nr_segs, len);
13961402
return 0;
13971403
}
13981404

@@ -1438,10 +1444,10 @@ static ssize_t aio_run_iocb(struct kiocb *req, unsigned opcode,
14381444

14391445
if (opcode == IOCB_CMD_PREADV || opcode == IOCB_CMD_PWRITEV)
14401446
ret = aio_setup_vectored_rw(req, rw, buf, &nr_segs,
1441-
&len, &iovec, compat);
1447+
&len, &iovec, compat, &iter);
14421448
else
14431449
ret = aio_setup_single_vector(req, rw, buf, &nr_segs,
1444-
len, iovec);
1450+
len, iovec, &iter);
14451451
if (!ret)
14461452
ret = rw_verify_area(rw, file, &req->ki_pos, len);
14471453
if (ret < 0) {
@@ -1463,10 +1469,9 @@ static ssize_t aio_run_iocb(struct kiocb *req, unsigned opcode,
14631469
file_start_write(file);
14641470

14651471
if (iter_op) {
1466-
iov_iter_init(&iter, rw, iovec, nr_segs, len);
14671472
ret = iter_op(req, &iter);
14681473
} else {
1469-
ret = rw_op(req, iovec, nr_segs, req->ki_pos);
1474+
ret = rw_op(req, iter.iov, iter.nr_segs, req->ki_pos);
14701475
}
14711476

14721477
if (rw == WRITE)

0 commit comments

Comments
 (0)