diff options
-rw-r--r-- | fs/xfs/linux-2.6/xfs_sync.c | 41 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_sync.h | 4 | ||||
-rw-r--r-- | fs/xfs/xfs_ag.h | 5 | ||||
-rw-r--r-- | fs/xfs/xfs_iget.c | 3 | ||||
-rw-r--r-- | fs/xfs/xfs_vnodeops.c | 1 |
5 files changed, 54 insertions, 0 deletions
diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c index 34413ceaea9f..9e7f4dccab72 100644 --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c | |||
@@ -644,6 +644,47 @@ xfs_reclaim_inode( | |||
644 | return 0; | 644 | return 0; |
645 | } | 645 | } |
646 | 646 | ||
647 | void | ||
648 | xfs_inode_set_reclaim_tag( | ||
649 | xfs_inode_t *ip) | ||
650 | { | ||
651 | xfs_mount_t *mp = ip->i_mount; | ||
652 | xfs_perag_t *pag = xfs_get_perag(mp, ip->i_ino); | ||
653 | |||
654 | read_lock(&pag->pag_ici_lock); | ||
655 | spin_lock(&ip->i_flags_lock); | ||
656 | radix_tree_tag_set(&pag->pag_ici_root, | ||
657 | XFS_INO_TO_AGINO(mp, ip->i_ino), XFS_ICI_RECLAIM_TAG); | ||
658 | spin_unlock(&ip->i_flags_lock); | ||
659 | read_unlock(&pag->pag_ici_lock); | ||
660 | xfs_put_perag(mp, pag); | ||
661 | } | ||
662 | |||
663 | void | ||
664 | __xfs_inode_clear_reclaim_tag( | ||
665 | xfs_mount_t *mp, | ||
666 | xfs_perag_t *pag, | ||
667 | xfs_inode_t *ip) | ||
668 | { | ||
669 | radix_tree_tag_clear(&pag->pag_ici_root, | ||
670 | XFS_INO_TO_AGINO(mp, ip->i_ino), XFS_ICI_RECLAIM_TAG); | ||
671 | } | ||
672 | |||
673 | void | ||
674 | xfs_inode_clear_reclaim_tag( | ||
675 | xfs_inode_t *ip) | ||
676 | { | ||
677 | xfs_mount_t *mp = ip->i_mount; | ||
678 | xfs_perag_t *pag = xfs_get_perag(mp, ip->i_ino); | ||
679 | |||
680 | read_lock(&pag->pag_ici_lock); | ||
681 | spin_lock(&ip->i_flags_lock); | ||
682 | __xfs_inode_clear_reclaim_tag(mp, pag, ip); | ||
683 | spin_unlock(&ip->i_flags_lock); | ||
684 | read_unlock(&pag->pag_ici_lock); | ||
685 | xfs_put_perag(mp, pag); | ||
686 | } | ||
687 | |||
647 | int | 688 | int |
648 | xfs_reclaim_inodes( | 689 | xfs_reclaim_inodes( |
649 | xfs_mount_t *mp, | 690 | xfs_mount_t *mp, |
diff --git a/fs/xfs/linux-2.6/xfs_sync.h b/fs/xfs/linux-2.6/xfs_sync.h index c1bcd500509a..5f6de1efe1f6 100644 --- a/fs/xfs/linux-2.6/xfs_sync.h +++ b/fs/xfs/linux-2.6/xfs_sync.h | |||
@@ -48,4 +48,8 @@ void xfs_flush_device(struct xfs_inode *ip); | |||
48 | int xfs_reclaim_inode(struct xfs_inode *ip, int locked, int sync_mode); | 48 | int xfs_reclaim_inode(struct xfs_inode *ip, int locked, int sync_mode); |
49 | int xfs_reclaim_inodes(struct xfs_mount *mp, int noblock, int mode); | 49 | int xfs_reclaim_inodes(struct xfs_mount *mp, int noblock, int mode); |
50 | 50 | ||
51 | void xfs_inode_set_reclaim_tag(struct xfs_inode *ip); | ||
52 | void xfs_inode_clear_reclaim_tag(struct xfs_inode *ip); | ||
53 | void __xfs_inode_clear_reclaim_tag(struct xfs_mount *mp, struct xfs_perag *pag, | ||
54 | struct xfs_inode *ip); | ||
51 | #endif | 55 | #endif |
diff --git a/fs/xfs/xfs_ag.h b/fs/xfs/xfs_ag.h index 729ee3eb39ad..2bfd86329141 100644 --- a/fs/xfs/xfs_ag.h +++ b/fs/xfs/xfs_ag.h | |||
@@ -204,6 +204,11 @@ typedef struct xfs_perag | |||
204 | #endif | 204 | #endif |
205 | } xfs_perag_t; | 205 | } xfs_perag_t; |
206 | 206 | ||
207 | /* | ||
208 | * tags for inode radix tree | ||
209 | */ | ||
210 | #define XFS_ICI_RECLAIM_TAG 0 /* inode is to be reclaimed */ | ||
211 | |||
207 | #define XFS_AG_MAXLEVELS(mp) ((mp)->m_ag_maxlevels) | 212 | #define XFS_AG_MAXLEVELS(mp) ((mp)->m_ag_maxlevels) |
208 | #define XFS_MIN_FREELIST_RAW(bl,cl,mp) \ | 213 | #define XFS_MIN_FREELIST_RAW(bl,cl,mp) \ |
209 | (MIN(bl + 1, XFS_AG_MAXLEVELS(mp)) + MIN(cl + 1, XFS_AG_MAXLEVELS(mp))) | 214 | (MIN(bl + 1, XFS_AG_MAXLEVELS(mp)) + MIN(cl + 1, XFS_AG_MAXLEVELS(mp))) |
diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index c4414e8bce8d..a0387f14c204 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c | |||
@@ -91,6 +91,9 @@ xfs_iget_cache_hit( | |||
91 | } | 91 | } |
92 | xfs_iflags_set(ip, XFS_INEW); | 92 | xfs_iflags_set(ip, XFS_INEW); |
93 | xfs_iflags_clear(ip, XFS_IRECLAIMABLE); | 93 | xfs_iflags_clear(ip, XFS_IRECLAIMABLE); |
94 | |||
95 | /* clear the radix tree reclaim flag as well. */ | ||
96 | __xfs_inode_clear_reclaim_tag(mp, pag, ip); | ||
94 | read_unlock(&pag->pag_ici_lock); | 97 | read_unlock(&pag->pag_ici_lock); |
95 | 98 | ||
96 | XFS_MOUNT_ILOCK(mp); | 99 | XFS_MOUNT_ILOCK(mp); |
diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index 07945634923b..f89a73eb0167 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c | |||
@@ -2845,6 +2845,7 @@ xfs_reclaim( | |||
2845 | spin_unlock(&ip->i_flags_lock); | 2845 | spin_unlock(&ip->i_flags_lock); |
2846 | list_add_tail(&ip->i_reclaim, &mp->m_del_inodes); | 2846 | list_add_tail(&ip->i_reclaim, &mp->m_del_inodes); |
2847 | XFS_MOUNT_IUNLOCK(mp); | 2847 | XFS_MOUNT_IUNLOCK(mp); |
2848 | xfs_inode_set_reclaim_tag(ip); | ||
2848 | } | 2849 | } |
2849 | return 0; | 2850 | return 0; |
2850 | } | 2851 | } |