mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	->getxattr(): pass dentry and inode as separate arguments
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
		
							parent
							
								
									b296821a7c
								
							
						
					
					
						commit
						ce23e64013
					
				
					 34 changed files with 94 additions and 85 deletions
				
			
		|  | @ -525,3 +525,9 @@ in your dentry operations instead. | |||
| 	set_delayed_call() where it used to set *cookie. | ||||
| 	->put_link() is gone - just give the destructor to set_delayed_call() | ||||
| 	in ->get_link(). | ||||
| -- | ||||
| [mandatory] | ||||
| 	->getxattr() and xattr_handler.get() get dentry and inode passed separately. | ||||
| 	dentry might be yet to be attached to inode, so do _not_ use its ->d_inode | ||||
| 	in the instances.  Rationale: !@#!@# security_d_instantiate() needs to be | ||||
| 	called before we attach dentry to inode. | ||||
|  |  | |||
|  | @ -1042,8 +1042,8 @@ static inline __u64 ll_file_maxbytes(struct inode *inode) | |||
| /* llite/xattr.c */ | ||||
| int ll_setxattr(struct dentry *dentry, const char *name, | ||||
| 		const void *value, size_t size, int flags); | ||||
| ssize_t ll_getxattr(struct dentry *dentry, const char *name, | ||||
| 		    void *buffer, size_t size); | ||||
| ssize_t ll_getxattr(struct dentry *dentry, struct inode *inode, | ||||
| 		    const char *name, void *buffer, size_t size); | ||||
| ssize_t ll_listxattr(struct dentry *dentry, char *buffer, size_t size); | ||||
| int ll_removexattr(struct dentry *dentry, const char *name); | ||||
| 
 | ||||
|  |  | |||
|  | @ -451,11 +451,9 @@ int ll_getxattr_common(struct inode *inode, const char *name, | |||
| 	return rc; | ||||
| } | ||||
| 
 | ||||
| ssize_t ll_getxattr(struct dentry *dentry, const char *name, | ||||
| 		    void *buffer, size_t size) | ||||
| ssize_t ll_getxattr(struct dentry *dentry, struct inode *inode, | ||||
| 		    const char *name, void *buffer, size_t size) | ||||
| { | ||||
| 	struct inode *inode = d_inode(dentry); | ||||
| 
 | ||||
| 	LASSERT(inode); | ||||
| 	LASSERT(name); | ||||
| 
 | ||||
|  |  | |||
|  | @ -106,8 +106,8 @@ static int bad_inode_setxattr(struct dentry *dentry, const char *name, | |||
| 	return -EIO; | ||||
| } | ||||
| 
 | ||||
| static ssize_t bad_inode_getxattr(struct dentry *dentry, const char *name, | ||||
| 			void *buffer, size_t size) | ||||
| static ssize_t bad_inode_getxattr(struct dentry *dentry, struct inode *inode, | ||||
| 			const char *name, void *buffer, size_t size) | ||||
| { | ||||
| 	return -EIO; | ||||
| } | ||||
|  |  | |||
|  | @ -795,7 +795,7 @@ extern int ceph_setxattr(struct dentry *, const char *, const void *, | |||
| int __ceph_setxattr(struct dentry *, const char *, const void *, size_t, int); | ||||
| ssize_t __ceph_getxattr(struct inode *, const char *, void *, size_t); | ||||
| int __ceph_removexattr(struct dentry *, const char *); | ||||
| extern ssize_t ceph_getxattr(struct dentry *, const char *, void *, size_t); | ||||
| extern ssize_t ceph_getxattr(struct dentry *, struct inode *, const char *, void *, size_t); | ||||
| extern ssize_t ceph_listxattr(struct dentry *, char *, size_t); | ||||
| extern int ceph_removexattr(struct dentry *, const char *); | ||||
| extern void __ceph_build_xattrs_blob(struct ceph_inode_info *ci); | ||||
|  |  | |||
|  | @ -804,13 +804,13 @@ ssize_t __ceph_getxattr(struct inode *inode, const char *name, void *value, | |||
| 	return err; | ||||
| } | ||||
| 
 | ||||
| ssize_t ceph_getxattr(struct dentry *dentry, const char *name, void *value, | ||||
| 		      size_t size) | ||||
| ssize_t ceph_getxattr(struct dentry *dentry, struct inode *inode, | ||||
| 		      const char *name, void *value, size_t size) | ||||
| { | ||||
| 	if (!strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN)) | ||||
| 		return generic_getxattr(dentry, name, value, size); | ||||
| 		return generic_getxattr(dentry, inode, name, value, size); | ||||
| 
 | ||||
| 	return __ceph_getxattr(d_inode(dentry), name, value, size); | ||||
| 	return __ceph_getxattr(inode, name, value, size); | ||||
| } | ||||
| 
 | ||||
| ssize_t ceph_listxattr(struct dentry *dentry, char *names, size_t size) | ||||
|  |  | |||
|  | @ -123,7 +123,7 @@ extern int cifs_symlink(struct inode *inode, struct dentry *direntry, | |||
| extern int	cifs_removexattr(struct dentry *, const char *); | ||||
| extern int	cifs_setxattr(struct dentry *, const char *, const void *, | ||||
| 			size_t, int); | ||||
| extern ssize_t	cifs_getxattr(struct dentry *, const char *, void *, size_t); | ||||
| extern ssize_t	cifs_getxattr(struct dentry *, struct inode *, const char *, void *, size_t); | ||||
| extern ssize_t	cifs_listxattr(struct dentry *, char *, size_t); | ||||
| extern long cifs_ioctl(struct file *filep, unsigned int cmd, unsigned long arg); | ||||
| #ifdef CONFIG_CIFS_NFSD_EXPORT | ||||
|  |  | |||
|  | @ -213,8 +213,8 @@ int cifs_setxattr(struct dentry *direntry, const char *ea_name, | |||
| 	return rc; | ||||
| } | ||||
| 
 | ||||
| ssize_t cifs_getxattr(struct dentry *direntry, const char *ea_name, | ||||
| 	void *ea_value, size_t buf_size) | ||||
| ssize_t cifs_getxattr(struct dentry *direntry, struct inode *inode, | ||||
| 	const char *ea_name, void *ea_value, size_t buf_size) | ||||
| { | ||||
| 	ssize_t rc = -EOPNOTSUPP; | ||||
| #ifdef CONFIG_CIFS_XATTR | ||||
|  | @ -296,7 +296,7 @@ ssize_t cifs_getxattr(struct dentry *direntry, const char *ea_name, | |||
| 				goto get_ea_exit; /* rc already EOPNOTSUPP */ | ||||
| 
 | ||||
| 			pacl = pTcon->ses->server->ops->get_acl(cifs_sb, | ||||
| 					d_inode(direntry), full_path, &acllen); | ||||
| 					inode, full_path, &acllen); | ||||
| 			if (IS_ERR(pacl)) { | ||||
| 				rc = PTR_ERR(pacl); | ||||
| 				cifs_dbg(VFS, "%s: error %zd getting sec desc\n", | ||||
|  |  | |||
|  | @ -1369,7 +1369,9 @@ int ecryptfs_read_xattr_region(char *page_virt, struct inode *ecryptfs_inode) | |||
| 	ssize_t size; | ||||
| 	int rc = 0; | ||||
| 
 | ||||
| 	size = ecryptfs_getxattr_lower(lower_dentry, ECRYPTFS_XATTR_NAME, | ||||
| 	size = ecryptfs_getxattr_lower(lower_dentry, | ||||
| 				       ecryptfs_inode_to_lower(ecryptfs_inode), | ||||
| 				       ECRYPTFS_XATTR_NAME, | ||||
| 				       page_virt, ECRYPTFS_DEFAULT_EXTENT_SIZE); | ||||
| 	if (size < 0) { | ||||
| 		if (unlikely(ecryptfs_verbosity > 0)) | ||||
|  | @ -1391,6 +1393,7 @@ int ecryptfs_read_and_validate_xattr_region(struct dentry *dentry, | |||
| 	int rc; | ||||
| 
 | ||||
| 	rc = ecryptfs_getxattr_lower(ecryptfs_dentry_to_lower(dentry), | ||||
| 				     ecryptfs_inode_to_lower(inode), | ||||
| 				     ECRYPTFS_XATTR_NAME, file_size, | ||||
| 				     ECRYPTFS_SIZE_AND_MARKER_BYTES); | ||||
| 	if (rc < ECRYPTFS_SIZE_AND_MARKER_BYTES) | ||||
|  |  | |||
|  | @ -607,8 +607,8 @@ ecryptfs_parse_packet_set(struct ecryptfs_crypt_stat *crypt_stat, | |||
| 			  unsigned char *src, struct dentry *ecryptfs_dentry); | ||||
| int ecryptfs_truncate(struct dentry *dentry, loff_t new_length); | ||||
| ssize_t | ||||
| ecryptfs_getxattr_lower(struct dentry *lower_dentry, const char *name, | ||||
| 			void *value, size_t size); | ||||
| ecryptfs_getxattr_lower(struct dentry *lower_dentry, struct inode *lower_inode, | ||||
| 			const char *name, void *value, size_t size); | ||||
| int | ||||
| ecryptfs_setxattr(struct dentry *dentry, const char *name, const void *value, | ||||
| 		  size_t size, int flags); | ||||
|  |  | |||
|  | @ -1033,29 +1033,30 @@ ecryptfs_setxattr(struct dentry *dentry, const char *name, const void *value, | |||
| } | ||||
| 
 | ||||
| ssize_t | ||||
| ecryptfs_getxattr_lower(struct dentry *lower_dentry, const char *name, | ||||
| 			void *value, size_t size) | ||||
| ecryptfs_getxattr_lower(struct dentry *lower_dentry, struct inode *lower_inode, | ||||
| 			const char *name, void *value, size_t size) | ||||
| { | ||||
| 	int rc = 0; | ||||
| 
 | ||||
| 	if (!d_inode(lower_dentry)->i_op->getxattr) { | ||||
| 	if (!lower_inode->i_op->getxattr) { | ||||
| 		rc = -EOPNOTSUPP; | ||||
| 		goto out; | ||||
| 	} | ||||
| 	inode_lock(d_inode(lower_dentry)); | ||||
| 	rc = d_inode(lower_dentry)->i_op->getxattr(lower_dentry, name, value, | ||||
| 						   size); | ||||
| 	inode_unlock(d_inode(lower_dentry)); | ||||
| 	inode_lock(lower_inode); | ||||
| 	rc = lower_inode->i_op->getxattr(lower_dentry, lower_inode, | ||||
| 					 name, value, size); | ||||
| 	inode_unlock(lower_inode); | ||||
| out: | ||||
| 	return rc; | ||||
| } | ||||
| 
 | ||||
| static ssize_t | ||||
| ecryptfs_getxattr(struct dentry *dentry, const char *name, void *value, | ||||
| 		  size_t size) | ||||
| ecryptfs_getxattr(struct dentry *dentry, struct inode *inode, | ||||
| 		  const char *name, void *value, size_t size) | ||||
| { | ||||
| 	return ecryptfs_getxattr_lower(ecryptfs_dentry_to_lower(dentry), name, | ||||
| 				       value, size); | ||||
| 	return ecryptfs_getxattr_lower(ecryptfs_dentry_to_lower(dentry), | ||||
| 				       ecryptfs_inode_to_lower(inode), | ||||
| 				       name, value, size); | ||||
| } | ||||
| 
 | ||||
| static ssize_t | ||||
|  |  | |||
|  | @ -436,7 +436,8 @@ static int ecryptfs_write_inode_size_to_xattr(struct inode *ecryptfs_inode) | |||
| 		goto out; | ||||
| 	} | ||||
| 	inode_lock(lower_inode); | ||||
| 	size = lower_inode->i_op->getxattr(lower_dentry, ECRYPTFS_XATTR_NAME, | ||||
| 	size = lower_inode->i_op->getxattr(lower_dentry, lower_inode, | ||||
| 					   ECRYPTFS_XATTR_NAME, | ||||
| 					   xattr_virt, PAGE_CACHE_SIZE); | ||||
| 	if (size < 0) | ||||
| 		size = 8; | ||||
|  |  | |||
|  | @ -1759,10 +1759,9 @@ static int fuse_setxattr(struct dentry *entry, const char *name, | |||
| 	return err; | ||||
| } | ||||
| 
 | ||||
| static ssize_t fuse_getxattr(struct dentry *entry, const char *name, | ||||
| 			     void *value, size_t size) | ||||
| static ssize_t fuse_getxattr(struct dentry *entry, struct inode *inode, | ||||
| 			     const char *name, void *value, size_t size) | ||||
| { | ||||
| 	struct inode *inode = d_inode(entry); | ||||
| 	struct fuse_conn *fc = get_fuse_conn(inode); | ||||
| 	FUSE_ARGS(args); | ||||
| 	struct fuse_getxattr_in inarg; | ||||
|  |  | |||
|  | @ -1968,22 +1968,21 @@ static int gfs2_setxattr(struct dentry *dentry, const char *name, | |||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| static ssize_t gfs2_getxattr(struct dentry *dentry, const char *name, | ||||
| 			     void *data, size_t size) | ||||
| static ssize_t gfs2_getxattr(struct dentry *dentry, struct inode *inode, | ||||
| 			     const char *name, void *data, size_t size) | ||||
| { | ||||
| 	struct inode *inode = d_inode(dentry); | ||||
| 	struct gfs2_inode *ip = GFS2_I(inode); | ||||
| 	struct gfs2_holder gh; | ||||
| 	int ret; | ||||
| 
 | ||||
| 	/* For selinux during lookup */ | ||||
| 	if (gfs2_glock_is_locked_by_me(ip->i_gl)) | ||||
| 		return generic_getxattr(dentry, name, data, size); | ||||
| 		return generic_getxattr(dentry, inode, name, data, size); | ||||
| 
 | ||||
| 	gfs2_holder_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &gh); | ||||
| 	ret = gfs2_glock_nq(&gh); | ||||
| 	if (ret == 0) { | ||||
| 		ret = generic_getxattr(dentry, name, data, size); | ||||
| 		ret = generic_getxattr(dentry, inode, name, data, size); | ||||
| 		gfs2_glock_dq(&gh); | ||||
| 	} | ||||
| 	gfs2_holder_uninit(&gh); | ||||
|  |  | |||
|  | @ -56,10 +56,9 @@ int hfs_setxattr(struct dentry *dentry, const char *name, | |||
| 	return res; | ||||
| } | ||||
| 
 | ||||
| ssize_t hfs_getxattr(struct dentry *dentry, const char *name, | ||||
| 			 void *value, size_t size) | ||||
| ssize_t hfs_getxattr(struct dentry *unused, struct inode *inode, | ||||
| 		     const char *name, void *value, size_t size) | ||||
| { | ||||
| 	struct inode *inode = d_inode(dentry); | ||||
| 	struct hfs_find_data fd; | ||||
| 	hfs_cat_rec rec; | ||||
| 	struct hfs_cat_file *file; | ||||
|  |  | |||
|  | @ -213,8 +213,8 @@ extern void hfs_delete_inode(struct inode *); | |||
| /* attr.c */ | ||||
| extern int hfs_setxattr(struct dentry *dentry, const char *name, | ||||
| 			const void *value, size_t size, int flags); | ||||
| extern ssize_t hfs_getxattr(struct dentry *dentry, const char *name, | ||||
| 			    void *value, size_t size); | ||||
| extern ssize_t hfs_getxattr(struct dentry *dentry, struct inode *inode, | ||||
| 			    const char *name, void *value, size_t size); | ||||
| extern ssize_t hfs_listxattr(struct dentry *dentry, char *buffer, size_t size); | ||||
| 
 | ||||
| /* mdb.c */ | ||||
|  |  | |||
|  | @ -57,7 +57,7 @@ extern int __jfs_setxattr(tid_t, struct inode *, const char *, const void *, | |||
| extern int jfs_setxattr(struct dentry *, const char *, const void *, size_t, | ||||
| 			int); | ||||
| extern ssize_t __jfs_getxattr(struct inode *, const char *, void *, size_t); | ||||
| extern ssize_t jfs_getxattr(struct dentry *, const char *, void *, size_t); | ||||
| extern ssize_t jfs_getxattr(struct dentry *, struct inode *, const char *, void *, size_t); | ||||
| extern ssize_t jfs_listxattr(struct dentry *, char *, size_t); | ||||
| extern int jfs_removexattr(struct dentry *, const char *); | ||||
| 
 | ||||
|  |  | |||
|  | @ -933,8 +933,8 @@ ssize_t __jfs_getxattr(struct inode *inode, const char *name, void *data, | |||
| 	return size; | ||||
| } | ||||
| 
 | ||||
| ssize_t jfs_getxattr(struct dentry *dentry, const char *name, void *data, | ||||
| 		     size_t buf_size) | ||||
| ssize_t jfs_getxattr(struct dentry *dentry, struct inode *inode, | ||||
| 		     const char *name, void *data, size_t buf_size) | ||||
| { | ||||
| 	int err; | ||||
| 
 | ||||
|  | @ -944,7 +944,7 @@ ssize_t jfs_getxattr(struct dentry *dentry, const char *name, void *data, | |||
| 	 * for it via sb->s_xattr. | ||||
| 	 */ | ||||
| 	if (!strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN)) | ||||
| 		return generic_getxattr(dentry, name, data, buf_size); | ||||
| 		return generic_getxattr(dentry, inode, name, data, buf_size); | ||||
| 
 | ||||
| 	if (strncmp(name, XATTR_OS2_PREFIX, XATTR_OS2_PREFIX_LEN) == 0) { | ||||
| 		/*
 | ||||
|  | @ -959,7 +959,7 @@ ssize_t jfs_getxattr(struct dentry *dentry, const char *name, void *data, | |||
| 			return -EOPNOTSUPP; | ||||
| 	} | ||||
| 
 | ||||
| 	err = __jfs_getxattr(d_inode(dentry), name, data, buf_size); | ||||
| 	err = __jfs_getxattr(inode, name, data, buf_size); | ||||
| 
 | ||||
| 	return err; | ||||
| } | ||||
|  |  | |||
|  | @ -208,10 +208,10 @@ int kernfs_iop_removexattr(struct dentry *dentry, const char *name) | |||
| 	return simple_xattr_set(&attrs->xattrs, name, NULL, 0, XATTR_REPLACE); | ||||
| } | ||||
| 
 | ||||
| ssize_t kernfs_iop_getxattr(struct dentry *dentry, const char *name, void *buf, | ||||
| 			    size_t size) | ||||
| ssize_t kernfs_iop_getxattr(struct dentry *unused, struct inode *inode, | ||||
| 			    const char *name, void *buf, size_t size) | ||||
| { | ||||
| 	struct kernfs_node *kn = dentry->d_fsdata; | ||||
| 	struct kernfs_node *kn = inode->i_private; | ||||
| 	struct kernfs_iattrs *attrs; | ||||
| 
 | ||||
| 	attrs = kernfs_iattrs(kn); | ||||
|  |  | |||
|  | @ -84,8 +84,8 @@ int kernfs_iop_getattr(struct vfsmount *mnt, struct dentry *dentry, | |||
| int kernfs_iop_setxattr(struct dentry *dentry, const char *name, const void *value, | ||||
| 			size_t size, int flags); | ||||
| int kernfs_iop_removexattr(struct dentry *dentry, const char *name); | ||||
| ssize_t kernfs_iop_getxattr(struct dentry *dentry, const char *name, void *buf, | ||||
| 			    size_t size); | ||||
| ssize_t kernfs_iop_getxattr(struct dentry *dentry, struct inode *inode, | ||||
| 			    const char *name, void *buf, size_t size); | ||||
| ssize_t kernfs_iop_listxattr(struct dentry *dentry, char *buf, size_t size); | ||||
| 
 | ||||
| /*
 | ||||
|  |  | |||
|  | @ -1127,8 +1127,8 @@ static int empty_dir_setxattr(struct dentry *dentry, const char *name, | |||
| 	return -EOPNOTSUPP; | ||||
| } | ||||
| 
 | ||||
| static ssize_t empty_dir_getxattr(struct dentry *dentry, const char *name, | ||||
| 				  void *value, size_t size) | ||||
| static ssize_t empty_dir_getxattr(struct dentry *dentry, struct inode *inode, | ||||
| 				  const char *name, void *value, size_t size) | ||||
| { | ||||
| 	return -EOPNOTSUPP; | ||||
| } | ||||
|  |  | |||
|  | @ -246,8 +246,8 @@ static bool ovl_need_xattr_filter(struct dentry *dentry, | |||
| 		return false; | ||||
| } | ||||
| 
 | ||||
| ssize_t ovl_getxattr(struct dentry *dentry, const char *name, | ||||
| 		     void *value, size_t size) | ||||
| ssize_t ovl_getxattr(struct dentry *dentry, struct inode *inode, | ||||
| 		     const char *name, void *value, size_t size) | ||||
| { | ||||
| 	struct path realpath; | ||||
| 	enum ovl_path_type type = ovl_path_real(dentry, &realpath); | ||||
|  |  | |||
|  | @ -173,8 +173,8 @@ int ovl_setattr(struct dentry *dentry, struct iattr *attr); | |||
| int ovl_permission(struct inode *inode, int mask); | ||||
| int ovl_setxattr(struct dentry *dentry, const char *name, | ||||
| 		 const void *value, size_t size, int flags); | ||||
| ssize_t ovl_getxattr(struct dentry *dentry, const char *name, | ||||
| 		     void *value, size_t size); | ||||
| ssize_t ovl_getxattr(struct dentry *dentry, struct inode *inode, | ||||
| 		     const char *name, void *value, size_t size); | ||||
| ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size); | ||||
| int ovl_removexattr(struct dentry *dentry, const char *name); | ||||
| struct inode *ovl_d_select_inode(struct dentry *dentry, unsigned file_flags); | ||||
|  |  | |||
|  | @ -274,7 +274,7 @@ static bool ovl_is_opaquedir(struct dentry *dentry) | |||
| 	if (!S_ISDIR(inode->i_mode) || !inode->i_op->getxattr) | ||||
| 		return false; | ||||
| 
 | ||||
| 	res = inode->i_op->getxattr(dentry, OVL_XATTR_OPAQUE, &val, 1); | ||||
| 	res = inode->i_op->getxattr(dentry, inode, OVL_XATTR_OPAQUE, &val, 1); | ||||
| 	if (res == 1 && val == 'y') | ||||
| 		return true; | ||||
| 
 | ||||
|  |  | |||
|  | @ -1734,8 +1734,8 @@ int ubifs_getattr(struct vfsmount *mnt, struct dentry *dentry, | |||
| /* xattr.c */ | ||||
| int ubifs_setxattr(struct dentry *dentry, const char *name, | ||||
| 		   const void *value, size_t size, int flags); | ||||
| ssize_t ubifs_getxattr(struct dentry *dentry, const char *name, void *buf, | ||||
| 		       size_t size); | ||||
| ssize_t ubifs_getxattr(struct dentry *dentry, struct inode *host, | ||||
| 		       const char *name, void *buf, size_t size); | ||||
| ssize_t ubifs_listxattr(struct dentry *dentry, char *buffer, size_t size); | ||||
| int ubifs_removexattr(struct dentry *dentry, const char *name); | ||||
| int ubifs_init_security(struct inode *dentry, struct inode *inode, | ||||
|  |  | |||
|  | @ -372,10 +372,10 @@ int ubifs_setxattr(struct dentry *dentry, const char *name, | |||
| 	return setxattr(d_inode(dentry), name, value, size, flags); | ||||
| } | ||||
| 
 | ||||
| ssize_t ubifs_getxattr(struct dentry *dentry, const char *name, void *buf, | ||||
| 		       size_t size) | ||||
| ssize_t ubifs_getxattr(struct dentry *dentry, struct inode *host, | ||||
| 		       const char *name, void *buf, size_t size) | ||||
| { | ||||
| 	struct inode *inode, *host = d_inode(dentry); | ||||
| 	struct inode *inode; | ||||
| 	struct ubifs_info *c = host->i_sb->s_fs_info; | ||||
| 	struct qstr nm = QSTR_INIT(name, strlen(name)); | ||||
| 	struct ubifs_inode *ui; | ||||
|  |  | |||
							
								
								
									
										11
									
								
								fs/xattr.c
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								fs/xattr.c
									
									
									
									
									
								
							|  | @ -192,7 +192,7 @@ vfs_getxattr_alloc(struct dentry *dentry, const char *name, char **xattr_value, | |||
| 	if (!inode->i_op->getxattr) | ||||
| 		return -EOPNOTSUPP; | ||||
| 
 | ||||
| 	error = inode->i_op->getxattr(dentry, name, NULL, 0); | ||||
| 	error = inode->i_op->getxattr(dentry, inode, name, NULL, 0); | ||||
| 	if (error < 0) | ||||
| 		return error; | ||||
| 
 | ||||
|  | @ -203,7 +203,7 @@ vfs_getxattr_alloc(struct dentry *dentry, const char *name, char **xattr_value, | |||
| 		memset(value, 0, error + 1); | ||||
| 	} | ||||
| 
 | ||||
| 	error = inode->i_op->getxattr(dentry, name, value, error); | ||||
| 	error = inode->i_op->getxattr(dentry, inode, name, value, error); | ||||
| 	*xattr_value = value; | ||||
| 	return error; | ||||
| } | ||||
|  | @ -236,7 +236,7 @@ vfs_getxattr(struct dentry *dentry, const char *name, void *value, size_t size) | |||
| 	} | ||||
| nolsm: | ||||
| 	if (inode->i_op->getxattr) | ||||
| 		error = inode->i_op->getxattr(dentry, name, value, size); | ||||
| 		error = inode->i_op->getxattr(dentry, inode, name, value, size); | ||||
| 	else | ||||
| 		error = -EOPNOTSUPP; | ||||
| 
 | ||||
|  | @ -691,14 +691,15 @@ xattr_resolve_name(const struct xattr_handler **handlers, const char **name) | |||
|  * Find the handler for the prefix and dispatch its get() operation. | ||||
|  */ | ||||
| ssize_t | ||||
| generic_getxattr(struct dentry *dentry, const char *name, void *buffer, size_t size) | ||||
| generic_getxattr(struct dentry *dentry, struct inode *inode, | ||||
| 		 const char *name, void *buffer, size_t size) | ||||
| { | ||||
| 	const struct xattr_handler *handler; | ||||
| 
 | ||||
| 	handler = xattr_resolve_name(dentry->d_sb->s_xattr, &name); | ||||
| 	if (IS_ERR(handler)) | ||||
| 		return PTR_ERR(handler); | ||||
| 	return handler->get(handler, dentry, d_inode(dentry), | ||||
| 	return handler->get(handler, dentry, inode, | ||||
| 			    name, buffer, size); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -1702,7 +1702,8 @@ struct inode_operations { | |||
| 	int (*setattr) (struct dentry *, struct iattr *); | ||||
| 	int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *); | ||||
| 	int (*setxattr) (struct dentry *, const char *,const void *,size_t,int); | ||||
| 	ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); | ||||
| 	ssize_t (*getxattr) (struct dentry *, struct inode *, | ||||
| 			     const char *, void *, size_t); | ||||
| 	ssize_t (*listxattr) (struct dentry *, char *, size_t); | ||||
| 	int (*removexattr) (struct dentry *, const char *); | ||||
| 	int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start, | ||||
|  |  | |||
|  | @ -52,7 +52,7 @@ int __vfs_setxattr_noperm(struct dentry *, const char *, const void *, size_t, i | |||
| int vfs_setxattr(struct dentry *, const char *, const void *, size_t, int); | ||||
| int vfs_removexattr(struct dentry *, const char *); | ||||
| 
 | ||||
| ssize_t generic_getxattr(struct dentry *dentry, const char *name, void *buffer, size_t size); | ||||
| ssize_t generic_getxattr(struct dentry *dentry, struct inode *inode, const char *name, void *buffer, size_t size); | ||||
| ssize_t generic_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size); | ||||
| int generic_setxattr(struct dentry *dentry, const char *name, const void *value, size_t size, int flags); | ||||
| int generic_removexattr(struct dentry *dentry, const char *name); | ||||
|  |  | |||
|  | @ -466,7 +466,7 @@ static struct socket *sockfd_lookup_light(int fd, int *err, int *fput_needed) | |||
| #define XATTR_SOCKPROTONAME_SUFFIX "sockprotoname" | ||||
| #define XATTR_NAME_SOCKPROTONAME (XATTR_SYSTEM_PREFIX XATTR_SOCKPROTONAME_SUFFIX) | ||||
| #define XATTR_NAME_SOCKPROTONAME_LEN (sizeof(XATTR_NAME_SOCKPROTONAME)-1) | ||||
| static ssize_t sockfs_getxattr(struct dentry *dentry, | ||||
| static ssize_t sockfs_getxattr(struct dentry *dentry, struct inode *inode, | ||||
| 			       const char *name, void *value, size_t size) | ||||
| { | ||||
| 	const char *proto_name; | ||||
|  |  | |||
|  | @ -313,7 +313,7 @@ int cap_inode_need_killpriv(struct dentry *dentry) | |||
| 	if (!inode->i_op->getxattr) | ||||
| 	       return 0; | ||||
| 
 | ||||
| 	error = inode->i_op->getxattr(dentry, XATTR_NAME_CAPS, NULL, 0); | ||||
| 	error = inode->i_op->getxattr(dentry, inode, XATTR_NAME_CAPS, NULL, 0); | ||||
| 	if (error <= 0) | ||||
| 		return 0; | ||||
| 	return 1; | ||||
|  | @ -397,8 +397,8 @@ int get_vfs_caps_from_disk(const struct dentry *dentry, struct cpu_vfs_cap_data | |||
| 	if (!inode || !inode->i_op->getxattr) | ||||
| 		return -ENODATA; | ||||
| 
 | ||||
| 	size = inode->i_op->getxattr((struct dentry *)dentry, XATTR_NAME_CAPS, &caps, | ||||
| 				   XATTR_CAPS_SZ); | ||||
| 	size = inode->i_op->getxattr((struct dentry *)dentry, inode, | ||||
| 				     XATTR_NAME_CAPS, &caps, XATTR_CAPS_SZ); | ||||
| 	if (size == -ENODATA || size == -EOPNOTSUPP) | ||||
| 		/* no data, that's ok */ | ||||
| 		return -ENODATA; | ||||
|  |  | |||
|  | @ -82,7 +82,7 @@ static int evm_find_protected_xattrs(struct dentry *dentry) | |||
| 		return -EOPNOTSUPP; | ||||
| 
 | ||||
| 	for (xattr = evm_config_xattrnames; *xattr != NULL; xattr++) { | ||||
| 		error = inode->i_op->getxattr(dentry, *xattr, NULL, 0); | ||||
| 		error = inode->i_op->getxattr(dentry, inode, *xattr, NULL, 0); | ||||
| 		if (error < 0) { | ||||
| 			if (error == -ENODATA) | ||||
| 				continue; | ||||
|  |  | |||
|  | @ -506,7 +506,8 @@ static int sb_finish_set_opts(struct super_block *sb) | |||
| 			rc = -EOPNOTSUPP; | ||||
| 			goto out; | ||||
| 		} | ||||
| 		rc = root_inode->i_op->getxattr(root, XATTR_NAME_SELINUX, NULL, 0); | ||||
| 		rc = root_inode->i_op->getxattr(root, root_inode, | ||||
| 						XATTR_NAME_SELINUX, NULL, 0); | ||||
| 		if (rc < 0 && rc != -ENODATA) { | ||||
| 			if (rc == -EOPNOTSUPP) | ||||
| 				printk(KERN_WARNING "SELinux: (dev %s, type " | ||||
|  | @ -1412,13 +1413,13 @@ static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dent | |||
| 			goto out_unlock; | ||||
| 		} | ||||
| 		context[len] = '\0'; | ||||
| 		rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX, | ||||
| 		rc = inode->i_op->getxattr(dentry, inode, XATTR_NAME_SELINUX, | ||||
| 					   context, len); | ||||
| 		if (rc == -ERANGE) { | ||||
| 			kfree(context); | ||||
| 
 | ||||
| 			/* Need a larger buffer.  Query for the right size. */ | ||||
| 			rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX, | ||||
| 			rc = inode->i_op->getxattr(dentry, inode, XATTR_NAME_SELINUX, | ||||
| 						   NULL, 0); | ||||
| 			if (rc < 0) { | ||||
| 				dput(dentry); | ||||
|  | @ -1432,7 +1433,7 @@ static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dent | |||
| 				goto out_unlock; | ||||
| 			} | ||||
| 			context[len] = '\0'; | ||||
| 			rc = inode->i_op->getxattr(dentry, | ||||
| 			rc = inode->i_op->getxattr(dentry, inode, | ||||
| 						   XATTR_NAME_SELINUX, | ||||
| 						   context, len); | ||||
| 		} | ||||
|  |  | |||
|  | @ -272,7 +272,7 @@ static struct smack_known *smk_fetch(const char *name, struct inode *ip, | |||
| 	if (buffer == NULL) | ||||
| 		return ERR_PTR(-ENOMEM); | ||||
| 
 | ||||
| 	rc = ip->i_op->getxattr(dp, name, buffer, SMK_LONGLABEL); | ||||
| 	rc = ip->i_op->getxattr(dp, ip, name, buffer, SMK_LONGLABEL); | ||||
| 	if (rc < 0) | ||||
| 		skp = ERR_PTR(rc); | ||||
| 	else if (rc == 0) | ||||
|  | @ -3519,7 +3519,7 @@ static void smack_d_instantiate(struct dentry *opt_dentry, struct inode *inode) | |||
| 					TRANS_TRUE, TRANS_TRUE_SIZE, | ||||
| 					0); | ||||
| 			} else { | ||||
| 				rc = inode->i_op->getxattr(dp, | ||||
| 				rc = inode->i_op->getxattr(dp, inode, | ||||
| 					XATTR_NAME_SMACKTRANSMUTE, trattr, | ||||
| 					TRANS_TRUE_SIZE); | ||||
| 				if (rc >= 0 && strncmp(trattr, TRANS_TRUE, | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Al Viro
						Al Viro