mirror of
				https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
				synced 2025-10-29 23:05:26 +00:00 
			
		
		
		
	 ab596ad897
			
		
	
	
		ab596ad897
		
	
	
	
	
		
			
			Open by handle just grabs an inode by handle and then creates itself a dentry for it. While this works for regular files it is horribly broken for directories, where the VFS locking relies on the fact that there is only just one single dentry for a given inode, and that these are always connected to the root of the filesystem so that it's locking algorithms work (see Documentations/filesystems/Locking) Remove all the existing open by handle code and replace it with a small wrapper around the exportfs code which deals with all these issues. At the same time we also make the checks for a valid handle strict enough to reject all not perfectly well formed handles - given that we never hand out others that's okay and simplifies the code. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Dave Chinner <david@fromorbit.com>
		
			
				
	
	
		
			86 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2008 Silicon Graphics, Inc.
 | |
|  * All Rights Reserved.
 | |
|  *
 | |
|  * This program is free software; you can redistribute it and/or
 | |
|  * modify it under the terms of the GNU General Public License as
 | |
|  * published by the Free Software Foundation.
 | |
|  *
 | |
|  * This program is distributed in the hope that it would be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|  * GNU General Public License for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU General Public License
 | |
|  * along with this program; if not, write the Free Software Foundation,
 | |
|  * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 | |
|  */
 | |
| #ifndef __XFS_IOCTL_H__
 | |
| #define __XFS_IOCTL_H__
 | |
| 
 | |
| extern int
 | |
| xfs_ioc_space(
 | |
| 	struct xfs_inode	*ip,
 | |
| 	struct inode		*inode,
 | |
| 	struct file		*filp,
 | |
| 	int			ioflags,
 | |
| 	unsigned int		cmd,
 | |
| 	xfs_flock64_t		*bf);
 | |
| 
 | |
| extern int
 | |
| xfs_find_handle(
 | |
| 	unsigned int		cmd,
 | |
| 	xfs_fsop_handlereq_t	*hreq);
 | |
| 
 | |
| extern int
 | |
| xfs_open_by_handle(
 | |
| 	struct file		*parfilp,
 | |
| 	xfs_fsop_handlereq_t	*hreq);
 | |
| 
 | |
| extern int
 | |
| xfs_readlink_by_handle(
 | |
| 	struct file		*parfilp,
 | |
| 	xfs_fsop_handlereq_t	*hreq);
 | |
| 
 | |
| extern int
 | |
| xfs_attrmulti_attr_get(
 | |
| 	struct inode		*inode,
 | |
| 	char			*name,
 | |
| 	char			__user *ubuf,
 | |
| 	__uint32_t		*len,
 | |
| 	__uint32_t		flags);
 | |
| 
 | |
| extern int
 | |
| 	xfs_attrmulti_attr_set(
 | |
| 	struct inode		*inode,
 | |
| 	char			*name,
 | |
| 	const char		__user *ubuf,
 | |
| 	__uint32_t		len,
 | |
| 	__uint32_t		flags);
 | |
| 
 | |
| extern int
 | |
| xfs_attrmulti_attr_remove(
 | |
| 	struct inode		*inode,
 | |
| 	char			*name,
 | |
| 	__uint32_t		flags);
 | |
| 
 | |
| extern struct dentry *
 | |
| xfs_handle_to_dentry(
 | |
| 	struct file		*parfilp,
 | |
| 	void __user		*uhandle,
 | |
| 	u32			hlen);
 | |
| 
 | |
| extern long
 | |
| xfs_file_ioctl(
 | |
| 	struct file		*filp,
 | |
| 	unsigned int		cmd,
 | |
| 	unsigned long		p);
 | |
| 
 | |
| extern long
 | |
| xfs_file_compat_ioctl(
 | |
| 	struct file		*file,
 | |
| 	unsigned int		cmd,
 | |
| 	unsigned long		arg);
 | |
| 
 | |
| #endif
 |