mirror of
				https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
				synced 2025-10-31 18:53:24 +00:00 
			
		
		
		
	 4b19de6d1c
			
		
	
	
		4b19de6d1c
		
	
	
	
	
		
			
			The previous patch db203d53d4 ("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>
		
	
			
		
			
				
	
	
		
			24 lines
		
	
	
		
			784 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			24 lines
		
	
	
		
			784 B
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef _LINUX_RAMFS_H
 | |
| #define _LINUX_RAMFS_H
 | |
| 
 | |
| struct inode *ramfs_get_inode(struct super_block *sb, int mode, dev_t dev);
 | |
| extern int ramfs_get_sb(struct file_system_type *fs_type,
 | |
| 	 int flags, const char *dev_name, void *data, struct vfsmount *mnt);
 | |
| 
 | |
| #ifndef CONFIG_MMU
 | |
| extern int ramfs_nommu_expand_for_mapping(struct inode *inode, size_t newsize);
 | |
| extern unsigned long ramfs_nommu_get_unmapped_area(struct file *file,
 | |
| 						   unsigned long addr,
 | |
| 						   unsigned long len,
 | |
| 						   unsigned long pgoff,
 | |
| 						   unsigned long flags);
 | |
| 
 | |
| extern int ramfs_nommu_mmap(struct file *file, struct vm_area_struct *vma);
 | |
| #endif
 | |
| 
 | |
| extern const struct file_operations ramfs_file_operations;
 | |
| extern struct vm_operations_struct generic_file_vm_ops;
 | |
| extern int __init init_rootfs(void);
 | |
| 
 | |
| #endif
 |