diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/xfs/linux-2.6/xfs_sync.c | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c index 22006b5733c4..ee1648b179f7 100644 --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c | |||
@@ -59,7 +59,7 @@ xfs_sync_inodes_ag( | |||
59 | { | 59 | { |
60 | xfs_perag_t *pag = &mp->m_perag[ag]; | 60 | xfs_perag_t *pag = &mp->m_perag[ag]; |
61 | int nr_found; | 61 | int nr_found; |
62 | int first_index = 0; | 62 | uint32_t first_index = 0; |
63 | int error = 0; | 63 | int error = 0; |
64 | int last_error = 0; | 64 | int last_error = 0; |
65 | int fflag = XFS_B_ASYNC; | 65 | int fflag = XFS_B_ASYNC; |
@@ -97,8 +97,17 @@ xfs_sync_inodes_ag( | |||
97 | break; | 97 | break; |
98 | } | 98 | } |
99 | 99 | ||
100 | /* update the index for the next lookup */ | 100 | /* |
101 | * Update the index for the next lookup. Catch overflows | ||
102 | * into the next AG range which can occur if we have inodes | ||
103 | * in the last block of the AG and we are currently | ||
104 | * pointing to the last inode. | ||
105 | */ | ||
101 | first_index = XFS_INO_TO_AGINO(mp, ip->i_ino + 1); | 106 | first_index = XFS_INO_TO_AGINO(mp, ip->i_ino + 1); |
107 | if (first_index < XFS_INO_TO_AGINO(mp, ip->i_ino)) { | ||
108 | read_unlock(&pag->pag_ici_lock); | ||
109 | break; | ||
110 | } | ||
102 | 111 | ||
103 | /* | 112 | /* |
104 | * skip inodes in reclaim. Let xfs_syncsub do that for | 113 | * skip inodes in reclaim. Let xfs_syncsub do that for |
@@ -702,7 +711,7 @@ xfs_reclaim_inodes_ag( | |||
702 | xfs_inode_t *ip = NULL; | 711 | xfs_inode_t *ip = NULL; |
703 | xfs_perag_t *pag = &mp->m_perag[ag]; | 712 | xfs_perag_t *pag = &mp->m_perag[ag]; |
704 | int nr_found; | 713 | int nr_found; |
705 | int first_index; | 714 | uint32_t first_index; |
706 | int skipped; | 715 | int skipped; |
707 | 716 | ||
708 | restart: | 717 | restart: |
@@ -724,8 +733,17 @@ restart: | |||
724 | break; | 733 | break; |
725 | } | 734 | } |
726 | 735 | ||
727 | /* update the index for the next lookup */ | 736 | /* |
737 | * Update the index for the next lookup. Catch overflows | ||
738 | * into the next AG range which can occur if we have inodes | ||
739 | * in the last block of the AG and we are currently | ||
740 | * pointing to the last inode. | ||
741 | */ | ||
728 | first_index = XFS_INO_TO_AGINO(mp, ip->i_ino + 1); | 742 | first_index = XFS_INO_TO_AGINO(mp, ip->i_ino + 1); |
743 | if (first_index < XFS_INO_TO_AGINO(mp, ip->i_ino)) { | ||
744 | read_unlock(&pag->pag_ici_lock); | ||
745 | break; | ||
746 | } | ||
729 | 747 | ||
730 | ASSERT(xfs_iflags_test(ip, (XFS_IRECLAIMABLE|XFS_IRECLAIM))); | 748 | ASSERT(xfs_iflags_test(ip, (XFS_IRECLAIMABLE|XFS_IRECLAIM))); |
731 | 749 | ||