Fix btrfs endianness handling.
* grub-core/fs/btrfs.c (key_cmp): Use grub_le_to_cpu for clarity. (lower_bound): Make root uint64_t. Use root in le. (grub_btrfs_read_logical): Fix template key init. Fix address byteswap. (find_path): Fix template key init. (grub_btrfs_dir): Fix mtime byteswap. * include/grub/types.h (grub_cpu_to_le64_compile_time): New macro. Also-By: Vladimir Serbinenko <phcoder@gmail.com>
This commit is contained in:
parent
354e0af7d3
commit
bbb39a458b
3 changed files with 28 additions and 14 deletions
12
ChangeLog
12
ChangeLog
|
@ -1,3 +1,15 @@
|
||||||
|
2012-03-31 Anton Blanchard <anton@samba.org>
|
||||||
|
2012-03-31 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
Fix btrfs endianness handling.
|
||||||
|
|
||||||
|
* grub-core/fs/btrfs.c (key_cmp): Use grub_le_to_cpu for clarity.
|
||||||
|
(lower_bound): Make root uint64_t. Use root in le.
|
||||||
|
(grub_btrfs_read_logical): Fix template key init. Fix address byteswap.
|
||||||
|
(find_path): Fix template key init.
|
||||||
|
(grub_btrfs_dir): Fix mtime byteswap.
|
||||||
|
* include/grub/types.h (grub_cpu_to_le64_compile_time): New macro.
|
||||||
|
|
||||||
2012-03-31 Vladimir Serbinenko <phcoder@gmail.com>
|
2012-03-31 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
* grub-core/fs/btrfs.c (grub_btrfs_read_logical): New argument
|
* grub-core/fs/btrfs.c (grub_btrfs_read_logical): New argument
|
||||||
|
|
|
@ -280,9 +280,9 @@ read_sblock (grub_disk_t disk, struct grub_btrfs_superblock *sb)
|
||||||
static int
|
static int
|
||||||
key_cmp (const struct grub_btrfs_key *a, const struct grub_btrfs_key *b)
|
key_cmp (const struct grub_btrfs_key *a, const struct grub_btrfs_key *b)
|
||||||
{
|
{
|
||||||
if (grub_cpu_to_le64 (a->object_id) < grub_cpu_to_le64 (b->object_id))
|
if (grub_le_to_cpu64 (a->object_id) < grub_le_to_cpu64 (b->object_id))
|
||||||
return -1;
|
return -1;
|
||||||
if (grub_cpu_to_le64 (a->object_id) > grub_cpu_to_le64 (b->object_id))
|
if (grub_le_to_cpu64 (a->object_id) > grub_le_to_cpu64 (b->object_id))
|
||||||
return +1;
|
return +1;
|
||||||
|
|
||||||
if (a->type < b->type)
|
if (a->type < b->type)
|
||||||
|
@ -290,9 +290,9 @@ key_cmp (const struct grub_btrfs_key *a, const struct grub_btrfs_key *b)
|
||||||
if (a->type > b->type)
|
if (a->type > b->type)
|
||||||
return +1;
|
return +1;
|
||||||
|
|
||||||
if (grub_cpu_to_le64 (a->offset) < grub_cpu_to_le64 (b->offset))
|
if (grub_le_to_cpu64 (a->offset) < grub_le_to_cpu64 (b->offset))
|
||||||
return -1;
|
return -1;
|
||||||
if (grub_cpu_to_le64 (a->offset) > grub_cpu_to_le64 (b->offset))
|
if (grub_le_to_cpu64 (a->offset) > grub_le_to_cpu64 (b->offset))
|
||||||
return +1;
|
return +1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -382,12 +382,12 @@ static grub_err_t
|
||||||
lower_bound (struct grub_btrfs_data *data,
|
lower_bound (struct grub_btrfs_data *data,
|
||||||
const struct grub_btrfs_key *key_in,
|
const struct grub_btrfs_key *key_in,
|
||||||
struct grub_btrfs_key *key_out,
|
struct grub_btrfs_key *key_out,
|
||||||
grub_disk_addr_t root,
|
grub_uint64_t root,
|
||||||
grub_disk_addr_t *outaddr, grub_size_t *outsize,
|
grub_disk_addr_t *outaddr, grub_size_t *outsize,
|
||||||
struct grub_btrfs_leaf_descriptor *desc,
|
struct grub_btrfs_leaf_descriptor *desc,
|
||||||
int recursion_depth)
|
int recursion_depth)
|
||||||
{
|
{
|
||||||
grub_disk_addr_t addr = root;
|
grub_disk_addr_t addr = grub_le_to_cpu64 (root);
|
||||||
int depth = -1;
|
int depth = -1;
|
||||||
|
|
||||||
if (desc)
|
if (desc)
|
||||||
|
@ -652,11 +652,11 @@ grub_btrfs_read_logical (struct grub_btrfs_data *data, grub_disk_addr_t addr,
|
||||||
* grub_le_to_cpu16 (chunk->nstripes);
|
* grub_le_to_cpu16 (chunk->nstripes);
|
||||||
}
|
}
|
||||||
|
|
||||||
key_in.object_id = GRUB_BTRFS_OBJECT_ID_CHUNK;
|
key_in.object_id = grub_cpu_to_le64_compile_time (GRUB_BTRFS_OBJECT_ID_CHUNK);
|
||||||
key_in.type = GRUB_BTRFS_ITEM_TYPE_CHUNK;
|
key_in.type = GRUB_BTRFS_ITEM_TYPE_CHUNK;
|
||||||
key_in.offset = addr;
|
key_in.offset = grub_cpu_to_le64 (addr);
|
||||||
err = lower_bound (data, &key_in, &key_out,
|
err = lower_bound (data, &key_in, &key_out,
|
||||||
grub_le_to_cpu64 (data->sblock.chunk_tree),
|
data->sblock.chunk_tree,
|
||||||
&chaddr, &chsize, NULL, recursion_depth);
|
&chaddr, &chsize, NULL, recursion_depth);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
@ -772,7 +772,7 @@ grub_btrfs_read_logical (struct grub_btrfs_data *data, grub_disk_addr_t addr,
|
||||||
if (csize == 0)
|
if (csize == 0)
|
||||||
return grub_error (GRUB_ERR_BUG,
|
return grub_error (GRUB_ERR_BUG,
|
||||||
"couldn't find the chunk descriptor");
|
"couldn't find the chunk descriptor");
|
||||||
if ((grub_size_t) csize > size)
|
if (csize > (grub_uint64_t) size)
|
||||||
csize = size;
|
csize = size;
|
||||||
|
|
||||||
for (j = 0; j < 2; j++)
|
for (j = 0; j < 2; j++)
|
||||||
|
@ -787,7 +787,7 @@ grub_btrfs_read_logical (struct grub_btrfs_data *data, grub_disk_addr_t addr,
|
||||||
With RAID5-like it will be more difficult. */
|
With RAID5-like it will be more difficult. */
|
||||||
stripe += stripen + i;
|
stripe += stripen + i;
|
||||||
|
|
||||||
paddr = stripe->offset + stripe_offset;
|
paddr = grub_le_to_cpu64 (stripe->offset) + stripe_offset;
|
||||||
|
|
||||||
grub_dprintf ("btrfs", "chunk 0x%" PRIxGRUB_UINT64_T
|
grub_dprintf ("btrfs", "chunk 0x%" PRIxGRUB_UINT64_T
|
||||||
"+0x%" PRIxGRUB_UINT64_T
|
"+0x%" PRIxGRUB_UINT64_T
|
||||||
|
@ -1385,8 +1385,8 @@ find_path (struct grub_btrfs_data *data,
|
||||||
}
|
}
|
||||||
key->type = GRUB_BTRFS_ITEM_TYPE_DIR_ITEM;
|
key->type = GRUB_BTRFS_ITEM_TYPE_DIR_ITEM;
|
||||||
key->offset = 0;
|
key->offset = 0;
|
||||||
key->object_id = GRUB_BTRFS_OBJECT_ID_CHUNK;
|
key->object_id = grub_cpu_to_le64_compile_time (GRUB_BTRFS_OBJECT_ID_CHUNK);
|
||||||
*tree = grub_le_to_cpu64 (ri.tree);
|
*tree = ri.tree;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GRUB_BTRFS_ITEM_TYPE_INODE_ITEM:
|
case GRUB_BTRFS_ITEM_TYPE_INODE_ITEM:
|
||||||
|
@ -1508,7 +1508,7 @@ grub_btrfs_dir (grub_device_t device, const char *path,
|
||||||
grub_errno = GRUB_ERR_NONE;
|
grub_errno = GRUB_ERR_NONE;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
info.mtime = inode.mtime.sec;
|
info.mtime = grub_le_to_cpu64 (inode.mtime.sec);
|
||||||
info.mtimeset = 1;
|
info.mtimeset = 1;
|
||||||
}
|
}
|
||||||
c = cdirel->name[grub_le_to_cpu16 (cdirel->n)];
|
c = cdirel->name[grub_le_to_cpu16 (cdirel->n)];
|
||||||
|
|
|
@ -212,6 +212,7 @@ static inline grub_uint64_t grub_swap_bytes64(grub_uint64_t x)
|
||||||
# define grub_cpu_to_be64_compile_time(x) ((grub_uint64_t) (x))
|
# define grub_cpu_to_be64_compile_time(x) ((grub_uint64_t) (x))
|
||||||
# define grub_be_to_cpu64_compile_time(x) ((grub_uint64_t) (x))
|
# define grub_be_to_cpu64_compile_time(x) ((grub_uint64_t) (x))
|
||||||
# define grub_cpu_to_le32_compile_time(x) grub_swap_bytes32_compile_time(x)
|
# define grub_cpu_to_le32_compile_time(x) grub_swap_bytes32_compile_time(x)
|
||||||
|
# define grub_cpu_to_le64_compile_time(x) grub_swap_bytes64_compile_time(x)
|
||||||
# define grub_cpu_to_le16_compile_time(x) grub_swap_bytes16_compile_time(x)
|
# define grub_cpu_to_le16_compile_time(x) grub_swap_bytes16_compile_time(x)
|
||||||
#else /* ! WORDS_BIGENDIAN */
|
#else /* ! WORDS_BIGENDIAN */
|
||||||
# define grub_cpu_to_le16(x) ((grub_uint16_t) (x))
|
# define grub_cpu_to_le16(x) ((grub_uint16_t) (x))
|
||||||
|
@ -232,6 +233,7 @@ static inline grub_uint64_t grub_swap_bytes64(grub_uint64_t x)
|
||||||
# define grub_be_to_cpu64_compile_time(x) grub_swap_bytes64_compile_time(x)
|
# define grub_be_to_cpu64_compile_time(x) grub_swap_bytes64_compile_time(x)
|
||||||
# define grub_cpu_to_le16_compile_time(x) ((grub_uint16_t) (x))
|
# define grub_cpu_to_le16_compile_time(x) ((grub_uint16_t) (x))
|
||||||
# define grub_cpu_to_le32_compile_time(x) ((grub_uint32_t) (x))
|
# define grub_cpu_to_le32_compile_time(x) ((grub_uint32_t) (x))
|
||||||
|
# define grub_cpu_to_le64_compile_time(x) ((grub_uint64_t) (x))
|
||||||
|
|
||||||
#endif /* ! WORDS_BIGENDIAN */
|
#endif /* ! WORDS_BIGENDIAN */
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue