aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/xfs/linux-2.6/xfs_sync.c26
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
708restart: 717restart:
@@ -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