Fix afs_launder_page() to set the starting position of the StoreData RPC at the offset into the page at which the modified data starts instead of at the beginning of the page (the iov_iter is correctly offset). The offset got lost during the conversion to passing an iov_iter into afs_store_data(). Changes: ver #2: - Use page_offset() rather than manually calculating it[1]. Fixes: bd80d8a80e12 ("afs: Use ITER_XARRAY for writing") Signed-off-by: David Howells <dhowells@xxxxxxxxxx> Reviewed-by: Jeffrey Altman <jaltman@xxxxxxxxxxxx> cc: linux-afs@xxxxxxxxxxxxxxxxxxx Link: https://lore.kernel.org/r/YST/0e92OdSH0zjg@xxxxxxxxxxxxxxxxxxxx/ [1] Link: https://lore.kernel.org/r/162880783179.3421678.7795105718190440134.stgit@xxxxxxxxxxxxxxxxxxxxxx/ Link: https://lore.kernel.org/r/162937512409.1449272.18441473411207824084.stgit@xxxxxxxxxxxxxxxxxxxxxx/ Link: https://lore.kernel.org/r/162981148752.1901565.3663780601682206026.stgit@xxxxxxxxxxxxxxxxxxxxxx/ --- fs/afs/write.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/fs/afs/write.c b/fs/afs/write.c index fb7d5c1cabde..5c977deeeee0 100644 --- a/fs/afs/write.c +++ b/fs/afs/write.c @@ -950,8 +950,7 @@ int afs_launder_page(struct page *page) iov_iter_bvec(&iter, WRITE, bv, 1, bv[0].bv_len); trace_afs_page_dirty(vnode, tracepoint_string("launder"), page); - ret = afs_store_data(vnode, &iter, (loff_t)page->index * PAGE_SIZE, - true); + ret = afs_store_data(vnode, &iter, page_offset(page) + f, true); } trace_afs_page_dirty(vnode, tracepoint_string("laundered"), page);