Commit 7a18c386 authored by David Chinner's avatar David Chinner Committed by Tim Shimmin

[XFS] Clean up i_flags and i_flags_lock handling.

SGI-PV: 956832
SGI-Modid: xfs-linux-melb:xfs-kern:27358a
Signed-off-by: default avatarDavid Chinner <dgc@sgi.com>
Signed-off-by: default avatarNathan Scott <nscott@aconex.com>
Signed-off-by: default avatarTim Shimmin <tes@sgi.com>
parent 2e2e7bb1
...@@ -227,9 +227,7 @@ xfs_initialize_vnode( ...@@ -227,9 +227,7 @@ xfs_initialize_vnode(
xfs_revalidate_inode(XFS_BHVTOM(bdp), vp, ip); xfs_revalidate_inode(XFS_BHVTOM(bdp), vp, ip);
xfs_set_inodeops(inode); xfs_set_inodeops(inode);
spin_lock(&ip->i_flags_lock); xfs_iflags_clear(ip, XFS_INEW);
ip->i_flags &= ~XFS_INEW;
spin_unlock(&ip->i_flags_lock);
barrier(); barrier();
unlock_new_inode(inode); unlock_new_inode(inode);
......
...@@ -215,7 +215,7 @@ again: ...@@ -215,7 +215,7 @@ again:
* If INEW is set this inode is being set up * If INEW is set this inode is being set up
* we need to pause and try again. * we need to pause and try again.
*/ */
if (ip->i_flags & XFS_INEW) { if (xfs_iflags_test(ip, XFS_INEW)) {
read_unlock(&ih->ih_lock); read_unlock(&ih->ih_lock);
delay(1); delay(1);
XFS_STATS_INC(xs_ig_frecycle); XFS_STATS_INC(xs_ig_frecycle);
...@@ -230,7 +230,7 @@ again: ...@@ -230,7 +230,7 @@ again:
* on its way out of the system, * on its way out of the system,
* we need to pause and try again. * we need to pause and try again.
*/ */
if (ip->i_flags & XFS_IRECLAIM) { if (xfs_iflags_test(ip, XFS_IRECLAIM)) {
read_unlock(&ih->ih_lock); read_unlock(&ih->ih_lock);
delay(1); delay(1);
XFS_STATS_INC(xs_ig_frecycle); XFS_STATS_INC(xs_ig_frecycle);
...@@ -243,9 +243,7 @@ again: ...@@ -243,9 +243,7 @@ again:
XFS_STATS_INC(xs_ig_found); XFS_STATS_INC(xs_ig_found);
spin_lock(&ip->i_flags_lock); xfs_iflags_clear(ip, XFS_IRECLAIMABLE);
ip->i_flags &= ~XFS_IRECLAIMABLE;
spin_unlock(&ip->i_flags_lock);
version = ih->ih_version; version = ih->ih_version;
read_unlock(&ih->ih_lock); read_unlock(&ih->ih_lock);
xfs_ihash_promote(ih, ip, version); xfs_ihash_promote(ih, ip, version);
...@@ -299,10 +297,7 @@ finish_inode: ...@@ -299,10 +297,7 @@ finish_inode:
if (lock_flags != 0) if (lock_flags != 0)
xfs_ilock(ip, lock_flags); xfs_ilock(ip, lock_flags);
spin_lock(&ip->i_flags_lock); xfs_iflags_clear(ip, XFS_ISTALE);
ip->i_flags &= ~XFS_ISTALE;
spin_unlock(&ip->i_flags_lock);
vn_trace_exit(vp, "xfs_iget.found", vn_trace_exit(vp, "xfs_iget.found",
(inst_t *)__return_address); (inst_t *)__return_address);
goto return_ip; goto return_ip;
...@@ -371,10 +366,7 @@ finish_inode: ...@@ -371,10 +366,7 @@ finish_inode:
ih->ih_next = ip; ih->ih_next = ip;
ip->i_udquot = ip->i_gdquot = NULL; ip->i_udquot = ip->i_gdquot = NULL;
ih->ih_version++; ih->ih_version++;
spin_lock(&ip->i_flags_lock); xfs_iflags_set(ip, XFS_INEW);
ip->i_flags |= XFS_INEW;
spin_unlock(&ip->i_flags_lock);
write_unlock(&ih->ih_lock); write_unlock(&ih->ih_lock);
/* /*
...@@ -625,7 +617,7 @@ xfs_iput_new(xfs_inode_t *ip, ...@@ -625,7 +617,7 @@ xfs_iput_new(xfs_inode_t *ip,
vn_trace_entry(vp, "xfs_iput_new", (inst_t *)__return_address); vn_trace_entry(vp, "xfs_iput_new", (inst_t *)__return_address);
if ((ip->i_d.di_mode == 0)) { if ((ip->i_d.di_mode == 0)) {
ASSERT(!(ip->i_flags & XFS_IRECLAIMABLE)); ASSERT(!xfs_iflags_test(ip, XFS_IRECLAIMABLE));
vn_mark_bad(vp); vn_mark_bad(vp);
} }
if (inode->i_state & I_NEW) if (inode->i_state & I_NEW)
......
...@@ -2193,7 +2193,7 @@ xfs_ifree_cluster( ...@@ -2193,7 +2193,7 @@ xfs_ifree_cluster(
/* Inode not in memory or we found it already, /* Inode not in memory or we found it already,
* nothing to do * nothing to do
*/ */
if (!ip || (ip->i_flags & XFS_ISTALE)) { if (!ip || xfs_iflags_test(ip, XFS_ISTALE)) {
read_unlock(&ih->ih_lock); read_unlock(&ih->ih_lock);
continue; continue;
} }
...@@ -2215,10 +2215,7 @@ xfs_ifree_cluster( ...@@ -2215,10 +2215,7 @@ xfs_ifree_cluster(
if (ip == free_ip) { if (ip == free_ip) {
if (xfs_iflock_nowait(ip)) { if (xfs_iflock_nowait(ip)) {
spin_lock(&ip->i_flags_lock); xfs_iflags_set(ip, XFS_ISTALE);
ip->i_flags |= XFS_ISTALE;
spin_unlock(&ip->i_flags_lock);
if (xfs_inode_clean(ip)) { if (xfs_inode_clean(ip)) {
xfs_ifunlock(ip); xfs_ifunlock(ip);
} else { } else {
...@@ -2231,9 +2228,7 @@ xfs_ifree_cluster( ...@@ -2231,9 +2228,7 @@ xfs_ifree_cluster(
if (xfs_ilock_nowait(ip, XFS_ILOCK_EXCL)) { if (xfs_ilock_nowait(ip, XFS_ILOCK_EXCL)) {
if (xfs_iflock_nowait(ip)) { if (xfs_iflock_nowait(ip)) {
spin_lock(&ip->i_flags_lock); xfs_iflags_set(ip, XFS_ISTALE);
ip->i_flags |= XFS_ISTALE;
spin_unlock(&ip->i_flags_lock);
if (xfs_inode_clean(ip)) { if (xfs_inode_clean(ip)) {
xfs_ifunlock(ip); xfs_ifunlock(ip);
...@@ -2263,9 +2258,7 @@ xfs_ifree_cluster( ...@@ -2263,9 +2258,7 @@ xfs_ifree_cluster(
AIL_LOCK(mp,s); AIL_LOCK(mp,s);
iip->ili_flush_lsn = iip->ili_item.li_lsn; iip->ili_flush_lsn = iip->ili_item.li_lsn;
AIL_UNLOCK(mp, s); AIL_UNLOCK(mp, s);
spin_lock(&iip->ili_inode->i_flags_lock); xfs_iflags_set(ip, XFS_ISTALE);
iip->ili_inode->i_flags |= XFS_ISTALE;
spin_unlock(&iip->ili_inode->i_flags_lock);
pre_flushed++; pre_flushed++;
} }
lip = lip->li_bio_list; lip = lip->li_bio_list;
...@@ -2764,7 +2757,7 @@ xfs_iunpin( ...@@ -2764,7 +2757,7 @@ xfs_iunpin(
struct inode *inode = NULL; struct inode *inode = NULL;
spin_lock(&ip->i_flags_lock); spin_lock(&ip->i_flags_lock);
if (!(ip->i_flags & (XFS_IRECLAIM|XFS_IRECLAIMABLE))) { if (!__xfs_iflags_test(ip, XFS_IRECLAIM|XFS_IRECLAIMABLE)) {
bhv_vnode_t *vp = XFS_ITOV_NULL(ip); bhv_vnode_t *vp = XFS_ITOV_NULL(ip);
/* make sync come back and flush this inode */ /* make sync come back and flush this inode */
......
...@@ -305,6 +305,47 @@ typedef struct xfs_inode { ...@@ -305,6 +305,47 @@ typedef struct xfs_inode {
#endif #endif
} xfs_inode_t; } xfs_inode_t;
/*
* i_flags helper functions
*/
static inline void
__xfs_iflags_set(xfs_inode_t *ip, unsigned short flags)
{
ip->i_flags |= flags;
}
static inline void
xfs_iflags_set(xfs_inode_t *ip, unsigned short flags)
{
spin_lock(&ip->i_flags_lock);
__xfs_iflags_set(ip, flags);
spin_unlock(&ip->i_flags_lock);
}
static inline void
xfs_iflags_clear(xfs_inode_t *ip, unsigned short flags)
{
spin_lock(&ip->i_flags_lock);
ip->i_flags &= ~flags;
spin_unlock(&ip->i_flags_lock);
}
static inline int
__xfs_iflags_test(xfs_inode_t *ip, unsigned short flags)
{
return (ip->i_flags & flags);
}
static inline int
xfs_iflags_test(xfs_inode_t *ip, unsigned short flags)
{
int ret;
spin_lock(&ip->i_flags_lock);
ret = __xfs_iflags_test(ip, flags);
spin_unlock(&ip->i_flags_lock);
return ret;
}
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
......
...@@ -3844,9 +3844,7 @@ xfs_reclaim( ...@@ -3844,9 +3844,7 @@ xfs_reclaim(
XFS_MOUNT_ILOCK(mp); XFS_MOUNT_ILOCK(mp);
vn_bhv_remove(VN_BHV_HEAD(vp), XFS_ITOBHV(ip)); vn_bhv_remove(VN_BHV_HEAD(vp), XFS_ITOBHV(ip));
list_add_tail(&ip->i_reclaim, &mp->m_del_inodes); list_add_tail(&ip->i_reclaim, &mp->m_del_inodes);
spin_lock(&ip->i_flags_lock); xfs_iflags_set(ip, XFS_IRECLAIMABLE);
ip->i_flags |= XFS_IRECLAIMABLE;
spin_unlock(&ip->i_flags_lock);
XFS_MOUNT_IUNLOCK(mp); XFS_MOUNT_IUNLOCK(mp);
} }
return 0; return 0;
...@@ -3872,8 +3870,8 @@ xfs_finish_reclaim( ...@@ -3872,8 +3870,8 @@ xfs_finish_reclaim(
*/ */
write_lock(&ih->ih_lock); write_lock(&ih->ih_lock);
spin_lock(&ip->i_flags_lock); spin_lock(&ip->i_flags_lock);
if ((ip->i_flags & XFS_IRECLAIM) || if (__xfs_iflags_test(ip, XFS_IRECLAIM) ||
(!(ip->i_flags & XFS_IRECLAIMABLE) && vp == NULL)) { (!__xfs_iflags_test(ip, XFS_IRECLAIMABLE) && vp == NULL)) {
spin_unlock(&ip->i_flags_lock); spin_unlock(&ip->i_flags_lock);
write_unlock(&ih->ih_lock); write_unlock(&ih->ih_lock);
if (locked) { if (locked) {
...@@ -3882,7 +3880,7 @@ xfs_finish_reclaim( ...@@ -3882,7 +3880,7 @@ xfs_finish_reclaim(
} }
return 1; return 1;
} }
ip->i_flags |= XFS_IRECLAIM; __xfs_iflags_set(ip, XFS_IRECLAIM);
spin_unlock(&ip->i_flags_lock); spin_unlock(&ip->i_flags_lock);
write_unlock(&ih->ih_lock); write_unlock(&ih->ih_lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment