aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/mm.h9
-rw-r--r--init/Kconfig1
-rw-r--r--ipc/shm.c18
-rw-r--r--mm/nommu.c7
-rw-r--r--mm/shmem.c2
-rw-r--r--mm/tiny-shmem.c29
6 files changed, 58 insertions, 8 deletions
diff --git a/include/linux/mm.h b/include/linux/mm.h
index 75ec04e2f184..26f3094911a5 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -654,9 +654,18 @@ static inline struct mempolicy *shmem_get_policy(struct vm_area_struct *vma,
654} 654}
655#endif 655#endif
656struct file *shmem_file_setup(char *name, loff_t size, unsigned long flags); 656struct file *shmem_file_setup(char *name, loff_t size, unsigned long flags);
657extern int shmem_mmap(struct file *file, struct vm_area_struct *vma);
657 658
658int shmem_zero_setup(struct vm_area_struct *); 659int shmem_zero_setup(struct vm_area_struct *);
659 660
661#ifndef CONFIG_MMU
662extern unsigned long shmem_get_unmapped_area(struct file *file,
663 unsigned long addr,
664 unsigned long len,
665 unsigned long pgoff,
666 unsigned long flags);
667#endif
668
660static inline int can_do_mlock(void) 669static inline int can_do_mlock(void)
661{ 670{
662 if (capable(CAP_IPC_LOCK)) 671 if (capable(CAP_IPC_LOCK))
diff --git a/init/Kconfig b/init/Kconfig
index ce737e02c5a2..24e0f7c756c0 100644
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -105,7 +105,6 @@ config SWAP
105 105
106config SYSVIPC 106config SYSVIPC
107 bool "System V IPC" 107 bool "System V IPC"
108 depends on MMU
109 ---help--- 108 ---help---
110 Inter Process Communication is a suite of library functions and 109 Inter Process Communication is a suite of library functions and
111 system calls which let processes (running programs) synchronize and 110 system calls which let processes (running programs) synchronize and
diff --git a/ipc/shm.c b/ipc/shm.c
index 587d836d80d9..0ef4a1cf3e27 100644
--- a/ipc/shm.c
+++ b/ipc/shm.c
@@ -157,14 +157,22 @@ static void shm_close (struct vm_area_struct *shmd)
157 157
158static int shm_mmap(struct file * file, struct vm_area_struct * vma) 158static int shm_mmap(struct file * file, struct vm_area_struct * vma)
159{ 159{
160 file_accessed(file); 160 int ret;
161 vma->vm_ops = &shm_vm_ops; 161
162 shm_inc(file->f_dentry->d_inode->i_ino); 162 ret = shmem_mmap(file, vma);
163 return 0; 163 if (ret == 0) {
164 vma->vm_ops = &shm_vm_ops;
165 shm_inc(file->f_dentry->d_inode->i_ino);
166 }
167
168 return ret;
164} 169}
165 170
166static struct file_operations shm_file_operations = { 171static struct file_operations shm_file_operations = {
167 .mmap = shm_mmap 172 .mmap = shm_mmap,
173#ifndef CONFIG_MMU
174 .get_unmapped_area = shmem_get_unmapped_area,
175#endif
168}; 176};
169 177
170static struct vm_operations_struct shm_vm_ops = { 178static struct vm_operations_struct shm_vm_ops = {
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
1181struct 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
1273static int shmem_mmap(struct file *file, struct vm_area_struct *vma) 1273int 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
93close_file: 99close_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
133int 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
144unsigned 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