mirror of https://gitee.com/openkylin/linux.git
[XFS] mark inodes for reclaim via a tag in the inode radix tree
Prepare for removing the deleted inode list by marking inodes for reclaim in the inode radix trees so that we can use the radix trees to find reclaimable inodes. SGI-PV: 988142 SGI-Modid: xfs-linux-melb:xfs-kern:32331a Signed-off-by: David Chinner <david@fromorbit.com> Signed-off-by: Lachlan McIlroy <lachlan@sgi.com> Signed-off-by: Christoph Hellwig <hch@infradead.org>
This commit is contained in:
parent
1dc3318ae1
commit
396beb8531
|
@ -644,6 +644,47 @@ xfs_reclaim_inode(
|
|||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
xfs_inode_set_reclaim_tag(
|
||||
xfs_inode_t *ip)
|
||||
{
|
||||
xfs_mount_t *mp = ip->i_mount;
|
||||
xfs_perag_t *pag = xfs_get_perag(mp, ip->i_ino);
|
||||
|
||||
read_lock(&pag->pag_ici_lock);
|
||||
spin_lock(&ip->i_flags_lock);
|
||||
radix_tree_tag_set(&pag->pag_ici_root,
|
||||
XFS_INO_TO_AGINO(mp, ip->i_ino), XFS_ICI_RECLAIM_TAG);
|
||||
spin_unlock(&ip->i_flags_lock);
|
||||
read_unlock(&pag->pag_ici_lock);
|
||||
xfs_put_perag(mp, pag);
|
||||
}
|
||||
|
||||
void
|
||||
__xfs_inode_clear_reclaim_tag(
|
||||
xfs_mount_t *mp,
|
||||
xfs_perag_t *pag,
|
||||
xfs_inode_t *ip)
|
||||
{
|
||||
radix_tree_tag_clear(&pag->pag_ici_root,
|
||||
XFS_INO_TO_AGINO(mp, ip->i_ino), XFS_ICI_RECLAIM_TAG);
|
||||
}
|
||||
|
||||
void
|
||||
xfs_inode_clear_reclaim_tag(
|
||||
xfs_inode_t *ip)
|
||||
{
|
||||
xfs_mount_t *mp = ip->i_mount;
|
||||
xfs_perag_t *pag = xfs_get_perag(mp, ip->i_ino);
|
||||
|
||||
read_lock(&pag->pag_ici_lock);
|
||||
spin_lock(&ip->i_flags_lock);
|
||||
__xfs_inode_clear_reclaim_tag(mp, pag, ip);
|
||||
spin_unlock(&ip->i_flags_lock);
|
||||
read_unlock(&pag->pag_ici_lock);
|
||||
xfs_put_perag(mp, pag);
|
||||
}
|
||||
|
||||
int
|
||||
xfs_reclaim_inodes(
|
||||
xfs_mount_t *mp,
|
||||
|
|
|
@ -48,4 +48,8 @@ void xfs_flush_device(struct xfs_inode *ip);
|
|||
int xfs_reclaim_inode(struct xfs_inode *ip, int locked, int sync_mode);
|
||||
int xfs_reclaim_inodes(struct xfs_mount *mp, int noblock, int mode);
|
||||
|
||||
void xfs_inode_set_reclaim_tag(struct xfs_inode *ip);
|
||||
void xfs_inode_clear_reclaim_tag(struct xfs_inode *ip);
|
||||
void __xfs_inode_clear_reclaim_tag(struct xfs_mount *mp, struct xfs_perag *pag,
|
||||
struct xfs_inode *ip);
|
||||
#endif
|
||||
|
|
|
@ -204,6 +204,11 @@ typedef struct xfs_perag
|
|||
#endif
|
||||
} xfs_perag_t;
|
||||
|
||||
/*
|
||||
* tags for inode radix tree
|
||||
*/
|
||||
#define XFS_ICI_RECLAIM_TAG 0 /* inode is to be reclaimed */
|
||||
|
||||
#define XFS_AG_MAXLEVELS(mp) ((mp)->m_ag_maxlevels)
|
||||
#define XFS_MIN_FREELIST_RAW(bl,cl,mp) \
|
||||
(MIN(bl + 1, XFS_AG_MAXLEVELS(mp)) + MIN(cl + 1, XFS_AG_MAXLEVELS(mp)))
|
||||
|
|
|
@ -91,6 +91,9 @@ xfs_iget_cache_hit(
|
|||
}
|
||||
xfs_iflags_set(ip, XFS_INEW);
|
||||
xfs_iflags_clear(ip, XFS_IRECLAIMABLE);
|
||||
|
||||
/* clear the radix tree reclaim flag as well. */
|
||||
__xfs_inode_clear_reclaim_tag(mp, pag, ip);
|
||||
read_unlock(&pag->pag_ici_lock);
|
||||
|
||||
XFS_MOUNT_ILOCK(mp);
|
||||
|
|
|
@ -2845,6 +2845,7 @@ xfs_reclaim(
|
|||
spin_unlock(&ip->i_flags_lock);
|
||||
list_add_tail(&ip->i_reclaim, &mp->m_del_inodes);
|
||||
XFS_MOUNT_IUNLOCK(mp);
|
||||
xfs_inode_set_reclaim_tag(ip);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue