return 0;
 }
 
+static void ext4_ext_drop_refs(struct ext4_ext_path *path)
+{
+       int depth, i;
+
+       if (!path)
+               return;
+       depth = path->p_depth;
+       for (i = 0; i <= depth; i++, path++) {
+               brelse(path->p_bh);
+               path->p_bh = NULL;
+       }
+}
+
+void ext4_free_ext_path(struct ext4_ext_path *path)
+{
+       ext4_ext_drop_refs(path);
+       kfree(path);
+}
+
 /*
  * Make sure 'handle' has at least 'check_cred' credits. If not, restart
  * transaction with 'restart_cred' credits. The function drops i_data_sem
        ext4_set_inode_state(inode, EXT4_STATE_EXT_PRECACHED);
 out:
        up_read(&ei->i_data_sem);
-       ext4_ext_drop_refs(path);
-       kfree(path);
+       ext4_free_ext_path(path);
        return ret;
 }
 
 #define ext4_ext_show_move(inode, path, newblock, level)
 #endif
 
-void ext4_ext_drop_refs(struct ext4_ext_path *path)
-{
-       int depth, i;
-
-       if (!path)
-               return;
-       depth = path->p_depth;
-       for (i = 0; i <= depth; i++, path++) {
-               brelse(path->p_bh);
-               path->p_bh = NULL;
-       }
-}
-
 /*
  * ext4_ext_binsearch_idx:
  * binary search for the closest index of the given block
        return path;
 
 err:
-       ext4_ext_drop_refs(path);
-       kfree(path);
+       ext4_free_ext_path(path);
        if (orig_path)
                *orig_path = NULL;
        return ERR_PTR(ret);
        err = ext4_ext_dirty(handle, inode, path + path->p_depth);
 
 cleanup:
-       ext4_ext_drop_refs(npath);
-       kfree(npath);
+       ext4_free_ext_path(npath);
        return err;
 }
 
                }
        }
 out:
-       ext4_ext_drop_refs(path);
-       kfree(path);
+       ext4_free_ext_path(path);
        path = NULL;
        if (err == -EAGAIN)
                goto again;
        allocated = map->m_len;
        ext4_ext_show_leaf(inode, path);
 out:
-       ext4_ext_drop_refs(path);
-       kfree(path);
+       ext4_free_ext_path(path);
 
        trace_ext4_ext_map_blocks_exit(inode, flags, map,
                                       err ? err : allocated);
                        break;
        }
 out:
-       ext4_ext_drop_refs(path);
-       kfree(path);
+       ext4_free_ext_path(path);
        return ret;
 }
 
                                        EXT4_GET_BLOCKS_METADATA_NOFAIL);
                }
 
-               ext4_ext_drop_refs(path);
-               kfree(path);
+               ext4_free_ext_path(path);
                if (ret < 0) {
                        up_write(&EXT4_I(inode)->i_data_sem);
                        goto out_stop;
                }
        } else {
-               ext4_ext_drop_refs(path);
-               kfree(path);
+               ext4_free_ext_path(path);
        }
 
        ret = ext4_es_remove_extent(inode, offset_lblk,
                count -= len;
 
        repeat:
-               ext4_ext_drop_refs(path1);
-               kfree(path1);
-               ext4_ext_drop_refs(path2);
-               kfree(path2);
+               ext4_free_ext_path(path1);
+               ext4_free_ext_path(path2);
                path1 = path2 = NULL;
        }
        return replaced_count;
        }
 
 out:
-       ext4_ext_drop_refs(path);
-       kfree(path);
+       ext4_free_ext_path(path);
 
        return err ? err : mapped;
 }
        ret = ext4_ext_dirty(NULL, inode, &path[path->p_depth]);
        up_write(&EXT4_I(inode)->i_data_sem);
 out:
-       ext4_ext_drop_refs(path);
-       kfree(path);
+       ext4_free_ext_path(path);
        ext4_mark_inode_dirty(NULL, inode);
        return ret;
 }
                        return;
                ex = path[path->p_depth].p_ext;
                if (!ex) {
-                       ext4_ext_drop_refs(path);
-                       kfree(path);
+                       ext4_free_ext_path(path);
                        ext4_mark_inode_dirty(NULL, inode);
                        return;
                }
                ext4_ext_dirty(NULL, inode, &path[path->p_depth]);
                up_write(&EXT4_I(inode)->i_data_sem);
                ext4_mark_inode_dirty(NULL, inode);
-               ext4_ext_drop_refs(path);
-               kfree(path);
+               ext4_free_ext_path(path);
        }
 }
 
                return PTR_ERR(path);
        ex = path[path->p_depth].p_ext;
        if (!ex) {
-               ext4_ext_drop_refs(path);
-               kfree(path);
+               ext4_free_ext_path(path);
                goto out;
        }
        end = le32_to_cpu(ex->ee_block) + ext4_ext_get_actual_len(ex);
-       ext4_ext_drop_refs(path);
-       kfree(path);
+       ext4_free_ext_path(path);
 
        /* Count the number of data blocks */
        cur = 0;
        if (IS_ERR(path))
                goto out;
        numblks += path->p_depth;
-       ext4_ext_drop_refs(path);
-       kfree(path);
+       ext4_free_ext_path(path);
        while (cur < end) {
                path = ext4_find_extent(inode, cur, NULL, 0);
                if (IS_ERR(path))
                        break;
                ex = path[path->p_depth].p_ext;
                if (!ex) {
-                       ext4_ext_drop_refs(path);
-                       kfree(path);
+                       ext4_free_ext_path(path);
                        return 0;
                }
                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_ext_drop_refs(path);
-                       kfree(path);
+                       ext4_free_ext_path(path);
                        break;
                }
                path2 = ext4_find_extent(inode, cur, NULL, 0);
                if (IS_ERR(path2)) {
-                       ext4_ext_drop_refs(path);
-                       kfree(path);
+                       ext4_free_ext_path(path);
                        break;
                }
                for (i = 0; i <= max(path->p_depth, path2->p_depth); i++) {
                        if (cmp1 != cmp2 && cmp2 != 0)
                                numblks++;
                }
-               ext4_ext_drop_refs(path);
-               ext4_ext_drop_refs(path2);
-               kfree(path);
-               kfree(path2);
+               ext4_free_ext_path(path);
+               ext4_free_ext_path(path2);
        }
 
 out:
                return PTR_ERR(path);
        ex = path[path->p_depth].p_ext;
        if (!ex) {
-               ext4_ext_drop_refs(path);
-               kfree(path);
+               ext4_free_ext_path(path);
                return 0;
        }
        end = le32_to_cpu(ex->ee_block) + ext4_ext_get_actual_len(ex);
-       ext4_ext_drop_refs(path);
-       kfree(path);
+       ext4_free_ext_path(path);
 
        cur = 0;
        while (cur < end) {
                                        ext4_fc_record_regions(inode->i_sb, inode->i_ino,
                                                        0, path[j].p_block, 1, 1);
                                }
-                               ext4_ext_drop_refs(path);
-                               kfree(path);
+                               ext4_free_ext_path(path);
                        }
                        ext4_mb_mark_bb(inode->i_sb, map.m_pblk, map.m_len, 0);
                        ext4_fc_record_regions(inode->i_sb, inode->i_ino,