aboutsummaryrefslogtreecommitdiffstats
path: root/mm/tiny-shmem.c
diff options
context:
space:
mode:
authorNick Piggin <npiggin@suse.de>2008-10-02 17:50:16 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-10-02 18:53:13 -0400
commit4b19de6d1cb07c8bcb6778e771f9cfd5bcfdfd3e (patch)
tree3c570060d915cb1e140fbdbbfb4a9efde26a37ff /mm/tiny-shmem.c
parent6c1b7f680dd4f550fa6f91f148cc6fa2c4bd0737 (diff)
mm: tiny-shmem nommu fix
The previous patch db203d53d474aa068984e409d807628f5841da1b ("mm: tiny-shmem fix lock ordering: mmap_sem vs i_mutex") to fix the lock ordering in tiny-shmem breaks shared anonymous and IPC memory on NOMMU architectures because it was using the expanding truncate to signal ramfs to allocate a physically contiguous RAM backing the inode (otherwise it is unusable for "memory mapping" it to userspace). However do_truncate is what caused the lock ordering error, due to it taking i_mutex. In this case, we can actually just call ramfs directly to allocate memory for the mapping, rather than go via truncate. Acked-by: David Howells <dhowells@redhat.com> Acked-by: Hugh Dickins <hugh@veritas.com> Signed-off-by: Nick Piggin <npiggin@suse.de> Cc: Matt Mackall <mpm@selenic.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/tiny-shmem.c')
-rw-r--r--mm/tiny-shmem.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/mm/tiny-shmem.c b/mm/tiny-shmem.c
index d17cb6f6ab10..8d7a27a6335c 100644
--- a/mm/tiny-shmem.c
+++ b/mm/tiny-shmem.c
@@ -80,6 +80,12 @@ struct file *shmem_file_setup(char *name, loff_t size, unsigned long flags)
80 inode->i_nlink = 0; /* It is unlinked */ 80 inode->i_nlink = 0; /* It is unlinked */
81 init_file(file, shm_mnt, dentry, FMODE_WRITE | FMODE_READ, 81 init_file(file, shm_mnt, dentry, FMODE_WRITE | FMODE_READ,
82 &ramfs_file_operations); 82 &ramfs_file_operations);
83
84#ifndef CONFIG_MMU
85 error = ramfs_nommu_expand_for_mapping(inode, size);
86 if (error)
87 goto close_file;
88#endif
83 return file; 89 return file;
84 90
85close_file: 91close_file: