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

Commit 21a62542 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Lachlan McIlroy
Browse files

[XFS] simplify vn_revalidate



No need to allocate a bhv_vattr_t on stack and call xfs_getattr to update
a few fields in the Linux inode from the XFS inode, just do it directly.

And yes, this function is in dire need of a better name and prototype,
I'll do in a separate patch, though.

SGI-PV: 970705
SGI-Modid: xfs-linux-melb:xfs-kern:29713a

Signed-off-by: default avatarChristoph Hellwig <hch@infradead.org>
Signed-off-by: default avatarLachlan McIlroy <lachlan@sgi.com>
Signed-off-by: default avatarTim Shimmin <tes@sgi.com>
parent 15947f2d
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -1236,7 +1236,7 @@ xfs_ioc_xattr(

		error = xfs_setattr(ip, vattr, attr_flags, NULL);
		if (likely(!error))
			__vn_revalidate(vp, vattr);	/* update flags */
			vn_revalidate(vp);	/* update flags */
		error = -error;
		break;
	}
@@ -1271,7 +1271,7 @@ xfs_ioc_xattr(

		error = xfs_setattr(ip, vattr, attr_flags, NULL);
		if (likely(!error))
			__vn_revalidate(vp, vattr);	/* update flags */
			vn_revalidate(vp);	/* update flags */
		error = -error;
		break;
	}
+1 −1
Original line number Diff line number Diff line
@@ -636,7 +636,7 @@ xfs_vn_setattr(

	error = xfs_setattr(XFS_I(inode), &vattr, flags, NULL);
	if (likely(!error))
		__vn_revalidate(vn_from_inode(inode), &vattr);
		vn_revalidate(vn_from_inode(inode));
	return -error;
}

+34 −46
Original line number Diff line number Diff line
@@ -97,69 +97,57 @@ vn_initialize(
}

/*
 * Revalidate the Linux inode from the vattr.
 * Revalidate the Linux inode from the XFS inode.
 * Note: i_size _not_ updated; we must hold the inode
 * semaphore when doing that - callers responsibility.
 */
void
vn_revalidate_core(
	bhv_vnode_t	*vp,
	bhv_vattr_t	*vap)
int
vn_revalidate(
	bhv_vnode_t		*vp)
{
	struct inode		*inode = vn_to_inode(vp);

	inode->i_mode	    = vap->va_mode;
	inode->i_nlink	    = vap->va_nlink;
	inode->i_uid	    = vap->va_uid;
	inode->i_gid	    = vap->va_gid;
	inode->i_blocks	    = vap->va_nblocks;
	inode->i_mtime	    = vap->va_mtime;
	inode->i_ctime	    = vap->va_ctime;
	if (vap->va_xflags & XFS_XFLAG_IMMUTABLE)
	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_nlink	    = ip->i_d.di_nlink;
	inode->i_uid	    = ip->i_d.di_uid;
	inode->i_gid	    = ip->i_d.di_gid;
	inode->i_blocks	    =
		XFS_FSB_TO_BB(mp, ip->i_d.di_nblocks + ip->i_delayed_blks);
	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 (vap->va_xflags & XFS_XFLAG_APPEND)
	if (xflags & XFS_XFLAG_APPEND)
		inode->i_flags |= S_APPEND;
	else
		inode->i_flags &= ~S_APPEND;
	if (vap->va_xflags & XFS_XFLAG_SYNC)
	if (xflags & XFS_XFLAG_SYNC)
		inode->i_flags |= S_SYNC;
	else
		inode->i_flags &= ~S_SYNC;
	if (vap->va_xflags & XFS_XFLAG_NOATIME)
	if (xflags & XFS_XFLAG_NOATIME)
		inode->i_flags |= S_NOATIME;
	else
		inode->i_flags &= ~S_NOATIME;
}

/*
 * Revalidate the Linux inode from the vnode.
 */
int
__vn_revalidate(
	bhv_vnode_t	*vp,
	bhv_vattr_t	*vattr)
{
	int		error;

	xfs_itrace_entry(xfs_vtoi(vp));
	vattr->va_mask = XFS_AT_STAT | XFS_AT_XFLAGS;
	error = xfs_getattr(xfs_vtoi(vp), vattr, 0);
	if (likely(!error)) {
		vn_revalidate_core(vp, vattr);
		xfs_iflags_clear(xfs_vtoi(vp), XFS_IMODIFIED);
	}
	return -error;
}

int
vn_revalidate(
	bhv_vnode_t	*vp)
{
	bhv_vattr_t	vattr;
	xfs_iunlock(ip, XFS_ILOCK_SHARED);

	return __vn_revalidate(vp, &vattr);
	xfs_iflags_clear(ip, XFS_IMODIFIED);
	return 0;
}

/*
+0 −2
Original line number Diff line number Diff line
@@ -189,8 +189,6 @@ typedef struct bhv_vattr {
extern void	vn_init(void);
extern bhv_vnode_t	*vn_initialize(struct inode *);
extern int	vn_revalidate(bhv_vnode_t *);
extern int	__vn_revalidate(bhv_vnode_t *, bhv_vattr_t *);
extern void	vn_revalidate_core(bhv_vnode_t *, bhv_vattr_t *);

/*
 * Yeah, these don't take vnode anymore at all, all this should be