@@ -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
13841386static 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