grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v2] Big endian fixes for btrfs


From: Anton Blanchard
Subject: [PATCH v2] Big endian fixes for btrfs
Date: Mon, 26 Mar 2012 09:20:40 +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.
        (find_path): Likewise.
        (grub_btrfs_dir): Likewise.

Index: grub/grub-core/fs/btrfs.c
===================================================================
--- grub.orig/grub-core/fs/btrfs.c      2012-03-26 08:37:00.096578236 +1100
+++ grub/grub-core/fs/btrfs.c   2012-03-26 09:15:44.769981996 +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);
@@ -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;
@@ -1344,7 +1347,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 +1375,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;
          }
@@ -1494,7 +1497,7 @@ grub_btrfs_dir (grub_device_t device, co
            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)];



reply via email to

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