diff options
Diffstat (limited to 'fs/ncpfs/mmap.c')
-rw-r--r-- | fs/ncpfs/mmap.c | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/fs/ncpfs/mmap.c b/fs/ncpfs/mmap.c index 5416673418b8..af48b792ca04 100644 --- a/fs/ncpfs/mmap.c +++ b/fs/ncpfs/mmap.c | |||
@@ -25,8 +25,8 @@ | |||
25 | /* | 25 | /* |
26 | * Fill in the supplied page for mmap | 26 | * Fill in the supplied page for mmap |
27 | */ | 27 | */ |
28 | static struct page* ncp_file_mmap_nopage(struct vm_area_struct *area, | 28 | static struct page* ncp_file_mmap_fault(struct vm_area_struct *area, |
29 | unsigned long address, int *type) | 29 | struct fault_data *fdata) |
30 | { | 30 | { |
31 | struct file *file = area->vm_file; | 31 | struct file *file = area->vm_file; |
32 | struct dentry *dentry = file->f_path.dentry; | 32 | struct dentry *dentry = file->f_path.dentry; |
@@ -40,15 +40,17 @@ static struct page* ncp_file_mmap_nopage(struct vm_area_struct *area, | |||
40 | 40 | ||
41 | page = alloc_page(GFP_HIGHUSER); /* ncpfs has nothing against high pages | 41 | page = alloc_page(GFP_HIGHUSER); /* ncpfs has nothing against high pages |
42 | as long as recvmsg and memset works on it */ | 42 | as long as recvmsg and memset works on it */ |
43 | if (!page) | 43 | if (!page) { |
44 | return page; | 44 | fdata->type = VM_FAULT_OOM; |
45 | return NULL; | ||
46 | } | ||
45 | pg_addr = kmap(page); | 47 | pg_addr = kmap(page); |
46 | address &= PAGE_MASK; | 48 | pos = fdata->pgoff << PAGE_SHIFT; |
47 | pos = address - area->vm_start + (area->vm_pgoff << PAGE_SHIFT); | ||
48 | 49 | ||
49 | count = PAGE_SIZE; | 50 | count = PAGE_SIZE; |
50 | if (address + PAGE_SIZE > area->vm_end) { | 51 | if (fdata->address + PAGE_SIZE > area->vm_end) { |
51 | count = area->vm_end - address; | 52 | WARN_ON(1); /* shouldn't happen? */ |
53 | count = area->vm_end - fdata->address; | ||
52 | } | 54 | } |
53 | /* what we can read in one go */ | 55 | /* what we can read in one go */ |
54 | bufsize = NCP_SERVER(inode)->buffer_size; | 56 | bufsize = NCP_SERVER(inode)->buffer_size; |
@@ -91,15 +93,14 @@ static struct page* ncp_file_mmap_nopage(struct vm_area_struct *area, | |||
91 | * fetches from the network, here the analogue of disk. | 93 | * fetches from the network, here the analogue of disk. |
92 | * -- wli | 94 | * -- wli |
93 | */ | 95 | */ |
94 | if (type) | 96 | fdata->type = VM_FAULT_MAJOR; |
95 | *type = VM_FAULT_MAJOR; | ||
96 | count_vm_event(PGMAJFAULT); | 97 | count_vm_event(PGMAJFAULT); |
97 | return page; | 98 | return page; |
98 | } | 99 | } |
99 | 100 | ||
100 | static struct vm_operations_struct ncp_file_mmap = | 101 | static struct vm_operations_struct ncp_file_mmap = |
101 | { | 102 | { |
102 | .nopage = ncp_file_mmap_nopage, | 103 | .fault = ncp_file_mmap_fault, |
103 | }; | 104 | }; |
104 | 105 | ||
105 | 106 | ||