diff options
author | Nick Piggin <npiggin@suse.de> | 2008-02-06 04:37:34 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-02-06 13:41:07 -0500 |
commit | a1e096129bff79ae551592539bef19bfb5c9efa1 (patch) | |
tree | a9a2058040b8fcae937f2bfb97fbb50a0a5c103c /kernel | |
parent | f2df3f65d0b4337cfb5b19eab3ee28b177427c49 (diff) |
relay: nopage
Convert relay from nopage to fault.
Remove redundant vma range checks.
Switch from OOM to SIGBUS if the resource is not available.
Signed-off-by: Nick Piggin <npiggin@suse.de>
Cc: Tom Zanussi <zanussi@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/relay.c | 24 |
1 files changed, 9 insertions, 15 deletions
diff --git a/kernel/relay.c b/kernel/relay.c index 7c0373322f18..d080b9d161a7 100644 --- a/kernel/relay.c +++ b/kernel/relay.c | |||
@@ -37,37 +37,31 @@ static void relay_file_mmap_close(struct vm_area_struct *vma) | |||
37 | } | 37 | } |
38 | 38 | ||
39 | /* | 39 | /* |
40 | * nopage() vm_op implementation for relay file mapping. | 40 | * fault() vm_op implementation for relay file mapping. |
41 | */ | 41 | */ |
42 | static struct page *relay_buf_nopage(struct vm_area_struct *vma, | 42 | static int relay_buf_fault(struct vm_area_struct *vma, struct vm_fault *vmf) |
43 | unsigned long address, | ||
44 | int *type) | ||
45 | { | 43 | { |
46 | struct page *page; | 44 | struct page *page; |
47 | struct rchan_buf *buf = vma->vm_private_data; | 45 | struct rchan_buf *buf = vma->vm_private_data; |
48 | unsigned long offset = address - vma->vm_start; | 46 | pgoff_t pgoff = vmf->pgoff; |
49 | 47 | ||
50 | if (address > vma->vm_end) | ||
51 | return NOPAGE_SIGBUS; /* Disallow mremap */ | ||
52 | if (!buf) | 48 | if (!buf) |
53 | return NOPAGE_OOM; | 49 | return VM_FAULT_OOM; |
54 | 50 | ||
55 | page = vmalloc_to_page(buf->start + offset); | 51 | page = vmalloc_to_page(buf->start + (pgoff << PAGE_SHIFT)); |
56 | if (!page) | 52 | if (!page) |
57 | return NOPAGE_OOM; | 53 | return VM_FAULT_SIGBUS; |
58 | get_page(page); | 54 | get_page(page); |
55 | vmf->page = page; | ||
59 | 56 | ||
60 | if (type) | 57 | return 0; |
61 | *type = VM_FAULT_MINOR; | ||
62 | |||
63 | return page; | ||
64 | } | 58 | } |
65 | 59 | ||
66 | /* | 60 | /* |
67 | * vm_ops for relay file mappings. | 61 | * vm_ops for relay file mappings. |
68 | */ | 62 | */ |
69 | static struct vm_operations_struct relay_file_mmap_ops = { | 63 | static struct vm_operations_struct relay_file_mmap_ops = { |
70 | .nopage = relay_buf_nopage, | 64 | .fault = relay_buf_fault, |
71 | .close = relay_file_mmap_close, | 65 | .close = relay_file_mmap_close, |
72 | }; | 66 | }; |
73 | 67 | ||