diff --git a/fs/ext2/dir.c b/fs/ext2/dir.c
index b3dbd716cd3a19b537c87b88048cd54ee43d7e50..8a27dcc096b56148fe4a5c2192cfbf7c54af3268 100644
--- a/fs/ext2/dir.c
+++ b/fs/ext2/dir.c
@@ -369,6 +369,14 @@ struct ext2_dir_entry_2 * ext2_find_entry (struct inode * dir,
 		}
 		if (++n >= npages)
 			n = 0;
+		/* next page is past the blocks we've got */
+		if (unlikely(n > (dir->i_blocks >> (PAGE_CACHE_SHIFT - 9)))) {
+			ext2_error(dir->i_sb, __FUNCTION__,
+				"dir %lu size %lld exceeds block count %llu",
+				dir->i_ino, dir->i_size,
+				(unsigned long long)dir->i_blocks);
+				goto out;
+		}
 	} while (n != start);
 out:
 	return NULL;