mirror of
				https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
				synced 2025-10-31 00:01:35 +00:00 
			
		
		
		
	 562787a5c3
			
		
	
	
		562787a5c3
		
	
	
	
	
		
			
			Split the anonfd interface into a bare file pointer creation one, and a file pointer creation plus install one. There are cases, like the usage of eventfds inside other kernel interfaces, where the file pointer created by anonfd needs to be used inside the initialization of other structures. As it is right now, as soon as anon_inode_getfd() returns, the kenrle can race with userspace closing the newly installed file descriptor. This patch, while keeping the old anon_inode_getfd(), introduces a new anon_inode_getfile() (whose services are reused in anon_inode_getfd()) that allows to split the file creation phase and the fd install one. Once all the kernel structures are initialized, the code can call the proper fd_install(). Gregory manifested the need for something like this inside KVM. Signed-off-by: Davide Libenzi <davidel@xmailserver.org> Cc: Alexander Viro <viro@zeniv.linux.org.uk> Cc: James Morris <jmorris@namei.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Gregory Haskins <ghaskins@novell.com> Acked-by: Serge Hallyn <serue@us.ibm.com> Acked-by: Roland Dreier <rolandd@cisco.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
		
			
				
	
	
		
			19 lines
		
	
	
		
			430 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			19 lines
		
	
	
		
			430 B
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  *  include/linux/anon_inodes.h
 | |
|  *
 | |
|  *  Copyright (C) 2007  Davide Libenzi <davidel@xmailserver.org>
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #ifndef _LINUX_ANON_INODES_H
 | |
| #define _LINUX_ANON_INODES_H
 | |
| 
 | |
| struct file *anon_inode_getfile(const char *name,
 | |
| 				const struct file_operations *fops,
 | |
| 				void *priv, int flags);
 | |
| int anon_inode_getfd(const char *name, const struct file_operations *fops,
 | |
| 		     void *priv, int flags);
 | |
| 
 | |
| #endif /* _LINUX_ANON_INODES_H */
 | |
| 
 |