Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5a90e53e authored by Dave Chinner's avatar Dave Chinner Committed by Dave Chinner
Browse files

xfs: xfs_iflush_cluster has range issues



xfs_iflush_cluster() does a gang lookup on the radix tree, meaning
it can find inodes beyond the current cluster if there is sparse
cache population. gang lookups return results in ascending index
order, so stop trying to cluster inodes once the first inode outside
the cluster mask is detected.

Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
parent 8a17d7dd
Loading
Loading
Loading
Loading
+11 −2
Original line number Diff line number Diff line
@@ -3207,11 +3207,20 @@ xfs_iflush_cluster(
		 */
		spin_lock(&iq->i_flags_lock);
		if (!iq->i_ino ||
		    __xfs_iflags_test(iq, XFS_ISTALE) ||
		    (XFS_INO_TO_AGINO(mp, iq->i_ino) & mask) != first_index) {
		    __xfs_iflags_test(iq, XFS_ISTALE)) {
			spin_unlock(&iq->i_flags_lock);
			continue;
		}

		/*
		 * Once we fall off the end of the cluster, no point checking
		 * any more inodes in the list because they will also all be
		 * outside the cluster.
		 */
		if ((XFS_INO_TO_AGINO(mp, iq->i_ino) & mask) != first_index) {
			spin_unlock(&iq->i_flags_lock);
			break;
		}
		spin_unlock(&iq->i_flags_lock);

		/*