if (IS_ERR(path))
                return PTR_ERR(path);
        ex = path[path->p_depth].p_ext;
-       if (!ex) {
-               ext4_free_ext_path(path);
+       if (!ex)
                goto out;
-       }
        end = le32_to_cpu(ex->ee_block) + ext4_ext_get_actual_len(ex);
-       ext4_free_ext_path(path);
 
        /* Count the number of data blocks */
        cur = 0;
        ret = skip_hole(inode, &cur);
        if (ret < 0)
                goto out;
-       path = ext4_find_extent(inode, cur, NULL, 0);
+       path = ext4_find_extent(inode, cur, path, 0);
        if (IS_ERR(path))
                goto out;
        numblks += path->p_depth;
-       ext4_free_ext_path(path);
        while (cur < end) {
-               path = ext4_find_extent(inode, cur, NULL, 0);
+               path = ext4_find_extent(inode, cur, path, 0);
                if (IS_ERR(path))
                        break;
                ex = path[path->p_depth].p_ext;
-               if (!ex) {
-                       ext4_free_ext_path(path);
-                       return 0;
-               }
+               if (!ex)
+                       goto cleanup;
+
                cur = max(cur + 1, le32_to_cpu(ex->ee_block) +
                                        ext4_ext_get_actual_len(ex));
                ret = skip_hole(inode, &cur);
-               if (ret < 0) {
-                       ext4_free_ext_path(path);
+               if (ret < 0)
                        break;
-               }
-               path2 = ext4_find_extent(inode, cur, NULL, 0);
-               if (IS_ERR(path2)) {
-                       ext4_free_ext_path(path);
+
+               path2 = ext4_find_extent(inode, cur, path2, 0);
+               if (IS_ERR(path2))
                        break;
-               }
+
                for (i = 0; i <= max(path->p_depth, path2->p_depth); i++) {
                        cmp1 = cmp2 = 0;
                        if (i <= path->p_depth)
                        if (cmp1 != cmp2 && cmp2 != 0)
                                numblks++;
                }
-               ext4_free_ext_path(path);
-               ext4_free_ext_path(path2);
        }
 
 out:
        inode->i_blocks = numblks << (inode->i_sb->s_blocksize_bits - 9);
        ext4_mark_inode_dirty(NULL, inode);
+cleanup:
+       ext4_free_ext_path(path);
+       ext4_free_ext_path(path2);
        return 0;
 }
 
        if (IS_ERR(path))
                return PTR_ERR(path);
        ex = path[path->p_depth].p_ext;
-       if (!ex) {
-               ext4_free_ext_path(path);
-               return 0;
-       }
+       if (!ex)
+               goto out;
        end = le32_to_cpu(ex->ee_block) + ext4_ext_get_actual_len(ex);
-       ext4_free_ext_path(path);
 
        cur = 0;
        while (cur < end) {
                if (ret < 0)
                        break;
                if (ret > 0) {
-                       path = ext4_find_extent(inode, map.m_lblk, NULL, 0);
-                       if (!IS_ERR_OR_NULL(path)) {
+                       path = ext4_find_extent(inode, map.m_lblk, path, 0);
+                       if (!IS_ERR(path)) {
                                for (j = 0; j < path->p_depth; j++) {
-
                                        ext4_mb_mark_bb(inode->i_sb,
                                                        path[j].p_block, 1, false);
                                        ext4_fc_record_regions(inode->i_sb, inode->i_ino,
                                                        0, path[j].p_block, 1, 1);
                                }
-                               ext4_free_ext_path(path);
+                       } else {
+                               path = NULL;
                        }
                        ext4_mb_mark_bb(inode->i_sb, map.m_pblk, map.m_len, false);
                        ext4_fc_record_regions(inode->i_sb, inode->i_ino,
                cur = cur + map.m_len;
        }
 
+out:
+       ext4_free_ext_path(path);
        return 0;
 }
 
 
                if (ret == 0) {
                        /* Range is not mapped */
-                       path = ext4_find_extent(inode, cur, NULL, 0);
+                       path = ext4_find_extent(inode, cur, path, 0);
                        if (IS_ERR(path))
                                goto out;
                        memset(&newex, 0, sizeof(newex));
                        up_write((&EXT4_I(inode)->i_data_sem));
                        if (IS_ERR(path))
                                goto out;
-                       ext4_free_ext_path(path);
                        goto next;
                }
 
        ext4_ext_replay_shrink_inode(inode, i_size_read(inode) >>
                                        sb->s_blocksize_bits);
 out:
+       ext4_free_ext_path(path);
        iput(inode);
        return 0;
 }
                                break;
 
                        if (ret > 0) {
-                               path = ext4_find_extent(inode, map.m_lblk, NULL, 0);
+                               path = ext4_find_extent(inode, map.m_lblk, path, 0);
                                if (!IS_ERR(path)) {
                                        for (j = 0; j < path->p_depth; j++)
                                                ext4_mb_mark_bb(inode->i_sb,
                                                        path[j].p_block, 1, true);
-                                       ext4_free_ext_path(path);
+                               } else {
+                                       path = NULL;
                                }
                                cur += ret;
                                ext4_mb_mark_bb(inode->i_sb, map.m_pblk,
                }
                iput(inode);
        }
+
+       ext4_free_ext_path(path);
 }
 
 /*