aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/inode.c
diff options
context:
space:
mode:
authorYan Zheng <zheng.yan@oracle.com>2008-11-10 07:34:43 -0500
committerChris Mason <chris.mason@oracle.com>2008-11-10 07:34:43 -0500
commitff5b7ee33d82414bf4baf299c21fb703bcc89629 (patch)
tree926786cf57b375e5ef1f865427c910c3d4bdfc7a /fs/btrfs/inode.c
parentf2b1c41cf94d7f839fe9ede5f3ead92698a93fb3 (diff)
Btrfs: Fix csum error for compressed data
The decompress code doesn't take the logical offset in extent pointer into account. If the logical offset isn't zero, data will be decompressed into wrong pages. The solution used here is to record the starting offset of the extent in the file separately from the logical start of the extent_map struct. This allows us to avoid problems inserting overlapping extents. Signed-off-by: Yan Zheng <zheng.yan@oracle.com>
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r--fs/btrfs/inode.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index e01c0d0310ab..59660293d291 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -3949,6 +3949,8 @@ again:
3949 found_type == BTRFS_FILE_EXTENT_PREALLOC) { 3949 found_type == BTRFS_FILE_EXTENT_PREALLOC) {
3950 em->start = extent_start; 3950 em->start = extent_start;
3951 em->len = extent_end - extent_start; 3951 em->len = extent_end - extent_start;
3952 em->orig_start = extent_start -
3953 btrfs_file_extent_offset(leaf, item);
3952 bytenr = btrfs_file_extent_disk_bytenr(leaf, item); 3954 bytenr = btrfs_file_extent_disk_bytenr(leaf, item);
3953 if (bytenr == 0) { 3955 if (bytenr == 0) {
3954 em->block_start = EXTENT_MAP_HOLE; 3956 em->block_start = EXTENT_MAP_HOLE;
@@ -3988,6 +3990,7 @@ again:
3988 em->start = extent_start + extent_offset; 3990 em->start = extent_start + extent_offset;
3989 em->len = (copy_size + root->sectorsize - 1) & 3991 em->len = (copy_size + root->sectorsize - 1) &
3990 ~((u64)root->sectorsize - 1); 3992 ~((u64)root->sectorsize - 1);
3993 em->orig_start = EXTENT_MAP_INLINE;
3991 if (compressed) 3994 if (compressed)
3992 set_bit(EXTENT_FLAG_COMPRESSED, &em->flags); 3995 set_bit(EXTENT_FLAG_COMPRESSED, &em->flags);
3993 ptr = btrfs_file_extent_inline_start(item) + extent_offset; 3996 ptr = btrfs_file_extent_inline_start(item) + extent_offset;