grub-devel
[Top][All Lists]
Advanced

[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


Attachment: signature.asc
Description: OpenPGP digital signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]