We just need to make sure f2fs_filemap_fault() doesn't block in the speculative case as it is called with an rcu read lock held. Signed-off-by: Michel Lespinasse <michel@xxxxxxxxxxxxxx> --- fs/f2fs/file.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index d26ff2ae3f5e..c1cfdc3ec98e 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -37,7 +37,12 @@ static vm_fault_t f2fs_filemap_fault(struct vm_fault *vmf) struct inode *inode = file_inode(vmf->vma->vm_file); vm_fault_t ret; - down_read(&F2FS_I(inode)->i_mmap_sem); + if (vmf->flags & FAULT_FLAG_SPECULATIVE) { + if (!down_read_trylock(&F2FS_I(inode)->i_mmap_sem)) + return VM_FAULT_RETRY; + } else { + down_read(&F2FS_I(inode)->i_mmap_sem); + } ret = filemap_fault(vmf); up_read(&F2FS_I(inode)->i_mmap_sem); @@ -171,6 +176,7 @@ static const struct vm_operations_struct f2fs_file_vm_ops = { .fault = f2fs_filemap_fault, .map_pages = filemap_map_pages, .page_mkwrite = f2fs_vm_page_mkwrite, + .speculative = true, }; static int get_parent_ino(struct inode *inode, nid_t *pino) -- 2.20.1