Fix in-extent reading

This commit is contained in:
Vladimir 'phcoder' Serbinenko 2010-12-02 15:08:46 +01:00
parent 228cfb40bf
commit 8006f6779e

View file

@ -912,6 +912,7 @@ grub_btrfs_read (grub_file_t file, char *buf, grub_size_t len)
grub_disk_addr_t elemaddr; grub_disk_addr_t elemaddr;
grub_size_t elemsize; grub_size_t elemsize;
struct grub_btrfs_key key_in, key_out; struct grub_btrfs_key key_in, key_out;
grub_off_t extoff;
while (len) while (len)
{ {
@ -955,6 +956,7 @@ grub_btrfs_read (grub_file_t file, char *buf, grub_size_t len)
grub_le_to_cpu64 (extent->size)); grub_le_to_cpu64 (extent->size));
csize = grub_le_to_cpu64 (extent->size) csize = grub_le_to_cpu64 (extent->size)
+ grub_le_to_cpu64 (key_out.offset) - pos; + grub_le_to_cpu64 (key_out.offset) - pos;
extoff = pos - grub_le_to_cpu64 (key_out.offset);
if (csize > len) if (csize > len)
csize = len; csize = len;
@ -983,7 +985,7 @@ grub_btrfs_read (grub_file_t file, char *buf, grub_size_t len)
switch (extent->type) switch (extent->type)
{ {
case GRUB_BTRFS_EXTENT_INLINE: case GRUB_BTRFS_EXTENT_INLINE:
grub_memcpy (buf, extent->inl, csize); grub_memcpy (buf, extent->inl + extoff, csize);
grub_free (extent); grub_free (extent);
break; break;
case GRUB_BTRFS_EXTENT_REGULAR: case GRUB_BTRFS_EXTENT_REGULAR:
@ -993,7 +995,8 @@ grub_btrfs_read (grub_file_t file, char *buf, grub_size_t len)
break; break;
} }
err = grub_btrfs_read_logical (data, file->device->disk, err = grub_btrfs_read_logical (data, file->device->disk,
grub_le_to_cpu64 (extent->laddr), grub_le_to_cpu64 (extent->laddr)
+ extoff,
buf, csize); buf, csize);
grub_free (extent); grub_free (extent);
if (err) if (err)