Commit 26978b8b4d83c46f4310b253db70fa9e65149e7c
1 parent
31b140398c
Exists in
ti-lsk-linux-4.1.y
and in
10 other branches
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
mm/filemap.c
... | ... | @@ -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 |