btrfs: Add helper to check the btrfs header
This helper is used in a few places to help the debugging. As conservative approach the error is only logged. This does not impact the error handling. Signed-off-by: Goffredo Baroncelli <kreijack@inwind.it> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
parent
3d822ff9b3
commit
f962796697
1 changed files with 23 additions and 1 deletions
|
@ -77,7 +77,8 @@ struct btrfs_header
|
||||||
{
|
{
|
||||||
grub_btrfs_checksum_t checksum;
|
grub_btrfs_checksum_t checksum;
|
||||||
grub_btrfs_uuid_t uuid;
|
grub_btrfs_uuid_t uuid;
|
||||||
grub_uint8_t dummy[0x30];
|
grub_uint64_t bytenr;
|
||||||
|
grub_uint8_t dummy[0x28];
|
||||||
grub_uint32_t nitems;
|
grub_uint32_t nitems;
|
||||||
grub_uint8_t level;
|
grub_uint8_t level;
|
||||||
} GRUB_PACKED;
|
} GRUB_PACKED;
|
||||||
|
@ -286,6 +287,25 @@ free_iterator (struct grub_btrfs_leaf_descriptor *desc)
|
||||||
grub_free (desc->data);
|
grub_free (desc->data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
check_btrfs_header (struct grub_btrfs_data *data, struct btrfs_header *header,
|
||||||
|
grub_disk_addr_t addr)
|
||||||
|
{
|
||||||
|
if (grub_le_to_cpu64 (header->bytenr) != addr)
|
||||||
|
{
|
||||||
|
grub_dprintf ("btrfs", "btrfs_header.bytenr is not equal node addr\n");
|
||||||
|
return grub_error (GRUB_ERR_BAD_FS,
|
||||||
|
"header bytenr is not equal node addr");
|
||||||
|
}
|
||||||
|
if (grub_memcmp (data->sblock.uuid, header->uuid, sizeof(grub_btrfs_uuid_t)))
|
||||||
|
{
|
||||||
|
grub_dprintf ("btrfs", "btrfs_header.uuid doesn't match sblock uuid\n");
|
||||||
|
return grub_error (GRUB_ERR_BAD_FS,
|
||||||
|
"header uuid doesn't match sblock uuid");
|
||||||
|
}
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
static grub_err_t
|
static grub_err_t
|
||||||
save_ref (struct grub_btrfs_leaf_descriptor *desc,
|
save_ref (struct grub_btrfs_leaf_descriptor *desc,
|
||||||
grub_disk_addr_t addr, unsigned i, unsigned m, int l)
|
grub_disk_addr_t addr, unsigned i, unsigned m, int l)
|
||||||
|
@ -341,6 +361,7 @@ next (struct grub_btrfs_data *data,
|
||||||
|
|
||||||
err = grub_btrfs_read_logical (data, grub_le_to_cpu64 (node.addr),
|
err = grub_btrfs_read_logical (data, grub_le_to_cpu64 (node.addr),
|
||||||
&head, sizeof (head), 0);
|
&head, sizeof (head), 0);
|
||||||
|
check_btrfs_header (data, &head, grub_le_to_cpu64 (node.addr));
|
||||||
if (err)
|
if (err)
|
||||||
return -err;
|
return -err;
|
||||||
|
|
||||||
|
@ -402,6 +423,7 @@ lower_bound (struct grub_btrfs_data *data,
|
||||||
/* FIXME: preread few nodes into buffer. */
|
/* FIXME: preread few nodes into buffer. */
|
||||||
err = grub_btrfs_read_logical (data, addr, &head, sizeof (head),
|
err = grub_btrfs_read_logical (data, addr, &head, sizeof (head),
|
||||||
recursion_depth + 1);
|
recursion_depth + 1);
|
||||||
|
check_btrfs_header (data, &head, addr);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
addr += sizeof (head);
|
addr += sizeof (head);
|
||||||
|
|
Loading…
Reference in a new issue