[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] Big endian fixes for btrfs
From: |
Vladimir 'φ-coder/phcoder' Serbinenko |
Subject: |
Re: [PATCH] Big endian fixes for btrfs |
Date: |
Sat, 31 Mar 2012 22:14:54 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:10.0.3) Gecko/20120329 Icedove/10.0.3 |
On 25.03.2012 15:36, Anton Blanchard wrote:
> 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.
Applied it with some changes
Thanks.
> 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)
> {
>
> _______________________________________________
> Grub-devel mailing list
> address@hidden
> https://lists.gnu.org/mailman/listinfo/grub-devel
>
--
Regards
Vladimir 'φ-coder/phcoder' Serbinenko
signature.asc
Description: OpenPGP digital signature