Btrfs: clone, don't create invalid hole extent map
authorFilipe Manana <fdmanana@suse.com>
Fri, 8 Aug 2014 01:47:06 +0000 (02:47 +0100)
committerChris Mason <clm@fb.com>
Thu, 21 Aug 2014 14:55:26 +0000 (07:55 -0700)
When cloning a file that consists of an inline extent, we were creating
an extent map that represents a non-existing trailing hole starting at a
file offset that isn't a multiple of the sector size. This happened because
when processing an inline extent we weren't aligning the extent's length to
the sector size, and therefore incorrectly treating the range
[inline_extent_length; sector_size[ as a hole.

Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: Satoru Takeuchi <takeuchi_satoru@jp.fujitsu.com>
Signed-off-by: Chris Mason <clm@fb.com>
fs/btrfs/ioctl.c

index 845287ca59c35eb103f46529ee7729aea57d3d98..fce6fd0e3f50c729adcf278b1b2a13bd2ede1494 100644 (file)
@@ -3494,7 +3494,8 @@ process_slot:
                        btrfs_mark_buffer_dirty(leaf);
                        btrfs_release_path(path);
 
-                       last_dest_end = new_key.offset + datal;
+                       last_dest_end = ALIGN(new_key.offset + datal,
+                                             root->sectorsize);
                        ret = clone_finish_inode_update(trans, inode,
                                                        last_dest_end,
                                                        destoff, olen);