diff options
| author | Christoph Hellwig <hch@infradead.org> | 2008-07-21 16:16:15 +1000 | 
|---|---|---|
| committer | Niv Sardi <xaiki@debian.org> | 2008-07-28 16:59:39 +1000 | 
| commit | f13fae2d2a9372a5155d20bc9da4c14f02193277 (patch) | |
| tree | 19bca1e8b3d5034ff84ad19e6a7640216ed3afaf /fs/xfs | |
| parent | 0f285c8a1c4cacfd9f2aec077b06e2b537ee57ab (diff) | |
[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>
Diffstat (limited to 'fs/xfs')
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_ioctl.c | 29 | ||||
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_iops.c | 16 | ||||
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_vnode.c | 50 | ||||
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_vnode.h | 1 | ||||
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_xattr.c | 7 | ||||
| -rw-r--r-- | fs/xfs/xfs_vnodeops.c | 9 | 
6 files changed, 39 insertions, 73 deletions
| diff --git a/fs/xfs/linux-2.6/xfs_ioctl.c b/fs/xfs/linux-2.6/xfs_ioctl.c index d1b0da6bcdca..acb978d9d085 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl.c +++ b/fs/xfs/linux-2.6/xfs_ioctl.c @@ -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: diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c index 669bbdc20857..e88f51028086 100644 --- a/fs/xfs/linux-2.6/xfs_iops.c +++ b/fs/xfs/linux-2.6/xfs_iops.c @@ -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);  }  /* diff --git a/fs/xfs/linux-2.6/xfs_vnode.c b/fs/xfs/linux-2.6/xfs_vnode.c index bc7afe007338..25488b6d9881 100644 --- a/fs/xfs/linux-2.6/xfs_vnode.c +++ b/fs/xfs/linux-2.6/xfs_vnode.c @@ -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. diff --git a/fs/xfs/linux-2.6/xfs_vnode.h b/fs/xfs/linux-2.6/xfs_vnode.h index 96e4a7b5391c..41ca2cec5d31 100644 --- a/fs/xfs/linux-2.6/xfs_vnode.h +++ b/fs/xfs/linux-2.6/xfs_vnode.h @@ -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 diff --git a/fs/xfs/linux-2.6/xfs_xattr.c b/fs/xfs/linux-2.6/xfs_xattr.c index b4acb68fc9f7..964621fde6ed 100644 --- a/fs/xfs/linux-2.6/xfs_xattr.c +++ b/fs/xfs/linux-2.6/xfs_xattr.c @@ -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 = { diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index b792a121b1a7..76a1166af822 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -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; | 
