Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f13fae2d authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Niv Sardi
Browse files

[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: default avatarChristoph Hellwig <hch@infradead.org>
Signed-off-by: default avatarTim Shimmin <tes@sgi.com>
Signed-off-by: default avatarLachlan McIlroy <lachlan@sgi.com>
parent 0f285c8a
Loading
Loading
Loading
Loading
+27 −2
Original line number Diff line number Diff line
@@ -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:
+1 −15
Original line number Diff line number Diff line
@@ -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);
}

/*
+0 −50
Original line number Diff line number Diff line
@@ -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.
+0 −1
Original line number Diff line number Diff line
@@ -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
+2 −5
Original line number Diff line number Diff line
@@ -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 = {
Loading