struct ext4_ext_path *
 ext4_find_extent(struct inode *inode, ext4_lblk_t block,
-                struct ext4_ext_path **orig_path, int flags)
+                struct ext4_ext_path *path, int flags)
 {
        struct ext4_extent_header *eh;
        struct buffer_head *bh;
-       struct ext4_ext_path *path = orig_path ? *orig_path : NULL;
        short int depth, i, ppos = 0;
        int ret;
        gfp_t gfp_flags = GFP_NOFS;
                ext4_ext_drop_refs(path);
                if (depth > path[0].p_maxdepth) {
                        kfree(path);
-                       *orig_path = path = NULL;
+                       path = NULL;
                }
        }
        if (!path) {
 
        ext4_ext_show_path(inode, path);
 
-       if (orig_path)
-               *orig_path = path;
        return path;
 
 err:
        ext4_free_ext_path(path);
-       if (orig_path)
-               *orig_path = NULL;
        return ERR_PTR(ret);
 }
 
                /* refill path */
                path = ext4_find_extent(inode,
                                    (ext4_lblk_t)le32_to_cpu(newext->ee_block),
-                                   ppath, gb_flags);
+                                   path, gb_flags);
                if (IS_ERR(path))
                        err = PTR_ERR(path);
        } else {
                /* refill path */
                path = ext4_find_extent(inode,
                                   (ext4_lblk_t)le32_to_cpu(newext->ee_block),
-                                   ppath, gb_flags);
+                                   path, gb_flags);
                if (IS_ERR(path)) {
                        err = PTR_ERR(path);
                        goto out;
                        goto repeat;
                }
        }
-
 out:
+       *ppath = IS_ERR(path) ? NULL : path;
        return err;
 }
 
         * WARN_ON may be triggered in ext4_da_update_reserve_space() due to
         * an incorrect ee_len causing the i_reserved_data_blocks exception.
         */
-       path = ext4_find_extent(inode, ee_block, ppath,
+       path = ext4_find_extent(inode, ee_block, *ppath,
                                flags | EXT4_EX_NOFAIL);
        if (IS_ERR(path)) {
                EXT4_ERROR_INODE(inode, "Failed split extent on %u, err %ld",
                                 split, PTR_ERR(path));
+               *ppath = NULL;
                return PTR_ERR(path);
        }
        depth = ext_depth(inode);
        ex = path[depth].p_ext;
+       *ppath = path;
 
        if (EXT4_EXT_MAY_ZEROOUT & split_flag) {
                if (split_flag & (EXT4_EXT_DATA_VALID1|EXT4_EXT_DATA_VALID2)) {
         * Update path is required because previous ext4_split_extent_at() may
         * result in split of original leaf or extent zeroout.
         */
-       path = ext4_find_extent(inode, map->m_lblk, ppath, flags);
-       if (IS_ERR(path))
+       path = ext4_find_extent(inode, map->m_lblk, *ppath, flags);
+       if (IS_ERR(path)) {
+               *ppath = NULL;
                return PTR_ERR(path);
+       }
+       *ppath = path;
        depth = ext_depth(inode);
        ex = path[depth].p_ext;
        if (!ex) {
                                                 EXT4_GET_BLOCKS_CONVERT);
                if (err < 0)
                        return err;
-               path = ext4_find_extent(inode, map->m_lblk, ppath, 0);
-               if (IS_ERR(path))
+               path = ext4_find_extent(inode, map->m_lblk, *ppath, 0);
+               if (IS_ERR(path)) {
+                       *ppath = NULL;
                        return PTR_ERR(path);
+               }
+               *ppath = path;
                depth = ext_depth(inode);
                ex = path[depth].p_ext;
        }
                                EXT4_GET_BLOCKS_CONVERT_UNWRITTEN);
                if (err < 0)
                        return err;
-               path = ext4_find_extent(inode, map->m_lblk, ppath, 0);
-               if (IS_ERR(path))
+               path = ext4_find_extent(inode, map->m_lblk, *ppath, 0);
+               if (IS_ERR(path)) {
+                       *ppath = NULL;
                        return PTR_ERR(path);
+               }
+               *ppath = path;
                depth = ext_depth(inode);
                ex = path[depth].p_ext;
                if (!ex) {
        * won't be shifted beyond EXT_MAX_BLOCKS.
        */
        if (SHIFT == SHIFT_LEFT) {
-               path = ext4_find_extent(inode, start - 1, &path,
+               path = ext4_find_extent(inode, start - 1, path,
                                        EXT4_EX_NOCACHE);
                if (IS_ERR(path))
                        return PTR_ERR(path);
         * becomes NULL to indicate the end of the loop.
         */
        while (iterator && start <= stop) {
-               path = ext4_find_extent(inode, *iterator, &path,
+               path = ext4_find_extent(inode, *iterator, path,
                                        EXT4_EX_NOCACHE);
                if (IS_ERR(path))
                        return PTR_ERR(path);
 
        /* search for the extent closest to the first block in the cluster */
        path = ext4_find_extent(inode, EXT4_C2B(sbi, lclu), NULL, 0);
-       if (IS_ERR(path)) {
-               err = PTR_ERR(path);
-               path = NULL;
-               goto out;
-       }
+       if (IS_ERR(path))
+               return PTR_ERR(path);
 
        depth = ext_depth(inode);
 
                if (ret)
                        goto out;
 
-               path = ext4_find_extent(inode, start, &path, 0);
+               path = ext4_find_extent(inode, start, path, 0);
                if (IS_ERR(path))
                        return PTR_ERR(path);
                ex = path[path->p_depth].p_ext;
                        if (ret)
                                goto out;
 
-                       path = ext4_find_extent(inode, start, &path, 0);
+                       path = ext4_find_extent(inode, start, path, 0);
                        if (IS_ERR(path))
                                return PTR_ERR(path);
                        ex = path[path->p_depth].p_ext;