[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:
Родитель
0f285c8a1c
Коммит
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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче