[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] Big endian fixes for btrfs
From: |
Anton Blanchard |
Subject: |
[PATCH] Big endian fixes for btrfs |
Date: |
Mon, 26 Mar 2012 00:36:36 +1100 |
2012-03-25 Anton Blanchard <address@hidden>
* grub-core/fs/btrfs.c (read_sblock): Fix incorrect endian conversion.
(key_cmp): Likewise.
(lower_bound): Likewise.
(grub_btrfs_read_logical): Likewise.
(grub_btrfs_read_inode): Likewise.
(grub_btrfs_extent_read): Likewise.
(find_path): Likewise.
(grub_btrfs_dir): Likewise.
(grub_btrfs_open): Likewise.
Index: grub/grub-core/fs/btrfs.c
===================================================================
--- grub.orig/grub-core/fs/btrfs.c 2012-03-26 00:19:28.690769829 +1100
+++ grub/grub-core/fs/btrfs.c 2012-03-26 00:23:40.019447649 +1100
@@ -279,9 +279,9 @@ read_sblock (grub_disk_t disk, struct gr
static int
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;
- 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;
if (a->type < b->type)
@@ -289,9 +289,9 @@ key_cmp (const struct grub_btrfs_key *a,
if (a->type > b->type)
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;
- 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 0;
}
@@ -400,7 +400,8 @@ lower_bound (struct grub_btrfs_data *dat
grub_dprintf ("btrfs",
"retrieving %" PRIxGRUB_UINT64_T
" %x %" PRIxGRUB_UINT64_T "\n",
- key_in->object_id, key_in->type, key_in->offset);
+ grub_le_to_cpu64 (key_in->object_id), key_in->type,
+ grub_le_to_cpu64 (key_in->offset));
while (1)
{
@@ -430,8 +431,9 @@ lower_bound (struct grub_btrfs_data *dat
grub_dprintf ("btrfs",
"internal node (depth %d) %" PRIxGRUB_UINT64_T
" %x %" PRIxGRUB_UINT64_T "\n", depth,
- node.key.object_id, node.key.type,
- node.key.offset);
+ grub_le_to_cpu64 (node.key.object_id),
+ node.key.type,
+ grub_le_to_cpu64 (node.key.offset));
if (key_cmp (&node.key, key_in) == 0)
{
@@ -482,7 +484,8 @@ lower_bound (struct grub_btrfs_data *dat
grub_dprintf ("btrfs",
"leaf (depth %d) %" PRIxGRUB_UINT64_T
" %x %" PRIxGRUB_UINT64_T "\n", depth,
- leaf.key.object_id, leaf.key.type, leaf.key.offset);
+ grub_le_to_cpu64 (leaf.key.object_id), leaf.key.type,
+ grub_le_to_cpu64 (leaf.key.offset));
if (key_cmp (&leaf.key, key_in) == 0)
{
@@ -642,9 +645,9 @@ grub_btrfs_read_logical (struct grub_btr
* grub_le_to_cpu16 (chunk->nstripes);
}
- key_in.object_id = GRUB_BTRFS_OBJECT_ID_CHUNK;
+ key_in.object_id = grub_cpu_to_le64 (GRUB_BTRFS_OBJECT_ID_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,
grub_le_to_cpu64 (data->sblock.chunk_tree),
&chaddr, &chsize, NULL);
@@ -776,7 +779,7 @@ grub_btrfs_read_logical (struct grub_btr
With RAID5-like it will be more difficult. */
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
"+0x%" PRIxGRUB_UINT64_T
@@ -788,7 +791,7 @@ grub_btrfs_read_logical (struct grub_btr
grub_le_to_cpu16 (chunk->nstripes),
grub_le_to_cpu16 (chunk->nsubstripes),
grub_le_to_cpu64 (chunk->stripe_length),
- stripen, stripe->offset);
+ stripen, grub_le_to_cpu64 (stripe->offset));
grub_dprintf ("btrfs", "reading paddr 0x%" PRIxGRUB_UINT64_T
" for laddr 0x%" PRIxGRUB_UINT64_T "\n", paddr,
addr);
@@ -883,14 +886,14 @@ grub_btrfs_read_inode (struct grub_btrfs
grub_size_t elemsize;
grub_err_t err;
- key_in.object_id = num;
+ key_in.object_id = grub_cpu_to_le64 (num);
key_in.type = GRUB_BTRFS_ITEM_TYPE_INODE_ITEM;
key_in.offset = 0;
err = lower_bound (data, &key_in, &key_out, tree, &elemaddr, &elemsize,
NULL);
if (err)
return err;
- if (num != key_out.object_id
+ if (num != grub_le_to_cpu64 (key_out.object_id)
|| key_out.type != GRUB_BTRFS_ITEM_TYPE_INODE_ITEM)
return grub_error (GRUB_ERR_BAD_FS, "inode not found");
@@ -990,14 +993,14 @@ grub_btrfs_extent_read (struct grub_btrf
grub_size_t elemsize;
grub_free (data->extent);
- key_in.object_id = ino;
+ key_in.object_id = grub_cpu_to_le64 (ino);
key_in.type = GRUB_BTRFS_ITEM_TYPE_EXTENT_ITEM;
key_in.offset = grub_cpu_to_le64 (pos);
err = lower_bound (data, &key_in, &key_out, tree,
&elemaddr, &elemsize, NULL);
if (err)
return -1;
- if (key_out.object_id != ino
+ if (grub_le_to_cpu64 (key_out.object_id) != ino
|| key_out.type != GRUB_BTRFS_ITEM_TYPE_EXTENT_ITEM)
{
grub_error (GRUB_ERR_BAD_FS, "extent not found");
@@ -1174,7 +1177,7 @@ find_path (struct grub_btrfs_data *data,
unsigned symlinks_max = 32;
*type = GRUB_BTRFS_DIR_ITEM_TYPE_DIRECTORY;
- *tree = data->sblock.root_tree;
+ *tree = grub_le_to_cpu64 (data->sblock.root_tree);
key->object_id = data->sblock.root_dir_objectid;
key->type = GRUB_BTRFS_ITEM_TYPE_DIR_ITEM;
key->offset = 0;
@@ -1292,7 +1295,8 @@ find_path (struct grub_btrfs_data *data,
}
err = grub_btrfs_read_inode (data, &inode,
- cdirel->key.object_id, *tree);
+ grub_le_to_cpu64 (cdirel->key.object_id),
+ *tree);
if (err)
{
grub_free (direl);
@@ -1310,7 +1314,8 @@ find_path (struct grub_btrfs_data *data,
return grub_errno;
}
- if (grub_btrfs_extent_read (data, cdirel->key.object_id,
+ if (grub_btrfs_extent_read (data,
+ grub_le_to_cpu64 (cdirel->key.object_id),
*tree, 0, tmp,
grub_le_to_cpu64 (inode.size))
!= (grub_ssize_t) grub_le_to_cpu64 (inode.size))
@@ -1344,7 +1349,7 @@ find_path (struct grub_btrfs_data *data,
{
struct grub_btrfs_root_item ri;
err = lower_bound (data, &cdirel->key, &key_out,
- data->sblock.root_tree,
+ grub_le_to_cpu64 (data->sblock.root_tree),
&elemaddr, &elemsize, NULL);
if (err)
{
@@ -1372,7 +1377,7 @@ find_path (struct grub_btrfs_data *data,
}
key->type = GRUB_BTRFS_ITEM_TYPE_DIR_ITEM;
key->offset = 0;
- key->object_id = GRUB_BTRFS_OBJECT_ID_CHUNK;
+ key->object_id = grub_cpu_to_le64 (GRUB_BTRFS_OBJECT_ID_CHUNK);
*tree = grub_le_to_cpu64 (ri.tree);
break;
}
@@ -1487,14 +1492,15 @@ grub_btrfs_dir (grub_device_t device, co
char c;
struct grub_btrfs_inode inode;
struct grub_dirhook_info info;
- err = grub_btrfs_read_inode (data, &inode, cdirel->key.object_id,
+ err = grub_btrfs_read_inode (data, &inode,
+ grub_le_to_cpu64 (cdirel->key.object_id),
tree);
grub_memset (&info, 0, sizeof (info));
if (err)
grub_errno = GRUB_ERR_NONE;
else
{
- info.mtime = inode.mtime.sec;
+ info.mtime = grub_le_to_cpu64 (inode.mtime.sec);
info.mtimeset = 1;
}
c = cdirel->name[grub_le_to_cpu16 (cdirel->n)];
@@ -1541,7 +1547,7 @@ grub_btrfs_open (struct grub_file *file,
return grub_error (GRUB_ERR_BAD_FILE_TYPE, N_("not a regular file"));
}
- data->inode = key_in.object_id;
+ data->inode = grub_le_to_cpu64 (key_in.object_id);
err = grub_btrfs_read_inode (data, &inode, data->inode, data->tree);
if (err)
{