grub-devel
[Top][All Lists]
Advanced

[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)
     {



reply via email to

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