ext4_fsblk_t *pblk, int depth)
 {
        unsigned short entries;
+       ext4_lblk_t lblock = 0;
+       ext4_lblk_t prev = 0;
+
        if (eh->eh_entries == 0)
                return 1;
 
        if (depth == 0) {
                /* leaf entries */
                struct ext4_extent *ext = EXT_FIRST_EXTENT(eh);
-               ext4_lblk_t lblock = 0;
-               ext4_lblk_t prev = 0;
-               int len = 0;
                while (entries) {
                        if (!ext4_valid_extent(inode, ext))
                                return 0;
 
                        /* Check for overlapping extents */
                        lblock = le32_to_cpu(ext->ee_block);
-                       len = ext4_ext_get_actual_len(ext);
                        if ((lblock <= prev) && prev) {
                                *pblk = ext4_ext_pblock(ext);
                                return 0;
                        }
+                       prev = lblock + ext4_ext_get_actual_len(ext) - 1;
                        ext++;
                        entries--;
-                       prev = lblock + len - 1;
                }
        } else {
                struct ext4_extent_idx *ext_idx = EXT_FIRST_INDEX(eh);
                while (entries) {
                        if (!ext4_valid_extent_idx(inode, ext_idx))
                                return 0;
+
+                       /* Check for overlapping index extents */
+                       lblock = le32_to_cpu(ext_idx->ei_block);
+                       if ((lblock <= prev) && prev) {
+                               *pblk = ext4_idx_pblock(ext_idx);
+                               return 0;
+                       }
                        ext_idx++;
                        entries--;
+                       prev = lblock;
                }
        }
        return 1;