Commit 26978b8b4d83c46f4310b253db70fa9e65149e7c

Authored by Al Viro
1 parent 31b140398c

give ->direct_IO() a copy of iov_iter

the thing is, we want to advance what's given to ->direct_IO() as we
are forming the request; however, the callers care about the amount
of data actually transferred, not the amount we tried to transfer.
It's more convenient to allow ->direct_IO() instances do use
iov_iter_advance() on the copy of iov_iter, leaving the actual
advancing of the original to caller.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

Showing 1 changed file with 7 additions and 3 deletions Side-by-side Diff

... ... @@ -1699,8 +1699,10 @@
1699 1699 size = i_size_read(inode);
1700 1700 retval = filemap_write_and_wait_range(mapping, pos,
1701 1701 pos + count - 1);
1702   - if (!retval)
1703   - retval = mapping->a_ops->direct_IO(READ, iocb, &i, pos);
  1702 + if (!retval) {
  1703 + struct iov_iter data = i;
  1704 + retval = mapping->a_ops->direct_IO(READ, iocb, &data, pos);
  1705 + }
1704 1706  
1705 1707 if (retval > 0) {
1706 1708 *ppos = pos + retval;
... ... @@ -2351,6 +2353,7 @@
2351 2353 ssize_t written;
2352 2354 size_t write_len;
2353 2355 pgoff_t end;
  2356 + struct iov_iter data;
2354 2357  
2355 2358 if (count != ocount)
2356 2359 from->nr_segs = iov_shorten((struct iovec *)from->iov, from->nr_segs, count);
... ... @@ -2382,7 +2385,8 @@
2382 2385 }
2383 2386 }
2384 2387  
2385   - written = mapping->a_ops->direct_IO(WRITE, iocb, from, pos);
  2388 + data = *from;
  2389 + written = mapping->a_ops->direct_IO(WRITE, iocb, &data, pos);
2386 2390  
2387 2391 /*
2388 2392 * Finally, try again to invalidate clean pages which might have been