On Mon, Jun 3, 2019 at 4:22 PM Jan Kara jack@suse.cz wrote:
Some filesystems need to acquire locks before pages are read into page cache to protect from races with hole punching. The lock generally cannot be acquired within readpage as it ranks above page lock so we are left with acquiring the lock within filesystem's ->read_iter implementation for normal reads and ->fault implementation during page faults. That however does not cover all paths how pages can be instantiated within page cache - namely explicitely requested readahead. Add new ->readahead file operation which filesystem can use for this.
CC: stable@vger.kernel.org # Needed by following ext4 fix Signed-off-by: Jan Kara jack@suse.cz
include/linux/fs.h | 5 +++++ include/linux/mm.h | 3 --- mm/fadvise.c | 12 +----------- mm/madvise.c | 3 ++- mm/readahead.c | 26 ++++++++++++++++++++++++-- 5 files changed, 32 insertions(+), 17 deletions(-)
diff --git a/include/linux/fs.h b/include/linux/fs.h index f7fdfe93e25d..9968abcd06ea 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1828,6 +1828,7 @@ struct file_operations { struct file *file_out, loff_t pos_out, loff_t len, unsigned int remap_flags); int (*fadvise)(struct file *, loff_t, loff_t, int);
int (*readahead)(struct file *, loff_t, loff_t);
The new method is redundant, because it is a subset of fadvise. When overlayfs needed to implement both methods, Miklos suggested that we unite them into one, hence: 3d8f7615319b vfs: implement readahead(2) using POSIX_FADV_WILLNEED
So you can accomplish the ext4 fix without the new method. All you need extra is implementing madvise_willneed() with vfs_fadvise().
Thanks, Amir.