[XFS] Remove vn_revalidate calls in xfs.
These days most of the attributes in struct inode are properly kept in sync by XFS. This patch removes the need for vn_revalidate completely by: - keeping inode.i_flags uptodate after any flags are updated in xfs_ioctl_setattr - keeping i_mode, i_uid and i_gid uptodate in xfs_setattr SGI-PV: 984566 SGI-Modid: xfs-linux-melb:xfs-kern:31679a Signed-off-by: Christoph Hellwig <hch@infradead.org> Signed-off-by: Tim Shimmin <tes@sgi.com> Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
This commit is contained in:
		
							parent
							
								
									0f285c8a1c
								
							
						
					
					
						commit
						f13fae2d2a
					
				| @ -923,6 +923,30 @@ xfs_set_diflags( | ||||
| 	ip->i_d.di_flags = di_flags; | ||||
| } | ||||
| 
 | ||||
| STATIC void | ||||
| xfs_diflags_to_linux( | ||||
| 	struct xfs_inode	*ip) | ||||
| { | ||||
| 	struct inode		*inode = XFS_ITOV(ip); | ||||
| 	unsigned int		xflags = xfs_ip2xflags(ip); | ||||
| 
 | ||||
| 	if (xflags & XFS_XFLAG_IMMUTABLE) | ||||
| 		inode->i_flags |= S_IMMUTABLE; | ||||
| 	else | ||||
| 		inode->i_flags &= ~S_IMMUTABLE; | ||||
| 	if (xflags & XFS_XFLAG_APPEND) | ||||
| 		inode->i_flags |= S_APPEND; | ||||
| 	else | ||||
| 		inode->i_flags &= ~S_APPEND; | ||||
| 	if (xflags & XFS_XFLAG_SYNC) | ||||
| 		inode->i_flags |= S_SYNC; | ||||
| 	else | ||||
| 		inode->i_flags &= ~S_SYNC; | ||||
| 	if (xflags & XFS_XFLAG_NOATIME) | ||||
| 		inode->i_flags |= S_NOATIME; | ||||
| 	else | ||||
| 		inode->i_flags &= ~S_NOATIME; | ||||
| } | ||||
| 
 | ||||
| #define FSX_PROJID	1 | ||||
| #define FSX_EXTSIZE	2 | ||||
| @ -1121,8 +1145,10 @@ xfs_ioctl_setattr( | ||||
| 
 | ||||
| 	if (mask & FSX_EXTSIZE) | ||||
| 		ip->i_d.di_extsize = fa->fsx_extsize >> mp->m_sb.sb_blocklog; | ||||
| 	if (mask & FSX_XFLAGS) | ||||
| 	if (mask & FSX_XFLAGS) { | ||||
| 		xfs_set_diflags(ip, fa->fsx_xflags); | ||||
| 		xfs_diflags_to_linux(ip); | ||||
| 	} | ||||
| 
 | ||||
| 	xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); | ||||
| 	xfs_ichgtime(ip, XFS_ICHGTIME_CHG); | ||||
| @ -1160,7 +1186,6 @@ xfs_ioctl_setattr( | ||||
| 				(mask & FSX_NONBLOCK) ? DM_FLAGS_NDELAY : 0); | ||||
| 	} | ||||
| 
 | ||||
| 	vn_revalidate(XFS_ITOV(ip));	/* update flags */ | ||||
| 	return 0; | ||||
| 
 | ||||
|  error_return: | ||||
|  | ||||
| @ -650,21 +650,7 @@ xfs_vn_setattr( | ||||
| 	struct dentry	*dentry, | ||||
| 	struct iattr	*iattr) | ||||
| { | ||||
| 	struct inode	*inode = dentry->d_inode; | ||||
| 	int		error; | ||||
| 
 | ||||
| 	if (iattr->ia_valid & ATTR_ATIME) | ||||
| 		inode->i_atime = iattr->ia_atime; | ||||
| 
 | ||||
| 	if (iattr->ia_valid & ATTR_MODE) { | ||||
| 		if (!in_group_p(inode->i_gid) && !capable(CAP_FSETID)) | ||||
| 			inode->i_mode &= ~S_ISGID; | ||||
| 	} | ||||
| 
 | ||||
| 	error = xfs_setattr(XFS_I(inode), iattr, 0, NULL); | ||||
| 	if (likely(!error)) | ||||
| 		vn_revalidate(vn_from_inode(inode)); | ||||
| 	return -error; | ||||
| 	return -xfs_setattr(XFS_I(dentry->d_inode), iattr, 0, NULL); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  | ||||
| @ -82,56 +82,6 @@ vn_ioerror( | ||||
| 		xfs_do_force_shutdown(ip->i_mount, SHUTDOWN_DEVICE_REQ, f, l); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Revalidate the Linux inode from the XFS inode. | ||||
|  * Note: i_size _not_ updated; we must hold the inode | ||||
|  * semaphore when doing that - callers responsibility. | ||||
|  */ | ||||
| int | ||||
| vn_revalidate( | ||||
| 	bhv_vnode_t		*vp) | ||||
| { | ||||
| 	struct inode		*inode = vn_to_inode(vp); | ||||
| 	struct xfs_inode	*ip = XFS_I(inode); | ||||
| 	struct xfs_mount	*mp = ip->i_mount; | ||||
| 	unsigned long		xflags; | ||||
| 
 | ||||
| 	xfs_itrace_entry(ip); | ||||
| 
 | ||||
| 	if (XFS_FORCED_SHUTDOWN(mp)) | ||||
| 		return -EIO; | ||||
| 
 | ||||
| 	xfs_ilock(ip, XFS_ILOCK_SHARED); | ||||
| 	inode->i_mode	    = ip->i_d.di_mode; | ||||
| 	inode->i_uid	    = ip->i_d.di_uid; | ||||
| 	inode->i_gid	    = ip->i_d.di_gid; | ||||
| 	inode->i_mtime.tv_sec = ip->i_d.di_mtime.t_sec; | ||||
| 	inode->i_mtime.tv_nsec = ip->i_d.di_mtime.t_nsec; | ||||
| 	inode->i_ctime.tv_sec = ip->i_d.di_ctime.t_sec; | ||||
| 	inode->i_ctime.tv_nsec = ip->i_d.di_ctime.t_nsec; | ||||
| 
 | ||||
| 	xflags = xfs_ip2xflags(ip); | ||||
| 	if (xflags & XFS_XFLAG_IMMUTABLE) | ||||
| 		inode->i_flags |= S_IMMUTABLE; | ||||
| 	else | ||||
| 		inode->i_flags &= ~S_IMMUTABLE; | ||||
| 	if (xflags & XFS_XFLAG_APPEND) | ||||
| 		inode->i_flags |= S_APPEND; | ||||
| 	else | ||||
| 		inode->i_flags &= ~S_APPEND; | ||||
| 	if (xflags & XFS_XFLAG_SYNC) | ||||
| 		inode->i_flags |= S_SYNC; | ||||
| 	else | ||||
| 		inode->i_flags &= ~S_SYNC; | ||||
| 	if (xflags & XFS_XFLAG_NOATIME) | ||||
| 		inode->i_flags |= S_NOATIME; | ||||
| 	else | ||||
| 		inode->i_flags &= ~S_NOATIME; | ||||
| 	xfs_iunlock(ip, XFS_ILOCK_SHARED); | ||||
| 
 | ||||
| 	xfs_iflags_clear(ip, XFS_IMODIFIED); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Add a reference to a referenced vnode. | ||||
|  | ||||
| @ -67,7 +67,6 @@ static inline struct inode *vn_to_inode(bhv_vnode_t *vnode) | ||||
| 
 | ||||
| 
 | ||||
| extern void	vn_init(void); | ||||
| extern int	vn_revalidate(bhv_vnode_t *); | ||||
| 
 | ||||
| /*
 | ||||
|  * Yeah, these don't take vnode anymore at all, all this should be | ||||
|  | ||||
| @ -64,7 +64,7 @@ static int | ||||
| xfs_xattr_system_set(struct inode *inode, const char *name, | ||||
| 		const void *value, size_t size, int flags) | ||||
| { | ||||
| 	int error, acl; | ||||
| 	int acl; | ||||
| 
 | ||||
| 	acl = xfs_decode_acl(name); | ||||
| 	if (acl < 0) | ||||
| @ -75,10 +75,7 @@ xfs_xattr_system_set(struct inode *inode, const char *name, | ||||
| 	if (!value) | ||||
| 		return xfs_acl_vremove(inode, acl); | ||||
| 
 | ||||
| 	error = xfs_acl_vset(inode, (void *)value, size, acl); | ||||
| 	if (!error) | ||||
| 		vn_revalidate(inode); | ||||
| 	return error; | ||||
| 	return xfs_acl_vset(inode, (void *)value, size, acl); | ||||
| } | ||||
| 
 | ||||
| static struct xattr_handler xfs_xattr_system_handler = { | ||||
|  | ||||
| @ -83,6 +83,7 @@ xfs_setattr( | ||||
| 	cred_t			*credp) | ||||
| { | ||||
| 	xfs_mount_t		*mp = ip->i_mount; | ||||
| 	struct inode		*inode = XFS_ITOV(ip); | ||||
| 	int			mask = iattr->ia_valid; | ||||
| 	xfs_trans_t		*tp; | ||||
| 	int			code; | ||||
| @ -446,6 +447,9 @@ xfs_setattr( | ||||
| 		ip->i_d.di_mode &= S_IFMT; | ||||
| 		ip->i_d.di_mode |= iattr->ia_mode & ~S_IFMT; | ||||
| 
 | ||||
| 		inode->i_mode &= S_IFMT; | ||||
| 		inode->i_mode |= iattr->ia_mode & ~S_IFMT; | ||||
| 
 | ||||
| 		xfs_trans_log_inode (tp, ip, XFS_ILOG_CORE); | ||||
| 		timeflags |= XFS_ICHGTIME_CHG; | ||||
| 	} | ||||
| @ -481,6 +485,7 @@ xfs_setattr( | ||||
| 							&ip->i_udquot, udqp); | ||||
| 			} | ||||
| 			ip->i_d.di_uid = uid; | ||||
| 			inode->i_uid = uid; | ||||
| 		} | ||||
| 		if (igid != gid) { | ||||
| 			if (XFS_IS_GQUOTA_ON(mp)) { | ||||
| @ -491,6 +496,7 @@ xfs_setattr( | ||||
| 							&ip->i_gdquot, gdqp); | ||||
| 			} | ||||
| 			ip->i_d.di_gid = gid; | ||||
| 			inode->i_gid = gid; | ||||
| 		} | ||||
| 
 | ||||
| 		xfs_trans_log_inode (tp, ip, XFS_ILOG_CORE); | ||||
| @ -503,12 +509,14 @@ xfs_setattr( | ||||
| 	 */ | ||||
| 	if (mask & (ATTR_ATIME|ATTR_MTIME)) { | ||||
| 		if (mask & ATTR_ATIME) { | ||||
| 			inode->i_atime = iattr->ia_atime; | ||||
| 			ip->i_d.di_atime.t_sec = iattr->ia_atime.tv_sec; | ||||
| 			ip->i_d.di_atime.t_nsec = iattr->ia_atime.tv_nsec; | ||||
| 			ip->i_update_core = 1; | ||||
| 			timeflags &= ~XFS_ICHGTIME_ACC; | ||||
| 		} | ||||
| 		if (mask & ATTR_MTIME) { | ||||
| 			inode->i_mtime = iattr->ia_mtime; | ||||
| 			ip->i_d.di_mtime.t_sec = iattr->ia_mtime.tv_sec; | ||||
| 			ip->i_d.di_mtime.t_nsec = iattr->ia_mtime.tv_nsec; | ||||
| 			timeflags &= ~XFS_ICHGTIME_MOD; | ||||
| @ -524,6 +532,7 @@ xfs_setattr( | ||||
| 	 */ | ||||
| 
 | ||||
| 	if ((flags & XFS_ATTR_DMI) && (mask & ATTR_CTIME)) { | ||||
| 		inode->i_ctime = iattr->ia_ctime; | ||||
| 		ip->i_d.di_ctime.t_sec = iattr->ia_ctime.tv_sec; | ||||
| 		ip->i_d.di_ctime.t_nsec = iattr->ia_ctime.tv_nsec; | ||||
| 		ip->i_update_core = 1; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user