ext4: reuse path object in ext4_move_extents()
authorTheodore Ts'o <tytso@mit.edu>
Mon, 1 Sep 2014 18:42:09 +0000 (14:42 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Mon, 1 Sep 2014 18:42:09 +0000 (14:42 -0400)
Reuse the path object in ext4_move_extents() so we don't unnecessarily
free and reallocate it.

Also clean up the get_ext_path() wrapper so that it has the same
semantics of freeing the path object on error as ext4_ext_find_extent().

Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/move_extent.c

index a34c0760276c319f05520fdf14f519d43f6216a3..7bf970dd61f5d517545eb2dcb933d8cc1cbd2346 100644 (file)
  */
 static inline int
 get_ext_path(struct inode *inode, ext4_lblk_t lblock,
-               struct ext4_ext_path **orig_path)
+               struct ext4_ext_path **ppath)
 {
-       int ret = 0;
        struct ext4_ext_path *path;
 
-       path = ext4_ext_find_extent(inode, lblock, orig_path, EXT4_EX_NOCACHE);
+       path = ext4_ext_find_extent(inode, lblock, ppath, EXT4_EX_NOCACHE);
        if (IS_ERR(path))
-               ret = PTR_ERR(path);
-       else if (path[ext_depth(inode)].p_ext == NULL)
-               ret = -ENODATA;
-       else
-               *orig_path = path;
-
-       return ret;
+               return PTR_ERR(path);
+       if (path[ext_depth(inode)].p_ext == NULL) {
+               ext4_ext_drop_refs(path);
+               kfree(path);
+               *ppath = NULL;
+               return -ENODATA;
+       }
+       *ppath = path;
+       return 0;
 }
 
 /**
@@ -667,7 +668,7 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, __u64 orig_blk,
                        }
                        d_start += next_blk - o_start;
                        o_start = next_blk;
-                       goto repeat;
+                       continue;
                /* Check hole after the start pos */
                } else if (cur_blk > o_start) {
                        /* Skip hole */
@@ -708,10 +709,6 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, __u64 orig_blk,
                        break;
                o_start += cur_len;
                d_start += cur_len;
-       repeat:
-               ext4_ext_drop_refs(path);
-               kfree(path);
-               path = NULL;
        }
        *moved_len = o_start - orig_blk;
        if (*moved_len > len)