ext4: Include forgotten start block on fallocate insert range
[linux-2.6-block.git] / fs / ext4 / extents.c
index 3e295d3350a9470b61a0bb4a8a1fffc30a451292..4d3014b5a3f9bfebe36f54786a30c76978af9af0 100644 (file)
@@ -5343,8 +5343,7 @@ ext4_ext_shift_extents(struct inode *inode, handle_t *handle,
        if (!extent)
                goto out;
 
-       stop = le32_to_cpu(extent->ee_block) +
-                       ext4_ext_get_actual_len(extent);
+       stop = le32_to_cpu(extent->ee_block);
 
        /*
         * In case of left shift, Don't start shifting extents until we make
@@ -5383,8 +5382,12 @@ ext4_ext_shift_extents(struct inode *inode, handle_t *handle,
        else
                iterator = &stop;
 
-       /* Its safe to start updating extents */
-       while (start < stop) {
+       /*
+        * Its safe to start updating extents.  Start and stop are unsigned, so
+        * in case of right shift if extent with 0 block is reached, iterator
+        * becomes NULL to indicate the end of the loop.
+        */
+       while (iterator && start <= stop) {
                path = ext4_find_extent(inode, *iterator, &path, 0);
                if (IS_ERR(path))
                        return PTR_ERR(path);
@@ -5412,8 +5415,11 @@ ext4_ext_shift_extents(struct inode *inode, handle_t *handle,
                                        ext4_ext_get_actual_len(extent);
                } else {
                        extent = EXT_FIRST_EXTENT(path[depth].p_hdr);
-                       *iterator =  le32_to_cpu(extent->ee_block) > 0 ?
-                               le32_to_cpu(extent->ee_block) - 1 : 0;
+                       if (le32_to_cpu(extent->ee_block) > 0)
+                               *iterator = le32_to_cpu(extent->ee_block) - 1;
+                       else
+                               /* Beginning is reached, end of the loop */
+                               iterator = NULL;
                        /* Update path extent in case we need to stop */
                        while (le32_to_cpu(extent->ee_block) < start)
                                extent++;