]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/4.9.68/mm-avoid-returning-vm_fault_retry-from-page_mkwrite-handlers.patch
4.9-stable patches
[thirdparty/kernel/stable-queue.git] / releases / 4.9.68 / mm-avoid-returning-vm_fault_retry-from-page_mkwrite-handlers.patch
CommitLineData
95244f99
GKH
1From foo@baz Wed Dec 6 17:39:55 CET 2017
2From: Jan Kara <jack@suse.cz>
3Date: Wed, 8 Feb 2017 14:30:53 -0800
4Subject: mm: avoid returning VM_FAULT_RETRY from ->page_mkwrite handlers
5
6From: Jan Kara <jack@suse.cz>
7
8
9[ Upstream commit 0911d0041c22922228ca52a977d7b0b0159fee4b ]
10
11Some ->page_mkwrite handlers may return VM_FAULT_RETRY as its return
12code (GFS2 or Lustre can definitely do this). However VM_FAULT_RETRY
13from ->page_mkwrite is completely unhandled by the mm code and results
14in locking and writeably mapping the page which definitely is not what
15the caller wanted.
16
17Fix Lustre and block_page_mkwrite_ret() used by other filesystems
18(notably GFS2) to return VM_FAULT_NOPAGE instead which results in
19bailing out from the fault code, the CPU then retries the access, and we
20fault again effectively doing what the handler wanted.
21
22Link: http://lkml.kernel.org/r/20170203150729.15863-1-jack@suse.cz
23Signed-off-by: Jan Kara <jack@suse.cz>
24Reported-by: Al Viro <viro@ZenIV.linux.org.uk>
25Reviewed-by: Jinshan Xiong <jinshan.xiong@intel.com>
26Cc: Matthew Wilcox <willy@infradead.org>
27Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
28Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
29Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
30Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
31---
32 drivers/staging/lustre/lustre/llite/llite_mmap.c | 4 +---
33 include/linux/buffer_head.h | 4 +---
34 2 files changed, 2 insertions(+), 6 deletions(-)
35
36--- a/drivers/staging/lustre/lustre/llite/llite_mmap.c
37+++ b/drivers/staging/lustre/lustre/llite/llite_mmap.c
38@@ -401,15 +401,13 @@ static int ll_page_mkwrite(struct vm_are
39 result = VM_FAULT_LOCKED;
40 break;
41 case -ENODATA:
42+ case -EAGAIN:
43 case -EFAULT:
44 result = VM_FAULT_NOPAGE;
45 break;
46 case -ENOMEM:
47 result = VM_FAULT_OOM;
48 break;
49- case -EAGAIN:
50- result = VM_FAULT_RETRY;
51- break;
52 default:
53 result = VM_FAULT_SIGBUS;
54 break;
55--- a/include/linux/buffer_head.h
56+++ b/include/linux/buffer_head.h
57@@ -239,12 +239,10 @@ static inline int block_page_mkwrite_ret
58 {
59 if (err == 0)
60 return VM_FAULT_LOCKED;
61- if (err == -EFAULT)
62+ if (err == -EFAULT || err == -EAGAIN)
63 return VM_FAULT_NOPAGE;
64 if (err == -ENOMEM)
65 return VM_FAULT_OOM;
66- if (err == -EAGAIN)
67- return VM_FAULT_RETRY;
68 /* -ENOSPC, -EDQUOT, -EIO ... */
69 return VM_FAULT_SIGBUS;
70 }