diff options
author | David Howells <dhowells@redhat.com> | 2006-01-06 03:11:42 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-01-06 11:33:32 -0500 |
commit | b0e15190ead07056ab0c3844a499ff35e66d27cc (patch) | |
tree | 0601a8d68fa051a7ee85d22640e982c0a64f0efc /mm | |
parent | 642fb4d1f1dd2417aa69189fe5ceb81e4fb72900 (diff) |
[PATCH] NOMMU: Make SYSV IPC SHM use ramfs facilities on NOMMU
The attached patch makes the SYSV IPC shared memory facilities use the new
ramfs facilities on a no-MMU kernel.
The following changes are made:
(1) There are now shmem_mmap() and shmem_get_unmapped_area() functions to
allow the IPC SHM facilities to commune with the tiny-shmem and shmem
code.
(2) ramfs files now need resizing using do_truncate() rather than by modifying
the inode size directly (see shmem_file_setup()). This causes ramfs to
attempt to bind a block of pages of sufficient size to the inode.
(3) CONFIG_SYSVIPC is no longer contingent on CONFIG_MMU.
Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'mm')
-rw-r--r-- | mm/nommu.c | 7 | ||||
-rw-r--r-- | mm/shmem.c | 2 | ||||
-rw-r--r-- | mm/tiny-shmem.c | 29 |
3 files changed, 36 insertions, 2 deletions
diff --git a/mm/nommu.c b/mm/nommu.c index c1196812876b..c10262d68232 100644 --- a/mm/nommu.c +++ b/mm/nommu.c | |||
@@ -1177,3 +1177,10 @@ int in_gate_area_no_task(unsigned long addr) | |||
1177 | { | 1177 | { |
1178 | return 0; | 1178 | return 0; |
1179 | } | 1179 | } |
1180 | |||
1181 | struct page *filemap_nopage(struct vm_area_struct *area, | ||
1182 | unsigned long address, int *type) | ||
1183 | { | ||
1184 | BUG(); | ||
1185 | return NULL; | ||
1186 | } | ||
diff --git a/mm/shmem.c b/mm/shmem.c index 65c148efa2ed..a1f2f02af724 100644 --- a/mm/shmem.c +++ b/mm/shmem.c | |||
@@ -1270,7 +1270,7 @@ out_nomem: | |||
1270 | return retval; | 1270 | return retval; |
1271 | } | 1271 | } |
1272 | 1272 | ||
1273 | static int shmem_mmap(struct file *file, struct vm_area_struct *vma) | 1273 | int shmem_mmap(struct file *file, struct vm_area_struct *vma) |
1274 | { | 1274 | { |
1275 | file_accessed(file); | 1275 | file_accessed(file); |
1276 | vma->vm_ops = &shmem_vm_ops; | 1276 | vma->vm_ops = &shmem_vm_ops; |
diff --git a/mm/tiny-shmem.c b/mm/tiny-shmem.c index b58abcf44ed6..cdc6d431972b 100644 --- a/mm/tiny-shmem.c +++ b/mm/tiny-shmem.c | |||
@@ -81,13 +81,19 @@ struct file *shmem_file_setup(char *name, loff_t size, unsigned long flags) | |||
81 | goto close_file; | 81 | goto close_file; |
82 | 82 | ||
83 | d_instantiate(dentry, inode); | 83 | d_instantiate(dentry, inode); |
84 | inode->i_size = size; | ||
85 | inode->i_nlink = 0; /* It is unlinked */ | 84 | inode->i_nlink = 0; /* It is unlinked */ |
85 | |||
86 | file->f_vfsmnt = mntget(shm_mnt); | 86 | file->f_vfsmnt = mntget(shm_mnt); |
87 | file->f_dentry = dentry; | 87 | file->f_dentry = dentry; |
88 | file->f_mapping = inode->i_mapping; | 88 | file->f_mapping = inode->i_mapping; |
89 | file->f_op = &ramfs_file_operations; | 89 | file->f_op = &ramfs_file_operations; |
90 | file->f_mode = FMODE_WRITE | FMODE_READ; | 90 | file->f_mode = FMODE_WRITE | FMODE_READ; |
91 | |||
92 | /* notify everyone as to the change of file size */ | ||
93 | error = do_truncate(dentry, size, file); | ||
94 | if (error < 0) | ||
95 | goto close_file; | ||
96 | |||
91 | return file; | 97 | return file; |
92 | 98 | ||
93 | close_file: | 99 | close_file: |
@@ -123,3 +129,24 @@ int shmem_unuse(swp_entry_t entry, struct page *page) | |||
123 | { | 129 | { |
124 | return 0; | 130 | return 0; |
125 | } | 131 | } |
132 | |||
133 | int shmem_mmap(struct file *file, struct vm_area_struct *vma) | ||
134 | { | ||
135 | file_accessed(file); | ||
136 | #ifndef CONFIG_MMU | ||
137 | return ramfs_nommu_mmap(file, vma); | ||
138 | #else | ||
139 | return 0; | ||
140 | #endif | ||
141 | } | ||
142 | |||
143 | #ifndef CONFIG_MMU | ||
144 | unsigned long shmem_get_unmapped_area(struct file *file, | ||
145 | unsigned long addr, | ||
146 | unsigned long len, | ||
147 | unsigned long pgoff, | ||
148 | unsigned long flags) | ||
149 | { | ||
150 | return ramfs_nommu_get_unmapped_area(file, addr, len, pgoff, flags); | ||
151 | } | ||
152 | #endif | ||