bug-hurd
[Top][All Lists]
Advanced

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

Re: [PATCH 08/17] ext2fs: Take cares of indiannes


From: Samuel Thibault
Subject: Re: [PATCH 08/17] ext2fs: Take cares of indiannes
Date: Sun, 23 Jan 2022 12:04:14 +0100
User-agent: NeoMutt/20170609 (1.8.3)

Etienne Brateau, le dim. 23 janv. 2022 05:17:06 +0100, a ecrit:
> In ext2 data are stored in little endian to ensure portability. So
> enforce little endian when manipulating these bytes.

Applied, thanks!

I have spotted and fixed a few missing bits, it's probably worth another
review round.

> ---
>  ext2fs/balloc.c  | 130 ++++++++++++++++++++++++---------------------
>  ext2fs/dir.c     |  61 ++++++++++-----------
>  ext2fs/ext2_fs.h |  36 ++++++-------
>  ext2fs/ext2fs.h  |   7 +--
>  ext2fs/getblk.c  |   2 +-
>  ext2fs/hyper.c   |  42 +++++++--------
>  ext2fs/ialloc.c  |  73 +++++++++++++-------------
>  ext2fs/inode.c   | 134 ++++++++++++++++++++++++-----------------------
>  ext2fs/xattr.c   |  78 ++++++++++++++-------------
>  9 files changed, 292 insertions(+), 271 deletions(-)
> 
> diff --git a/ext2fs/balloc.c b/ext2fs/balloc.c
> index 105aaa54..2cd21a0f 100644
> --- a/ext2fs/balloc.c
> +++ b/ext2fs/balloc.c
> @@ -65,8 +65,8 @@ ext2_free_blocks (block_t block, unsigned long count)
>  
>    pthread_spin_lock (&global_lock);
>  
> -  if (block < sblock->s_first_data_block ||
> -      (block + count) > sblock->s_blocks_count)
> +  if (block < le32toh (sblock->s_first_data_block) ||
> +      (block + count) > le32toh (sblock->s_blocks_count))
>      {
>        ext2_error ("freeing blocks not in datazone - "
>                    "block = %u, count = %lu", block, count);
> @@ -80,29 +80,30 @@ ext2_free_blocks (block_t block, unsigned long count)
>      {
>        unsigned long int gcount = count;
>  
> -      block_group = ((block - sblock->s_first_data_block)
> -         / sblock->s_blocks_per_group);
> -      bit = (block - sblock->s_first_data_block) % 
> sblock->s_blocks_per_group;
> +      block_group = ((block - le32toh (sblock->s_first_data_block)) /
> +         le32toh (sblock->s_blocks_per_group));
> +      bit = (block - le32toh (sblock->s_first_data_block)) %
> +        le32toh (sblock->s_blocks_per_group);
>  
>        /*
>         * Check to see if we are freeing blocks accross a group
>         * boundary
>         */
> -      if (bit + count > sblock->s_blocks_per_group)
> +      if (bit + count > le32toh (sblock->s_blocks_per_group))
>          {
> -          unsigned long overflow = bit + count - sblock->s_blocks_per_group;
> +          unsigned long overflow = bit + count - le32toh 
> (sblock->s_blocks_per_group);
>            gcount -= overflow;
>            ext2_debug ("freeing blocks across group boundary - "
>            "block = %u, count = %lu",
>            block, count);
>          }
>        gdp = group_desc (block_group);
> -      bh = disk_cache_block_ref (gdp->bg_block_bitmap);
> +      bh = disk_cache_block_ref (le32toh (gdp->bg_block_bitmap));
>  
> -      if (in_range (gdp->bg_block_bitmap, block, gcount) ||
> -          in_range (gdp->bg_inode_bitmap, block, gcount) ||
> -          in_range (block, gdp->bg_inode_table, itb_per_group) ||
> -          in_range (block + gcount - 1, gdp->bg_inode_table, itb_per_group))
> +      if (in_range (le32toh (gdp->bg_block_bitmap), block, gcount) ||
> +          in_range (le32toh (gdp->bg_inode_bitmap), block, gcount) ||
> +          in_range (block, le32toh (gdp->bg_inode_table), itb_per_group) ||
> +          in_range (block + gcount - 1, le32toh (gdp->bg_inode_table), 
> itb_per_group))
>          ext2_panic ("freeing blocks in system zones - "
>                      "block = %u, count = %lu",
>                      block, count);
> @@ -113,8 +114,10 @@ ext2_free_blocks (block_t block, unsigned long count)
>              ext2_warning ("bit already cleared for block %lu", block + i);
>            else
>              {
> -              gdp->bg_free_blocks_count++;
> -              sblock->s_free_blocks_count++;
> +              gdp->bg_free_blocks_count =
> +                htole16 (le16toh (gdp->bg_free_blocks_count) + 1);
> +              sblock->s_free_blocks_count =
> +                htole32 (le32toh (sblock->s_free_blocks_count) + 1);
>              }
>          }
>  
> @@ -159,7 +162,7 @@ ext2_new_block (block_t goal,
>    pthread_spin_lock (&global_lock);
>  
>  #ifdef XXX /* Auth check to use reserved blocks  */
> -  if (sblock->s_free_blocks_count <= sblock->s_r_blocks_count &&
> +  if (le32toh (sblock->s_free_blocks_count) <= le32toh 
> (sblock->s_r_blocks_count) &&
>        (!fsuser () && (sb->u.ext2_sb.s_resuid != current->fsuid) &&
>         (sb->u.ext2_sb.s_resgid == 0 ||
>        !in_group_p (sb->u.ext2_sb.s_resgid))))
> @@ -176,18 +179,21 @@ repeat:
>    /*
>     * First, test whether the goal block is free.
>     */
> -  if (goal < sblock->s_first_data_block || goal >= sblock->s_blocks_count)
> -    goal = sblock->s_first_data_block;
> -  i = (goal - sblock->s_first_data_block) / sblock->s_blocks_per_group;
> +  if (goal < le32toh (sblock->s_first_data_block)
> +      || goal >= le32toh (sblock->s_blocks_count))
> +    goal = le32toh (sblock->s_first_data_block);
> +  i = (goal - le32toh (sblock->s_first_data_block)) /
> +    le32toh (sblock->s_blocks_per_group);
>    gdp = group_desc (i);
> -  if (gdp->bg_free_blocks_count > 0)
> +  if (le16toh (gdp->bg_free_blocks_count) > 0)
>      {
> -      j = ((goal - sblock->s_first_data_block) % sblock->s_blocks_per_group);
> +      j = ((goal - le32toh (sblock->s_first_data_block))
> +          % le32toh (sblock->s_blocks_per_group));
>  #ifdef EXT2FS_DEBUG
>        if (j)
>          goal_attempts++;
>  #endif
> -      bh = disk_cache_block_ref (gdp->bg_block_bitmap);
> +      bh = disk_cache_block_ref (le32toh (gdp->bg_block_bitmap));
>  
>        ext2_debug ("goal is at %d:%d", i, j);
>  
> @@ -211,7 +217,7 @@ repeat:
>              lmap = ((((unsigned long *) bh)[j >> 5]) >>
>              ((j & 31) + 1));
>       
> -          if (j < sblock->s_blocks_per_group - 32)
> +          if (j < le32toh (sblock->s_blocks_per_group) - 32)
>              lmap |= (((unsigned long *) bh)[(j >> 5) + 1]) <<
>              (31 - (j & 31));
>            else
> @@ -220,7 +226,7 @@ repeat:
>            if (lmap != 0xffffffffl)
>              {
>                k = ffz (lmap) + 1;
> -              if ((j + k) < sblock->s_blocks_per_group)
> +              if ((j + k) < le32toh (sblock->s_blocks_per_group))
>                  {
>                    j += k;
>                    goto got_block;
> @@ -240,17 +246,17 @@ repeat:
>         * cyclicly search through the rest of the groups.
>         */
>        p = bh + (j >> 3);
> -      r = memscan (p, 0, (sblock->s_blocks_per_group - j + 7) >> 3);
> +      r = memscan (p, 0, (le32toh (sblock->s_blocks_per_group) - j + 7) >> 
> 3);
>        k = (r - bh) << 3;
> -      if (k < sblock->s_blocks_per_group)
> +      if (k < le32toh (sblock->s_blocks_per_group))
>          {
>            j = k;
>            goto search_back;
>          }
>        k = find_next_zero_bit ((unsigned long *) bh,
> -                              sblock->s_blocks_per_group,
> +                              le32toh (sblock->s_blocks_per_group),
>                                j);
> -      if (k < sblock->s_blocks_per_group)
> +      if (k < le32toh (sblock->s_blocks_per_group))
>          {
>            j = k;
>            goto got_block;
> @@ -272,7 +278,7 @@ repeat:
>        if (i >= groups_count)
>          i = 0;
>        gdp = group_desc (i);
> -      if (gdp->bg_free_blocks_count > 0)
> +      if (le16toh (gdp->bg_free_blocks_count) > 0)
>          break;
>      }
>    if (k >= groups_count)
> @@ -281,15 +287,15 @@ repeat:
>        return 0;
>      }
>    assert_backtrace (bh == NULL);
> -  bh = disk_cache_block_ref (gdp->bg_block_bitmap);
> -  r = memscan (bh, 0, sblock->s_blocks_per_group >> 3);
> +  bh = disk_cache_block_ref (le32toh (gdp->bg_block_bitmap));
> +  r = memscan (bh, 0, le32toh (sblock->s_blocks_per_group) >> 3);
>    j = (r - bh) << 3;
> -  if (j < sblock->s_blocks_per_group)
> +  if (j < le32toh (sblock->s_blocks_per_group))
>      goto search_back;
>    else
>      j = find_first_zero_bit ((unsigned long *) bh,
> -                             sblock->s_blocks_per_group);
> -  if (j >= sblock->s_blocks_per_group)
> +                             le32toh (sblock->s_blocks_per_group));
> +  if (j >= le32toh (sblock->s_blocks_per_group))
>      {
>        disk_cache_block_deref (bh);
>        bh = NULL;
> @@ -310,13 +316,14 @@ search_back:
>  got_block:
>    assert_backtrace (bh != NULL);
>  
> -  ext2_debug ("using block group %d (%d)", i, gdp->bg_free_blocks_count);
> +  ext2_debug ("using block group %d (%d)", i, le16toh 
> (gdp->bg_free_blocks_count));
>  
> -  tmp = j + i * sblock->s_blocks_per_group + sblock->s_first_data_block;
> +  tmp = j + i * le32toh (sblock->s_blocks_per_group) +
> +    le32toh (sblock->s_first_data_block);
>  
> -  if (tmp == gdp->bg_block_bitmap ||
> -      tmp == gdp->bg_inode_bitmap ||
> -      in_range (tmp, gdp->bg_inode_table, itb_per_group))
> +  if (tmp == le32toh (gdp->bg_block_bitmap) ||
> +      tmp == le32toh (gdp->bg_inode_bitmap) ||
> +      in_range (tmp, le32toh (gdp->bg_inode_table), itb_per_group))
>      ext2_panic ("allocating block in system zone; block = %u", tmp);
>  
>    if (set_bit (j, bh))
> @@ -348,7 +355,7 @@ got_block:
>        *prealloc_count = 0;
>        *prealloc_block = tmp + 1;
>        for (k = 1;
> -           k < prealloc_goal && (j + k) < sblock->s_blocks_per_group; k++)
> +           k < prealloc_goal && (j + k) < le32toh 
> (sblock->s_blocks_per_group); k++)
>          {
>            if (set_bit (j + k, bh))
>              break;
> @@ -362,8 +369,10 @@ got_block:
>                pthread_spin_unlock (&modified_global_blocks_lock);
>              }
>          }
> -      gdp->bg_free_blocks_count -= *prealloc_count;
> -      sblock->s_free_blocks_count -= *prealloc_count;
> +      gdp->bg_free_blocks_count = htole16 (le16toh 
> (gdp->bg_free_blocks_count) - 
> +          *prealloc_count);
> +      sblock->s_free_blocks_count = htole32 (le32toh 
> (sblock->s_free_blocks_count) -
> +          *prealloc_count);
>        ext2_debug ("preallocated a further %u bits", *prealloc_count);
>      }
>  #endif
> @@ -373,7 +382,7 @@ got_block:
>    record_global_poke (bh);
>    bh = NULL;
>  
> -  if (j >= sblock->s_blocks_count)
> +  if (j >= le32toh (sblock->s_blocks_count))
>      {
>        ext2_error ("block >= blocks count - block_group = %d, block=%d", i, 
> j);
>        j = 0;
> @@ -383,11 +392,11 @@ got_block:
>    ext2_debug ("allocating block %d; goal hits %d of %d",
>                j, goal_hits, goal_attempts);
>  
> -  gdp->bg_free_blocks_count--;
> +  gdp->bg_free_blocks_count = htole16 (le16toh (gdp->bg_free_blocks_count) - 
> 1);
>    disk_cache_block_ref_ptr (gdp);
>    record_global_poke (gdp);
>  
> -  sblock->s_free_blocks_count--;
> +  sblock->s_free_blocks_count = htole32 (le32toh 
> (sblock->s_free_blocks_count) - 1);
>    sblock_dirty = 1;
>  
>   sync_out:
> @@ -415,28 +424,29 @@ ext2_count_free_blocks ()
>      {
>        void *bh;
>        gdp = group_desc (i);
> -      desc_count += gdp->bg_free_blocks_count;
> -      bh = disk_cache_block_ref (gdp->bg_block_bitmap);
> +      desc_count += le16toh (gdp->bg_free_blocks_count);
> +      bh = disk_cache_block_ref (le32toh (gdp->bg_block_bitmap));
>        x = count_free (bh, block_size);
>        disk_cache_block_deref (bh);
>        printf ("group %d: stored = %d, counted = %lu",
> -              i, gdp->bg_free_blocks_count, x);
> +              i, le16toh (gdp->bg_free_blocks_count), x);
>        bitmap_count += x;
>      }
>    printf ("ext2_count_free_blocks: stored = %u, computed = %lu, %lu",
> -          sblock->s_free_blocks_count, desc_count, bitmap_count);
> +          le32toh (sblock->s_free_blocks_count),
> +          desc_count, bitmap_count);
>    pthread_spin_unlock (&global_lock);
>    return bitmap_count;
>  #else
> -  return sblock->s_free_blocks_count;
> +  return le32toh (sblock->s_free_blocks_count);
>  #endif
>  }
>  
>  static inline int
>  block_in_use (block_t block, unsigned char *map)
>  {
> -  return test_bit ((block - sblock->s_first_data_block) %
> -                   sblock->s_blocks_per_group, map);
> +  return test_bit ((block - le32toh (sblock->s_first_data_block)) %
> +                   le32toh (sblock->s_blocks_per_group), map);
>  }
>  
>  void
> @@ -478,8 +488,8 @@ ext2_check_blocks_bitmap ()
>          }
>  
>        gdp = group_desc (i);
> -      desc_count += gdp->bg_free_blocks_count;
> -      bh = disk_cache_block_ref (gdp->bg_block_bitmap);
> +      desc_count += le16toh (gdp->bg_free_blocks_count);
> +      bh = disk_cache_block_ref (le32toh (gdp->bg_block_bitmap));
>  
>        if (!EXT2_HAS_RO_COMPAT_FEATURE (sblock,
>                                         EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER)
> @@ -494,27 +504,27 @@ ext2_check_blocks_bitmap ()
>                j, i);
>          }
>  
> -      if (!block_in_use (gdp->bg_block_bitmap, bh))
> +      if (!block_in_use (le32toh (gdp->bg_block_bitmap), bh))
>          ext2_error ("block bitmap for group %d is marked free", i);
>  
> -      if (!block_in_use (gdp->bg_inode_bitmap, bh))
> +      if (!block_in_use (le32toh (gdp->bg_inode_bitmap), bh))
>          ext2_error ("inode bitmap for group %d is marked free", i);
>  
>        for (j = 0; j < itb_per_group; j++)
> -        if (!block_in_use (gdp->bg_inode_table + j, bh))
> +        if (!block_in_use (le32toh (gdp->bg_inode_table) + j, bh))
>            ext2_error ("block #%d of the inode table in group %d is marked 
> free", j, i);
>  
>        x = count_free (bh, block_size);
>        disk_cache_block_deref (bh);
> -      if (gdp->bg_free_blocks_count != x)
> +      if (le16toh (gdp->bg_free_blocks_count) != x)
>          ext2_error ("wrong free blocks count for group %d,"
>                      " stored = %d, counted = %lu",
> -                    i, gdp->bg_free_blocks_count, x);
> +                    i, le16toh (gdp->bg_free_blocks_count), x);
>        bitmap_count += x;
>      }
> -  if (sblock->s_free_blocks_count != bitmap_count)
> +  if (le32toh (sblock->s_free_blocks_count) != bitmap_count)
>      ext2_error ("wrong free blocks count in super block,"
>                  " stored = %lu, counted = %lu",
> -                (unsigned long) sblock->s_free_blocks_count, bitmap_count);
> +                (unsigned long) le32toh (sblock->s_free_blocks_count), 
> bitmap_count);
>    pthread_spin_unlock (&global_lock);
>  }
> diff --git a/ext2fs/dir.c b/ext2fs/dir.c
> index 7ba08a2e..85d131c3 100644
> --- a/ext2fs/dir.c
> +++ b/ext2fs/dir.c
> @@ -404,15 +404,15 @@ dirscanblock (vm_address_t blockaddr, struct node *dp, 
> int idx,
>  
>    for (currentoff = blockaddr, prevoff = 0;
>         currentoff < blockaddr + DIRBLKSIZ;
> -       prevoff = currentoff, currentoff += entry->rec_len)
> +       prevoff = currentoff, currentoff += le16toh (entry->rec_len))
>      {
>        entry = (struct ext2_dir_entry_2 *)currentoff;
>  
>        if (!entry->rec_len
> -          || entry->rec_len % EXT2_DIR_PAD
> +          || le16toh (entry->rec_len) % EXT2_DIR_PAD
>            || entry->name_len > EXT2_NAME_LEN
> -          || currentoff + entry->rec_len > blockaddr + DIRBLKSIZ
> -          || EXT2_DIR_REC_LEN (entry->name_len) > entry->rec_len
> +          || currentoff + le16toh (entry->rec_len) > blockaddr + DIRBLKSIZ
> +          || EXT2_DIR_REC_LEN (entry->name_len) > le16toh (entry->rec_len)
>            || memchr (entry->name, '\0', entry->name_len))
>          {
>            ext2_warning ("bad directory entry: inode: %Ld offset: %lu",
> @@ -427,9 +427,9 @@ dirscanblock (vm_address_t blockaddr, struct node *dp, 
> int idx,
>  
>            /* Count how much free space this entry has in it. */
>            if (entry->inode == 0)
> -            thisfree = entry->rec_len;
> +            thisfree = le16toh (entry->rec_len);
>            else
> -            thisfree = entry->rec_len - EXT2_DIR_REC_LEN (entry->name_len);
> +            thisfree = le16toh (entry->rec_len) - EXT2_DIR_REC_LEN 
> (entry->name_len);
>  
>            /* If this isn't at the front of the block, then it will
>               have to be copied if we do a compression; count the
> @@ -514,7 +514,7 @@ dirscanblock (vm_address_t blockaddr, struct node *dp, 
> int idx,
>        ds->preventry = (struct ext2_dir_entry_2 *) prevoff;
>      }
>  
> -  *inum = entry->inode;
> +  *inum = le32toh (entry->inode);
>    return 0;
>  }
>  
> @@ -551,7 +551,8 @@ diskfs_direnter_hard (struct node *dp, const char *name, 
> struct node *np,
>      {
>      case TAKE:
>        /* We are supposed to consume this slot. */
> -      assert_backtrace (ds->entry->inode == 0 && ds->entry->rec_len >= 
> needed);
> +      assert_backtrace (le32toh (ds->entry->inode) == 0
> +                        && le16toh (ds->entry->rec_len) >= needed);
>  
>        new = ds->entry;
>        break;
> @@ -560,12 +561,12 @@ diskfs_direnter_hard (struct node *dp, const char 
> *name, struct node *np,
>        /* We are supposed to take the extra space at the end
>           of this slot. */
>        oldneeded = EXT2_DIR_REC_LEN (ds->entry->name_len);
> -      assert_backtrace (ds->entry->rec_len - oldneeded >= needed);
> +      assert_backtrace (le16toh (ds->entry->rec_len) - oldneeded >= needed);
>  
>        new = (struct ext2_dir_entry_2 *) ((vm_address_t) ds->entry + 
> oldneeded);
>  
> -      new->rec_len = ds->entry->rec_len - oldneeded;
> -      ds->entry->rec_len = oldneeded;
> +      new->rec_len = htole16 (le16toh (ds->entry->rec_len) - oldneeded);
> +      ds->entry->rec_len = htole16 (oldneeded);
>        break;
>  
>      case COMPRESS:
> @@ -579,16 +580,16 @@ diskfs_direnter_hard (struct node *dp, const char 
> *name, struct node *np,
>          {
>            struct ext2_dir_entry_2 *from = (struct ext2_dir_entry_2 *)fromoff;
>            struct ext2_dir_entry_2 *to = (struct ext2_dir_entry_2 *) tooff;
> -          size_t fromreclen = from->rec_len;
> +          size_t fromreclen = le16toh (from->rec_len);
>  
> -          if (from->inode != 0)
> +          if (le32toh (from->inode) != 0)
>              {
>                assert_backtrace (fromoff >= tooff);
>  
>                memmove (to, from, fromreclen);
>                to->rec_len = EXT2_DIR_REC_LEN (to->name_len);
>  
> -              tooff += to->rec_len;
> +              tooff += le16toh (to->rec_len);
>              }
>            fromoff += fromreclen;
>          }
> @@ -597,7 +598,7 @@ diskfs_direnter_hard (struct node *dp, const char *name, 
> struct node *np,
>        assert_backtrace (totfreed >= needed);
>  
>        new = (struct ext2_dir_entry_2 *) tooff;
> -      new->rec_len = totfreed;
> +      new->rec_len = htole16 (totfreed);
>        break;
>  
>      case EXTEND:
> @@ -634,7 +635,7 @@ diskfs_direnter_hard (struct node *dp, const char *name, 
> struct node *np,
>        dp->dn_stat.st_size = oldsize + DIRBLKSIZ;
>        dp->dn_set_ctime = 1;
>  
> -      new->rec_len = DIRBLKSIZ;
> +      new->rec_len = htole16 (DIRBLKSIZ);
>        break;
>  
>      default:
> @@ -645,7 +646,7 @@ diskfs_direnter_hard (struct node *dp, const char *name, 
> struct node *np,
>    /* NEW points to the directory entry being written, and its
>       rec_len field is already filled in.  Now fill in the rest.  */
>  
> -  new->inode = np->cache_id;
> +  new->inode = htole32 (np->cache_id);
>  #if 0
>    /* XXX We cannot enable this code because file types can change
>       (and conceivably quite often) with translator settings.
> @@ -726,8 +727,8 @@ diskfs_dirremove_hard (struct node *dp, struct dirstat 
> *ds)
>    else
>      {
>        assert_backtrace ((vm_address_t) ds->entry - (vm_address_t) 
> ds->preventry
> -                        == ds->preventry->rec_len);
> -      ds->preventry->rec_len += ds->entry->rec_len;
> +                        == le16toh (ds->preventry->rec_len));
> +      ds->preventry->rec_len = htole16( le16toh (ds->preventry->rec_len) + 
> ds->entry->rec_len);
>      }
>  
>    dp->dn_set_mtime = 1;
> @@ -761,7 +762,7 @@ diskfs_dirrewrite_hard (struct node *dp, struct node *np, 
> struct dirstat *ds)
>  
>    assert_backtrace (!diskfs_readonly);
>  
> -  ds->entry->inode = np->cache_id;
> +  ds->entry->inode = htole32 (np->cache_id);
>    dp->dn_set_mtime = 1;
>    diskfs_node_disknode (dp)->info.i_flags &= ~EXT2_BTREE_FL;
>  
> @@ -796,11 +797,11 @@ diskfs_dirempty (struct node *dp, struct protid *cred)
>  
>    for (curoff = buf;
>         !hit && curoff < buf + dp->dn_stat.st_size;
> -       curoff += entry->rec_len)
> +       curoff += le16toh (entry->rec_len))
>      {
>        entry = (struct ext2_dir_entry_2 *) curoff;
>  
> -      if (entry->inode != 0
> +      if (le32toh (entry->inode) != 0
>            && (entry->name_len > 2
>              || entry->name[0] != '.'
>              || (entry->name[1] != '.'
> @@ -853,10 +854,10 @@ count_dirents (struct node *dp, block_t nb, char *buf)
>  
>    for (offinblk = buf;
>         offinblk < buf + DIRBLKSIZ;
> -       offinblk += entry->rec_len)
> +       offinblk += le16toh (entry->rec_len))
>      {
>        entry = (struct ext2_dir_entry_2 *) offinblk;
> -      if (entry->inode)
> +      if (le32toh (entry->inode))
>          count++;
>      }
>  
> @@ -982,7 +983,7 @@ diskfs_get_directs (struct node *dp,
>          }
>        for (i = 0, bufp = buf;
>            i < entry - curentry && bufp - buf < DIRBLKSIZ;
> -          bufp += ((struct ext2_dir_entry_2 *)bufp)->rec_len, i++)
> +          bufp += le16toh (((struct ext2_dir_entry_2 *)bufp)->rec_len), i++)
>          ;
>        /* Make sure we didn't run off the end. */
>        assert_backtrace (bufp - buf < DIRBLKSIZ);
> @@ -1009,7 +1010,7 @@ diskfs_get_directs (struct node *dp,
>  
>        entryp = (struct ext2_dir_entry_2 *)bufp;
>  
> -      if (entryp->inode)
> +      if (le32toh (entryp->inode))
>          {
>            int rec_len;
>            int name_len = entryp->name_len;
> @@ -1033,7 +1034,7 @@ diskfs_get_directs (struct node *dp,
>              if (datap + rec_len > *data + allocsize)
>                break;
>  
> -          userp->d_fileno = entryp->inode;
> +          userp->d_fileno = le32toh (entryp->inode);
>            userp->d_reclen = rec_len;
>            userp->d_namlen = name_len;
>  
> @@ -1066,7 +1067,7 @@ diskfs_get_directs (struct node *dp,
>            i++;
>          }
>  
> -      if (entryp->rec_len == 0)
> +      if (le16toh (entryp->rec_len) == 0)
>          {
>            ext2_warning ("zero length directory entry: inode: %Ld offset: 
> %zd",
>                dp->cache_id,
> @@ -1074,7 +1075,7 @@ diskfs_get_directs (struct node *dp,
>            return EIO;
>          }
>  
> -      bufp += entryp->rec_len;
> +      bufp += le16toh (entryp->rec_len);
>        if (bufp - buf == DIRBLKSIZ)
>          {
>            blkno++;
> @@ -1084,7 +1085,7 @@ diskfs_get_directs (struct node *dp,
>          {
>            ext2_warning ("directory entry too long: inode: %Ld offset: %zd",
>                dp->cache_id,
> -              blkno * DIRBLKSIZ + bufp - buf - entryp->rec_len);
> +              blkno * DIRBLKSIZ + bufp - buf - le16toh (entryp->rec_len));
>            return EIO;
>          }
>      }
> diff --git a/ext2fs/ext2_fs.h b/ext2fs/ext2_fs.h
> index d838172a..83eec66b 100644
> --- a/ext2fs/ext2_fs.h
> +++ b/ext2fs/ext2_fs.h
> @@ -65,12 +65,12 @@
>  #define EXT2_ACLE_PER_BLOCK(s)         (EXT2_BLOCK_SIZE(s) / sizeof (struct 
> ext2_acl_entry))
>  #define EXT2_ADDR_PER_BLOCK(s)          (EXT2_BLOCK_SIZE(s) / sizeof (__u32))
>  #define EXT2_BLOCK_SIZE_BITS(s)       ((s)->s_log_block_size + 10)
> -#define EXT2_INODE_SIZE(s)     (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \
> -                                EXT2_GOOD_OLD_INODE_SIZE : \
> -                                (s)->s_inode_size)
> -#define EXT2_FIRST_INO(s)      (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \
> -                                EXT2_GOOD_OLD_FIRST_INO : \
> -                                (s)->s_first_ino)
> +#define EXT2_INODE_SIZE(s)     (((s)->s_rev_level == 
> htole32(EXT2_GOOD_OLD_REV)) ? \
> +                                le32toh (EXT2_GOOD_OLD_INODE_SIZE) : \
> +                                le32toh ((s)->s_inode_size))
> +#define EXT2_FIRST_INO(s)      (((s)->s_rev_level == 
> htole32(EXT2_GOOD_OLD_REV)) ? \
> +                                le32toh (EXT2_GOOD_OLD_FIRST_INO) : \
> +                                (le32toh ((s)->s_first_ino)))
>  
>  /*
>   * Macro-instructions used to manage fragments
> @@ -78,7 +78,7 @@
>  #define EXT2_MIN_FRAG_SIZE           1024
>  #define EXT2_MAX_FRAG_SIZE           4096
>  #define EXT2_MIN_FRAG_LOG_SIZE                 10
> -#define EXT2_FRAG_SIZE(s)                            (EXT2_MIN_FRAG_SIZE << 
> (s)->s_log_frag_size)
> +#define EXT2_FRAG_SIZE(s)                            (EXT2_MIN_FRAG_SIZE << 
> le32toh((s)->s_log_frag_size))
>  #define EXT2_FRAGS_PER_BLOCK(s)              (EXT2_BLOCK_SIZE(s) / 
> EXT2_FRAG_SIZE(s))
>  
>  /*
> @@ -121,9 +121,9 @@ struct ext2_group_desc
>  /*
>   * Macro-instructions used to manage group descriptors
>   */
> -#define EXT2_BLOCKS_PER_GROUP(s)                     
> ((s)->s_blocks_per_group)
> +#define EXT2_BLOCKS_PER_GROUP(s)                     (le32toh 
> ((s)->s_blocks_per_group))
>  #define EXT2_DESC_PER_BLOCK(s)                               
> (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_group
> -#define EXT2_INODES_PER_GROUP(s)                     ((s)->s_inodes_per_group
> +#define EXT2_INODES_PER_GROUP(s)                     (le32toh 
> ((s)->s_inodes_per_group))
>  
>  /*
>   * Constants relative to the data blocks
> @@ -417,23 +417,23 @@ struct ext2_super_block {
>   */
>  
>  #define EXT2_HAS_COMPAT_FEATURE(sb,mask)                     \
> -     ( (sb)->s_feature_compat & (mask) )
> +     ( (sb)->s_feature_compat & htole32 (mask) )
>  #define EXT2_HAS_RO_COMPAT_FEATURE(sb,mask)                  \
> -     ( (sb)->s_feature_ro_compat & (mask) )
> +     ( (sb)->s_feature_ro_compat & htole32 (mask) )
>  #define EXT2_HAS_INCOMPAT_FEATURE(sb,mask)                   \
> -     ( (sb)->s_feature_incompat & (mask) )
> +     ( (sb)->s_feature_incompat & htole32 (mask) )
>  #define EXT2_SET_COMPAT_FEATURE(sb,mask)                     \
> -     (sb)->s_feature_compat |= (mask)
> +     (sb)->s_feature_compat |= htole32 (mask)
>  #define EXT2_SET_RO_COMPAT_FEATURE(sb,mask)                  \
> -     (sb)->s_feature_ro_compat |= (mask)
> +     (sb)->s_feature_ro_compat |= htole32 (mask)
>  #define EXT2_SET_INCOMPAT_FEATURE(sb,mask)                   \
> -     (sb)->s_feature_incompat |= (mask)
> +     (sb)->s_feature_incompat |= htole32 (mask)
>  #define EXT2_CLEAR_COMPAT_FEATURE(sb,mask)                   \
> -     (sb)->s_feature_compat &= ~(mask)
> +     (sb)->s_feature_compat &= ~htole32 (mask)
>  #define EXT2_CLEAR_RO_COMPAT_FEATURE(sb,mask)                        \
> -     (sb)->s_feature_ro_compat &= ~(mask)
> +     (sb)->s_feature_ro_compat &= ~htole32 (mask)
>  #define EXT2_CLEAR_INCOMPAT_FEATURE(sb,mask)                 \
> -     (sb)->s_feature_incompat &= ~(mask)
> +     (sb)->s_feature_incompat &= ~htole32 (mask)
>  
>  #define EXT2_FEATURE_COMPAT_DIR_PREALLOC     0x0001
>  #define EXT2_FEATURE_COMPAT_IMAGIC_INODES    0x0002
> diff --git a/ext2fs/ext2fs.h b/ext2fs/ext2fs.h
> index f8e3ba45..ac45693b 100644
> --- a/ext2fs/ext2fs.h
> +++ b/ext2fs/ext2fs.h
> @@ -32,6 +32,7 @@
>  #include <assert-backtrace.h>
>  #include <pthread.h>
>  #include <sys/mman.h>
> +#include <endian.h>
>  
>  /* Types used by the ext2 header files.  */
>  typedef u_int32_t __u32;
> @@ -290,7 +291,7 @@ extern unsigned int block_size;
>  extern unsigned int log2_block_size;
>  
>  /* The number of bits to scale min-blocks to get filesystem blocks.  */
> -#define BLOCKSIZE_SCALE      (sblock->s_log_block_size)
> +#define BLOCKSIZE_SCALE      (le32toh (sblock->s_log_block_size))
>  
>  /* log2 of the number of device blocks in a filesystem block.  */
>  extern unsigned log2_dev_blocks_per_fs_block;
> @@ -401,7 +402,7 @@ bptr_offs (void *ptr)
>  #define group_desc(num)      (&group_desc_image[num])
>  extern struct ext2_group_desc *group_desc_image;
>  
> -#define inode_group_num(inum) (((inum) - 1) / sblock->s_inodes_per_group)
> +#define inode_group_num(inum) (((inum) - 1) / le32toh 
> (sblock->s_inodes_per_group))
>  
>  /* Forward declarations for the following functions that are usually
>     inlined.  In case inlining is disabled, or inlining is not
> @@ -415,7 +416,7 @@ extern void _dino_deref (struct ext2_inode *inode);
>  EXT2FS_EI struct ext2_inode *
>  dino_ref (ino_t inum)
>  {
> -  unsigned long inodes_per_group = sblock->s_inodes_per_group;
> +  unsigned long inodes_per_group = le32toh (sblock->s_inodes_per_group);
>    unsigned long bg_num = (inum - 1) / inodes_per_group;
>    unsigned long group_inum = (inum - 1) % inodes_per_group;
>    struct ext2_group_desc *bg = group_desc (bg_num);
> diff --git a/ext2fs/getblk.c b/ext2fs/getblk.c
> index 10a34f8d..d33e1c53 100644
> --- a/ext2fs/getblk.c
> +++ b/ext2fs/getblk.c
> @@ -152,7 +152,7 @@ inode_getblk (struct node *node, int nr, int create, int 
> zero,
>          goal =
>            (diskfs_node_disknode (node)->info.i_block_group
>             * EXT2_BLOCKS_PER_GROUP (sblock))
> -          + sblock->s_first_data_block;
> +          + le32toh (sblock->s_first_data_block);
>      }
>  
>    *result = ext2_alloc_block (node, goal, zero);
> diff --git a/ext2fs/hyper.c b/ext2fs/hyper.c
> index 6fc95eaf..1bb74e53 100644
> --- a/ext2fs/hyper.c
> +++ b/ext2fs/hyper.c
> @@ -42,7 +42,7 @@ allocate_mod_map (void)
>         global blocks are actually modified so the pager can write only them. 
> */
>      {
>        /* One bit per filesystem block.  */
> -      mod_map_size = sblock->s_blocks_count >> 3;
> +      mod_map_size = le32toh (sblock->s_blocks_count) >> 3;
>        modified_global_blocks = mmap (0, mod_map_size, PROT_READ|PROT_WRITE,
>                                       MAP_ANON, 0, 0);
>        assert_backtrace (modified_global_blocks != (void *) -1);
> @@ -70,15 +70,15 @@ get_hypermetadata (void)
>    if (err || read != SBLOCK_SIZE)
>      ext2_panic ("Cannot read hypermetadata");
>  
> -  if (sblock->s_magic != EXT2_SUPER_MAGIC
> +  if (sblock->s_magic != htole16 (EXT2_SUPER_MAGIC)
>  #ifdef EXT2FS_PRE_02B_COMPAT
> -      && sblock->s_magic != EXT2_PRE_02B_MAGIC
> +      && sblock->s_magic != htole16 (EXT2_PRE_02B_MAGIC)
>  #endif
>        )
>      ext2_panic ("bad magic number %#x (should be %#x)",
> -                sblock->s_magic, EXT2_SUPER_MAGIC);
> +                le16toh (sblock->s_magic), EXT2_SUPER_MAGIC);
>  
> -  log2_block_size = EXT2_MIN_BLOCK_LOG_SIZE + sblock->s_log_block_size;
> +  log2_block_size = EXT2_MIN_BLOCK_LOG_SIZE + 
> le32toh(sblock->s_log_block_size);
>    block_size = 1 << log2_block_size;
>  
>    if (block_size > EXT2_MAX_BLOCK_SIZE)
> @@ -98,10 +98,10 @@ get_hypermetadata (void)
>      ext2_panic ("block size %d isn't a power-of-two multiple of 512!",
>                  block_size);
>  
> -  if ((store->size >> log2_block_size) < sblock->s_blocks_count)
> +  if ((store->size >> log2_block_size) < le32toh (sblock->s_blocks_count))
>      ext2_panic ("disk size (%qd bytes) too small; superblock says we need 
> %qd",
>                 (long long int) store->size,
> -               (long long int) sblock->s_blocks_count << log2_block_size);
> +               (long long int) le32toh (sblock->s_blocks_count) << 
> log2_block_size);
>    if (log2_dev_blocks_per_fs_block != 0
>        && (store->size & ((1 << log2_dev_blocks_per_fs_block) - 1)) != 0)
>      ext2_warning ("%Ld (%zd byte) device blocks "
> @@ -112,12 +112,12 @@ get_hypermetadata (void)
>    /* Set these handy variables.  */
>    inodes_per_block = block_size / EXT2_INODE_SIZE (sblock);
>  
> -  frag_size = EXT2_MIN_FRAG_SIZE << sblock->s_log_frag_size;
> +  frag_size = EXT2_MIN_FRAG_SIZE << le32toh (sblock->s_log_frag_size);
>    if (frag_size == 0)
>      ext2_panic ("frag size is zero!");
>    frags_per_block = block_size / frag_size;
>  
> -  if (sblock->s_rev_level > EXT2_GOOD_OLD_REV)
> +  if (sblock->s_rev_level > htole32 (EXT2_GOOD_OLD_REV))
>      {
>        features = EXT2_HAS_INCOMPAT_FEATURE(sblock, 
> EXT2_FEATURE_INCOMPAT_UNSUPPORTED);
>        if (features)
> @@ -132,21 +132,21 @@ get_hypermetadata (void)
>                          features);
>            diskfs_readonly = 1;
>          }
> -      if (sblock->s_inode_size != EXT2_GOOD_OLD_INODE_SIZE)
> -        ext2_panic ("inode size %d isn't supported", sblock->s_inode_size);
> +      if (le16toh (sblock->s_inode_size) != EXT2_GOOD_OLD_INODE_SIZE)
> +        ext2_panic ("inode size %d isn't supported", le16toh 
> (sblock->s_inode_size));
>      }
>  
>    groups_count =
> -    ((sblock->s_blocks_count - sblock->s_first_data_block +
> -      sblock->s_blocks_per_group - 1)
> -     / sblock->s_blocks_per_group);
> +    ((le32toh (sblock->s_blocks_count) - le32toh 
> (sblock->s_first_data_block) +
> +      le32toh (sblock->s_blocks_per_group) - 1)
> +     / le32toh (sblock->s_blocks_per_group));
>  
> -  itb_per_group = sblock->s_inodes_per_group / inodes_per_block;
> +  itb_per_group = le32toh (sblock->s_inodes_per_group) / inodes_per_block;
>    desc_per_block = block_size / sizeof (struct ext2_group_desc);
>    addr_per_block = block_size / sizeof (block_t);
>    db_per_group = (groups_count + desc_per_block - 1) / desc_per_block;
>  
> -  ext2fs_clean = sblock->s_state & EXT2_VALID_FS;
> +  ext2fs_clean = sblock->s_state & htole16 (EXT2_VALID_FS);
>    if (! ext2fs_clean)
>      {
>        ext2_warning ("FILESYSTEM NOT UNMOUNTED CLEANLY; PLEASE fsck");
> @@ -183,16 +183,16 @@ map_hypermetadata (void)
>  error_t
>  diskfs_set_hypermetadata (int wait, int clean)
>  {
> -  if (clean && ext2fs_clean && !(sblock->s_state & EXT2_VALID_FS))
> +  if (clean && ext2fs_clean && !(sblock->s_state & htole16 (EXT2_VALID_FS)))
>      /* The filesystem is clean, so we need to set the clean flag.  */
>      {
> -      sblock->s_state |= EXT2_VALID_FS;
> +      sblock->s_state |= htole16 (EXT2_VALID_FS);
>        sblock_dirty = 1;
>      }
> -  else if (!clean && (sblock->s_state & EXT2_VALID_FS))
> +  else if (!clean && (sblock->s_state & htole16 (EXT2_VALID_FS)))
>      /* The filesystem just became dirty, so clear the clean flag.  */
>      {
> -      sblock->s_state &= ~EXT2_VALID_FS;
> +      sblock->s_state &= htole16 (~EXT2_VALID_FS);
>        sblock_dirty = 1;
>        wait = 1;
>      }
> @@ -221,6 +221,6 @@ diskfs_readonly_changed (int readonly)
>    mprotect (disk_cache, disk_cache_size,
>              PROT_READ | (readonly ? 0 : PROT_WRITE));
>  
> -  if (!readonly && !(sblock->s_state & EXT2_VALID_FS))
> +  if (!readonly && !(sblock->s_state & htole16 (EXT2_VALID_FS)))
>      ext2_warning ("UNCLEANED FILESYSTEM NOW WRITABLE");
>  }
> diff --git a/ext2fs/ialloc.c b/ext2fs/ialloc.c
> index 46821a1f..73778bee 100644
> --- a/ext2fs/ialloc.c
> +++ b/ext2fs/ialloc.c
> @@ -66,18 +66,18 @@ diskfs_free_node (struct node *np, mode_t old_mode)
>  
>    pthread_spin_lock (&global_lock);
>  
> -  if (inum < EXT2_FIRST_INO (sblock) || inum > sblock->s_inodes_count)
> +  if (inum < EXT2_FIRST_INO (sblock) || inum > le32toh 
> (sblock->s_inodes_count))
>      {
>        ext2_error ("reserved inode or nonexistent inode: %Ld", inum);
>        pthread_spin_unlock (&global_lock);
>        return;
>      }
>  
> -  block_group = (inum - 1) / sblock->s_inodes_per_group;
> -  bit = (inum - 1) % sblock->s_inodes_per_group;
> +  block_group = (inum - 1) / le32toh (sblock->s_inodes_per_group);
> +  bit = (inum - 1) % le32toh (sblock->s_inodes_per_group);
>  
>    gdp = group_desc (block_group);
> -  bh = disk_cache_block_ref (gdp->bg_inode_bitmap);
> +  bh = disk_cache_block_ref (le32toh (gdp->bg_inode_bitmap));
>  
>    if (!clear_bit (bit, bh))
>      ext2_warning ("bit already cleared for inode %Ld", inum);
> @@ -86,13 +86,13 @@ diskfs_free_node (struct node *np, mode_t old_mode)
>        disk_cache_block_ref_ptr (bh);
>        record_global_poke (bh);
>  
> -      gdp->bg_free_inodes_count++;
> +      gdp->bg_free_inodes_count = htole32 (le32toh 
> (gdp->bg_free_inodes_count) + 1);
>        if (S_ISDIR (old_mode))
> -        gdp->bg_used_dirs_count--;
> +        gdp->bg_used_dirs_count = htole16 (le16toh (gdp->bg_used_dirs_count) 
> - 1);
>        disk_cache_block_ref_ptr (gdp);
>        record_global_poke (gdp);
>  
> -      sblock->s_free_inodes_count++;
> +      sblock->s_free_inodes_count = htole32 (le32toh 
> (sblock->s_free_inodes_count) + 1);
>      }
>  
>    disk_cache_block_deref (bh);
> @@ -131,7 +131,7 @@ repeat:
>  
>    if (S_ISDIR (mode))
>      {
> -      avefreei = sblock->s_free_inodes_count / groups_count;
> +      avefreei = le32toh (sblock->s_free_inodes_count) / groups_count;
>  
>  /* I am not yet convinced that this next bit is necessary.
>        i = inode_group_num(dir_inum);
> @@ -153,11 +153,12 @@ repeat:
>            for (j = 0; j < groups_count; j++)
>              {
>                tmp = group_desc (j);
> -              if (tmp->bg_free_inodes_count
> -                  && tmp->bg_free_inodes_count >= avefreei)
> +              if (le16toh (tmp->bg_free_inodes_count)
> +                  && le16toh (tmp->bg_free_inodes_count) >= avefreei)
>                  {
>                    if (!gdp ||
> -                      (tmp->bg_free_blocks_count > 
> gdp->bg_free_blocks_count))
> +                      (le16toh (tmp->bg_free_blocks_count) >
> +                       le16toh (gdp->bg_free_blocks_count)))
>                    {
>                      i = j;
>                      gdp = tmp;
> @@ -173,7 +174,7 @@ repeat:
>         */
>        i = inode_group_num(dir_inum);
>        tmp = group_desc (i);
> -      if (tmp->bg_free_inodes_count)
> +      if (le16toh (tmp->bg_free_inodes_count))
>          gdp = tmp;
>        else
>          {
> @@ -187,7 +188,7 @@ repeat:
>              if (i >= groups_count)
>                i -= groups_count;
>              tmp = group_desc (i);
> -            if (tmp->bg_free_inodes_count)
> +            if (le16toh (tmp->bg_free_inodes_count))
>                {
>                  gdp = tmp;
>                  break;
> @@ -205,7 +206,7 @@ repeat:
>                if (++i >= groups_count)
>                  i = 0;
>                tmp = group_desc (i);
> -              if (tmp->bg_free_inodes_count)
> +              if (le16toh (tmp->bg_free_inodes_count))
>                  {
>                    gdp = tmp;
>                    break;
> @@ -220,10 +221,10 @@ repeat:
>        return 0;
>      }
>  
> -  bh = disk_cache_block_ref (gdp->bg_inode_bitmap);
> +  bh = disk_cache_block_ref (le32toh (gdp->bg_inode_bitmap));
>    if ((inum =
> -       find_first_zero_bit ((unsigned long *) bh, 
> sblock->s_inodes_per_group))
> -      < sblock->s_inodes_per_group)
> +       find_first_zero_bit ((unsigned long *) bh, le32toh 
> (sblock->s_inodes_per_group)))
> +      < le32toh (sblock->s_inodes_per_group))
>      {
>        if (set_bit (inum, bh))
>          {
> @@ -239,7 +240,7 @@ repeat:
>      {
>        disk_cache_block_deref (bh);
>        bh = NULL;
> -      if (gdp->bg_free_inodes_count != 0)
> +      if (le16toh (gdp->bg_free_inodes_count) != 0)
>          {
>            ext2_error ("free inodes count corrupted in group %d", i);
>            inum = 0;
> @@ -248,8 +249,8 @@ repeat:
>        goto repeat;
>      }
>  
> -  inum += i * sblock->s_inodes_per_group + 1;
> -  if (inum < EXT2_FIRST_INO (sblock) || inum > sblock->s_inodes_count)
> +  inum += i * le32toh (sblock->s_inodes_per_group) + 1;
> +  if (inum < EXT2_FIRST_INO (sblock) || inum > le32toh 
> (sblock->s_inodes_count))
>      {
>        ext2_error ("reserved inode or inode > inodes count - "
>                    "block_group = %d,inode=%llu", i, inum);
> @@ -257,13 +258,13 @@ repeat:
>        goto sync_out;
>      }
>  
> -  gdp->bg_free_inodes_count--;
> +  gdp->bg_free_inodes_count = htole16 (le16toh (gdp->bg_free_inodes_count) - 
> 1);
>    if (S_ISDIR (mode))
> -    gdp->bg_used_dirs_count++;
> +    gdp->bg_used_dirs_count = htole16 (le16toh (gdp->bg_used_dirs_count) + 
> 1);
>    disk_cache_block_ref_ptr (gdp);
>    record_global_poke (gdp);
>  
> -  sblock->s_free_inodes_count--;
> +  sblock->s_free_inodes_count = htole32( 
> le32toh(sblock->s_free_inodes_count) - 1);
>    sblock_dirty = 1;
>  
>   sync_out:
> @@ -381,20 +382,20 @@ ext2_count_free_inodes ()
>      {
>        void *bh;
>        gdp = group_desc (i);
> -      desc_count += gdp->bg_free_inodes_count;
> -      bh = disk_cache_block_ref (gdp->bg_inode_bitmap);
> -      x = count_free (bh, sblock->s_inodes_per_group / 8);
> +      desc_count += le16toh (gdp->bg_free_inodes_count);
> +      bh = disk_cache_block_ref (le32toh (gdp->bg_inode_bitmap));
> +      x = count_free (bh, le32toh (sblock->s_inodes_per_group) / 8);
>        disk_cache_block_deref (bh);
>        ext2_debug ("group %d: stored = %d, counted = %lu",
> -                  i, gdp->bg_free_inodes_count, x);
> +                  i, le16toh (gdp->bg_free_inodes_count), x);
>        bitmap_count += x;
>      }
>    ext2_debug ("stored = %u, computed = %lu, %lu",
> -              sblock->s_free_inodes_count, desc_count, bitmap_count);
> +              le32toh (sblock->s_free_inodes_count), desc_count, 
> bitmap_count);
>    pthread_spin_unlock (&global_lock);
>    return desc_count;
>  #else
> -  return sblock->s_free_inodes_count;
> +  return le32toh (sblock->s_free_inodes_count);
>  #endif
>  }
>  
> @@ -416,20 +417,20 @@ ext2_check_inodes_bitmap ()
>      {
>        void *bh;
>        gdp = group_desc (i);
> -      desc_count += gdp->bg_free_inodes_count;
> -      bh = disk_cache_block_ref (gdp->bg_inode_bitmap);
> -      x = count_free (bh, sblock->s_inodes_per_group / 8);
> +      desc_count += le16toh (gdp->bg_free_inodes_count);
> +      bh = disk_cache_block_ref (le32toh (gdp->bg_inode_bitmap));
> +      x = count_free (bh, le32toh (sblock->s_inodes_per_group) / 8);
>        disk_cache_block_deref (bh);
> -      if (gdp->bg_free_inodes_count != x)
> +      if (le16toh (gdp->bg_free_inodes_count) != x)
>          ext2_error ("wrong free inodes count in group %d, "
>                      "stored = %d, counted = %lu",
> -                    i, gdp->bg_free_inodes_count, x);
> +                    i, le16toh (gdp->bg_free_inodes_count), x);
>        bitmap_count += x;
>      }
> -  if (sblock->s_free_inodes_count != bitmap_count)
> +  if (le32toh (sblock->s_free_inodes_count) != bitmap_count)
>      ext2_error ("wrong free inodes count in super block, "
>                  "stored = %lu, counted = %lu",
> -                (unsigned long) sblock->s_free_inodes_count, bitmap_count);
> +                (unsigned long) le32toh (sblock->s_free_inodes_count), 
> bitmap_count);
>  
>    pthread_spin_unlock (&global_lock);
>  }
> diff --git a/ext2fs/inode.c b/ext2fs/inode.c
> index fe1af528..47d05f47 100644
> --- a/ext2fs/inode.c
> +++ b/ext2fs/inode.c
> @@ -130,45 +130,45 @@ diskfs_user_read_node (struct node *np, struct 
> lookup_context *ctx)
>    st->st_ino = np->cache_id;
>    st->st_blksize = vm_page_size * 2;
>  
> -  st->st_nlink = di->i_links_count;
> -  st->st_size = di->i_size;
> -  st->st_gen = di->i_generation;
> +  st->st_nlink = le16toh (di->i_links_count);
> +  st->st_size = le32toh (di->i_size);
> +  st->st_gen = le32toh (di->i_generation);
>  
> -  st->st_atim.tv_sec = di->i_atime;
> +  st->st_atim.tv_sec = le32toh (di->i_atime);
>  #ifdef not_yet
>    /* ``struct ext2_inode'' doesn't do better than sec. precision yet.  */
>  #else
>    st->st_atim.tv_nsec = 0;
>  #endif
> -  st->st_mtim.tv_sec = di->i_mtime;
> +  st->st_mtim.tv_sec = le32toh (di->i_mtime);
>  #ifdef not_yet
>    /* ``struct ext2_inode'' doesn't do better than sec. precision yet.  */
>  #else
>    st->st_mtim.tv_nsec = 0;
>  #endif
> -  st->st_ctim.tv_sec = di->i_ctime;
> +  st->st_ctim.tv_sec = le32toh (di->i_ctime);
>  #ifdef not_yet
>    /* ``struct ext2_inode'' doesn't do better than sec. precision yet.  */
>  #else
>    st->st_ctim.tv_nsec = 0;
>  #endif
>  
> -  st->st_blocks = di->i_blocks;
> +  st->st_blocks = le32toh (di->i_blocks);
>  
>    st->st_flags = 0;
> -  if (di->i_flags & EXT2_APPEND_FL)
> +  if (di->i_flags & htole32 (EXT2_APPEND_FL))
>      st->st_flags |= UF_APPEND;
> -  if (di->i_flags & EXT2_NODUMP_FL)
> +  if (di->i_flags & htole32 (EXT2_NODUMP_FL))
>      st->st_flags |= UF_NODUMP;
> -  if (di->i_flags & EXT2_IMMUTABLE_FL)
> +  if (di->i_flags & htole32 (EXT2_IMMUTABLE_FL))
>      st->st_flags |= UF_IMMUTABLE;
>  
> -  if (sblock->s_creator_os == EXT2_OS_HURD)
> +  if (sblock->s_creator_os == htole32 (EXT2_OS_HURD))
>      {
> -      st->st_mode = di->i_mode | (di->i_mode_high << 16);
> +      st->st_mode = le16toh (di->i_mode) | (le16toh (di->i_mode_high) << 16);
>        st->st_mode &= ~S_ITRANS;
>  
> -      if (di->i_translator)
> +      if (le32toh (di->i_translator))
>          st->st_mode |= S_IPTRANS;
>        else
>          {
> @@ -178,41 +178,41 @@ diskfs_user_read_node (struct node *np, struct 
> lookup_context *ctx)
>              st->st_mode |= S_IPTRANS;
>          }
>  
> -      st->st_uid = di->i_uid | (di->i_uid_high << 16);
> -      st->st_gid = di->i_gid | (di->i_gid_high << 16);
> +      st->st_uid = le16toh (di->i_uid) | (le16toh (di->i_uid_high) << 16);
> +      st->st_gid = le16toh (di->i_gid) | (le16toh (di->i_gid_high) << 16);
>  
> -      st->st_author = di->i_author;
> +      st->st_author = le32toh (di->i_author);
>        if (st->st_author == -1)
>          st->st_author = st->st_uid;
>      }
>    else
>      {
> -      st->st_mode = di->i_mode & ~S_ITRANS;
> -      st->st_uid = di->i_uid;
> -      st->st_gid = di->i_gid;
> +      st->st_mode = le16toh (di->i_mode) & ~S_ITRANS;
> +      st->st_uid = le16toh (di->i_uid);
> +      st->st_gid = le16toh (di->i_gid);
>        st->st_author = st->st_uid;
>        np->author_tracks_uid = 1;
>      }
>  
>    /* Setup the ext2fs auxiliary inode info.  */
> -  info->i_dtime = di->i_dtime;
> -  info->i_flags = di->i_flags;
> -  info->i_faddr = di->i_faddr;
> +  info->i_dtime = le32toh (di->i_dtime);
> +  info->i_flags = le32toh (di->i_flags);
> +  info->i_faddr = le32toh (di->i_faddr);
>    info->i_frag_no = di->i_frag;
>    info->i_frag_size = di->i_fsize;
>    info->i_osync = 0;
> -  info->i_file_acl = di->i_file_acl;
> +  info->i_file_acl = le32toh (di->i_file_acl);
>    if (S_ISDIR (st->st_mode))
> -    info->i_dir_acl = di->i_dir_acl;
> +    info->i_dir_acl = le32toh (di->i_dir_acl);
>    else
>      {
>        info->i_dir_acl = 0;
>        if (sizeof (off_t) >= 8)
>          /* 64bit file size */
> -        st->st_size += ((off_t) di->i_size_high) << 32;
> +        st->st_size += ((off_t) le32toh (di->i_size_high)) << 32;
>        else
>          {
> -          if (di->i_size_high)       /* XXX */
> +          if (le32toh (di->i_size_high))     /* XXX */
>              {
>                dino_deref (di);
>                ext2_warning ("cannot handle large file inode %Ld", 
> np->cache_id);
> @@ -230,14 +230,18 @@ diskfs_user_read_node (struct node *np, struct 
> lookup_context *ctx)
>    dn->last_page_partially_writable = 0;
>  
>    if (S_ISCHR (st->st_mode) || S_ISBLK (st->st_mode))
> -    st->st_rdev = di->i_block[0];
> +    st->st_rdev = le32toh (di->i_block[0]);
>    else
>      {
> +      /*
> +       * NOTE! The in-memory inode i_data array is in little-endian order
> +       * even on big-endian machines: we do NOT byteswap the block numbers!
> +       */
>        memcpy (info->i_data, di->i_block,
>                EXT2_N_BLOCKS * sizeof info->i_data[0]);
>        st->st_rdev = 0;
>      }
> -  dn->info_i_translator = di->i_translator;
> +  dn->info_i_translator = le32toh (di->i_translator);
>  
>    dino_deref (di);
>    diskfs_end_catch_exception ();
> @@ -280,7 +284,7 @@ diskfs_user_read_node (struct node *np, struct 
> lookup_context *ctx)
>  static inline error_t
>  check_high_bits (struct node *np, long l)
>  {
> -  if (sblock->s_creator_os == EXT2_OS_HURD)
> +  if (sblock->s_creator_os == htole32 (EXT2_OS_HURD))
>      return 0;
>  
>    /* Linux 2.3.42 has a mount-time option (not a bit stored on disk)
> @@ -325,7 +329,7 @@ diskfs_validate_mode_change (struct node *np, mode_t mode)
>  error_t
>  diskfs_validate_author_change (struct node *np, uid_t author)
>  {
> -  if (sblock->s_creator_os == EXT2_OS_HURD)
> +  if (sblock->s_creator_os == htole32 (EXT2_OS_HURD))
>      return 0;
>    else
>      /* For non-hurd filesystems, the author & owner are the same.  */
> @@ -372,7 +376,7 @@ write_node (struct node *np)
>  
>        di = dino_ref (np->cache_id);
>  
> -      di->i_generation = st->st_gen;
> +      di->i_generation = htole32 (st->st_gen);
>  
>        /* We happen to know that the stat mode bits are the same
>           as the ext2fs mode bits. */
> @@ -380,17 +384,17 @@ write_node (struct node *np)
>  
>        /* Only the low 16 bits of these fields are standard across all ext2
>           implementations.  */
> -      di->i_mode = st->st_mode & 0xFFFF & ~S_ITRANS;
> -      di->i_uid = st->st_uid & 0xFFFF;
> -      di->i_gid = st->st_gid & 0xFFFF;
> +      di->i_mode = htole16 (st->st_mode & 0xFFFF & ~S_ITRANS);
> +      di->i_uid = htole16 (st->st_uid & 0xFFFF);
> +      di->i_gid = htole16 (st->st_gid & 0xFFFF);
>  
> -      if (sblock->s_creator_os == EXT2_OS_HURD)
> +      if (sblock->s_creator_os == htole32 (EXT2_OS_HURD))
>          /* If this is a hurd-compatible filesystem, write the high bits too. 
> */
>          {
> -          di->i_mode_high = (st->st_mode >> 16) & 0xffff & ~S_ITRANS;
> -          di->i_uid_high = st->st_uid >> 16;
> -          di->i_gid_high = st->st_gid >> 16;
> -          di->i_author = st->st_author;
> +          di->i_mode_high = htole16 ((st->st_mode >> 16) & 0xffff & 
> ~S_ITRANS);
> +          di->i_uid_high = htole16 (st->st_uid >> 16);
> +          di->i_gid_high = htole16 (st->st_gid >> 16);
> +          di->i_author = htole32 (st->st_author);
>          }
>        else
>          /* No hurd extensions should be turned on.  */
> @@ -401,20 +405,20 @@ write_node (struct node *np)
>            assert_backtrace (np->author_tracks_uid && st->st_author == 
> st->st_uid);
>          }
>  
> -      di->i_links_count = st->st_nlink;
> +      di->i_links_count = htole16 (st->st_nlink);
>  
> -      di->i_atime = st->st_atim.tv_sec;
> +      di->i_atime = htole32(st->st_atim.tv_sec);
>  #ifdef not_yet
>        /* ``struct ext2_inode'' doesn't do better than sec. precision yet.  */
> -      di->i_atime.tv_nsec = st->st_atim.tv_nsec;
> +      di->i_atime.tv_nsec = htole32 (st->st_atim.tv_nsec);
>  #endif
> -      di->i_mtime = st->st_mtim.tv_sec;
> +      di->i_mtime = htole32 (st->st_mtim.tv_sec);
>  #ifdef not_yet
> -      di->i_mtime.tv_nsec = st->st_mtim.tv_nsec;
> +      di->i_mtime.tv_nsec = htole32 (st->st_mtim.tv_nsec);
>  #endif
> -      di->i_ctime = st->st_ctim.tv_sec;
> +      di->i_ctime = htole32 (st->st_ctim.tv_sec);
>  #ifdef not_yet
> -      di->i_ctime.tv_nsec = st->st_ctim.tv_nsec;
> +      di->i_ctime.tv_nsec = htole32 (st->st_ctim.tv_nsec);
>  #endif
>  
>        /* Convert generic flags in ST->st_flags to ext2-specific flags in DI
> @@ -429,25 +433,25 @@ write_node (struct node *np)
>          info->i_flags |= EXT2_NODUMP_FL;
>        if (st->st_flags & UF_IMMUTABLE)
>          info->i_flags |= EXT2_IMMUTABLE_FL;
> -      di->i_flags = info->i_flags;
> +      di->i_flags = htole32 (info->i_flags);
>  
>        if (st->st_mode == 0)
>          /* Set dtime non-zero to indicate a deleted file.
>             We don't clear i_size, i_blocks, and i_translator in this case,
>             to give "undeletion" utilities a chance.  */
> -        di->i_dtime = di->i_mtime;
> +        di->i_dtime = htole32 (di->i_mtime);
>        else
>          {
>            di->i_dtime = 0;
> -          di->i_size = st->st_size;
> +          di->i_size = htole32 (st->st_size);
>            if (sizeof (off_t) >= 8 && !S_ISDIR (st->st_mode))
>              /* 64bit file size */
> -            di->i_size_high = st->st_size >> 32;
> -          di->i_blocks = st->st_blocks;
> +            di->i_size_high = htole32 (st->st_size >> 32);
> +          di->i_blocks = htole32 (st->st_blocks);
>          }
>  
>        if (S_ISCHR(st->st_mode) || S_ISBLK(st->st_mode))
> -        di->i_block[0] = st->st_rdev;
> +        di->i_block[0] = htole32 (st->st_rdev);
>        else
>          memcpy (di->i_block, diskfs_node_disknode (np)->info.i_data,
>                  EXT2_N_BLOCKS * sizeof di->i_block[0]);
> @@ -529,13 +533,13 @@ diskfs_set_statfs (struct statfs *st)
>  {
>    st->f_type = FSTYPE_EXT2FS;
>    st->f_bsize = block_size;
> -  st->f_blocks = sblock->s_blocks_count;
> -  st->f_bfree = sblock->s_free_blocks_count;
> -  st->f_bavail = st->f_bfree - sblock->s_r_blocks_count;
> -  if (st->f_bfree < sblock->s_r_blocks_count)
> +  st->f_blocks = le32toh (sblock->s_blocks_count);
> +  st->f_bfree = le32toh (sblock->s_free_blocks_count);
> +  st->f_bavail = st->f_bfree - le32toh (sblock->s_r_blocks_count);
> +  if (st->f_bfree < le32toh (sblock->s_r_blocks_count))
>      st->f_bavail = 0;
> -  st->f_files = sblock->s_inodes_count;
> -  st->f_ffree = sblock->s_free_inodes_count;
> +  st->f_files = le32toh (sblock->s_inodes_count);
> +  st->f_ffree = le32toh (sblock->s_free_inodes_count);
>    st->f_fsid = getpid ();
>    st->f_namelen = 0;
>    st->f_favail = st->f_ffree;
> @@ -553,7 +557,7 @@ diskfs_set_translator (struct node *np, const char *name, 
> unsigned namelen,
>  
>    assert_backtrace (!diskfs_readonly);
>  
> -  if (sblock->s_creator_os != EXT2_OS_HURD)
> +  if (sblock->s_creator_os != htole32 (EXT2_OS_HURD))
>      return EOPNOTSUPP;
>  
>    err = diskfs_catch_exception ();
> @@ -569,7 +573,7 @@ diskfs_set_translator (struct node *np, const char *name, 
> unsigned namelen,
>        struct ext2_inode *di;
>  
>        di = dino_ref (np->cache_id);
> -      blkno = di->i_translator;
> +      blkno = le32toh (di->i_translator);
>  
>        /* If a legacy translator record found, clear it */
>        if (blkno)
> @@ -628,7 +632,7 @@ diskfs_set_translator (struct node *np, const char *name, 
> unsigned namelen,
>          return ENAMETOOLONG;
>  
>        di = dino_ref (np->cache_id);
> -      blkno = di->i_translator;
> +      blkno = le32toh (di->i_translator);
>  
>        if (namelen && !blkno)
>          {
> @@ -648,7 +652,7 @@ diskfs_set_translator (struct node *np, const char *name, 
> unsigned namelen,
>            blkno =
>              ext2_new_block ((diskfs_node_disknode (np)->info.i_block_group
>                              * EXT2_BLOCKS_PER_GROUP (sblock))
> -                            + sblock->s_first_data_block,
> +                            + le32toh (sblock->s_first_data_block),
>                              0, 0, 0);
>            if (blkno == 0)
>              {
> @@ -664,7 +668,7 @@ diskfs_set_translator (struct node *np, const char *name, 
> unsigned namelen,
>                np->dn_stat.st_mode = newmode;
>              }
>  
> -          di->i_translator = blkno;
> +          di->i_translator = htole32 (blkno);
>            diskfs_node_disknode (np)->info_i_translator = blkno;
>            record_global_poke (di);
>  
> @@ -719,7 +723,7 @@ diskfs_get_translator (struct node *np, char **namep, 
> unsigned *namelen)
>    void *transloc;
>    struct ext2_inode *di;
>  
> -  if (sblock->s_creator_os != EXT2_OS_HURD)
> +  if (sblock->s_creator_os != htole32 (EXT2_OS_HURD))
>      return EOPNOTSUPP;
>  
>    err = diskfs_catch_exception ();
> @@ -727,7 +731,7 @@ diskfs_get_translator (struct node *np, char **namep, 
> unsigned *namelen)
>      return err;
>  
>    di = dino_ref (np->cache_id);
> -  blkno = di->i_translator;
> +  blkno = le32toh (di->i_translator);
>    dino_deref (di);
>  
>    /* If an old translator record found, read it firstly */
> diff --git a/ext2fs/xattr.c b/ext2fs/xattr.c
> index 6bb89bec..0c855616 100644
> --- a/ext2fs/xattr.c
> +++ b/ext2fs/xattr.c
> @@ -91,17 +91,17 @@ xattr_entry_hash (struct ext2_xattr_header *header,
>  
>    if (entry->e_value_block == 0 && entry->e_value_size != 0)
>      {
> -      __u32 *value = (__u32 *) ((char *) header + entry->e_value_offs);
> -      for (n = (entry->e_value_size + EXT2_XATTR_ROUND) >>
> +      __u32 *value = (__u32 *) ((char *) header + le16toh 
> (entry->e_value_offs));
> +      for (n = (le32toh (entry->e_value_size) + EXT2_XATTR_ROUND) >>
>            EXT2_XATTR_PAD_BITS; n; n--)
>          {
>            hash = (hash << VALUE_HASH_SHIFT)
>            ^ (hash >> (8 * sizeof (hash) - VALUE_HASH_SHIFT))
> -          ^ *value++;
> +          ^ le32toh(*value++);
>          }
>      }
>  
> -  entry->e_hash = hash;
> +  entry->e_hash = htole32 (hash);
>  
>  }
>  
> @@ -136,12 +136,12 @@ xattr_entry_rehash (struct ext2_xattr_header *header,
>  
>        hash = (hash << BLOCK_HASH_SHIFT)
>          ^ (hash >> (8 * sizeof (hash) - BLOCK_HASH_SHIFT))
> -        ^ position->e_hash;
> +        ^ le32toh (position->e_hash);
>  
>        position = EXT2_XATTR_ENTRY_NEXT (position);
>      }
>  
> -  header->h_hash = hash;
> +  header->h_hash = htole32 (hash);
>  
>  }
>  
> @@ -237,14 +237,14 @@ xattr_entry_get (void *block, struct ext2_xattr_entry 
> *entry,
>  
>    if (value)
>      {
> -      if (*len < entry->e_value_size)
> +      if (*len < le32toh (entry->e_value_size))
>          {
>            return ERANGE;
>          }
> -      memcpy (value, block + entry->e_value_offs, entry->e_value_size);
> +      memcpy (value, block + le16toh (entry->e_value_offs), le32toh 
> (entry->e_value_size));
>      }
>  
> -  *len = entry->e_value_size;
> +  *len = le32toh (entry->e_value_size);
>    return 0;
>  
>  }
> @@ -295,13 +295,13 @@ xattr_entry_create (struct ext2_xattr_header *header,
>  
>    position->e_name_len = name_len;
>    position->e_name_index = index;
> -  position->e_value_offs = end + rest - value_size;
> +  position->e_value_offs = htole16 (end + rest - value_size);
>    position->e_value_block = 0;
> -  position->e_value_size = len;
> +  position->e_value_size = htole32 (len);
>    strncpy (position->e_name, name, name_len);
>  
> -  memcpy ((char *) header + position->e_value_offs, value, len);
> -  memset ((char *) header + position->e_value_offs + len, 0,
> +  memcpy ((char *) header + le16toh (position->e_value_offs), value, len);
> +  memset ((char *) header + le16toh (position->e_value_offs) + len, 0,
>            value_size - len);
>  
>    return 0;
> @@ -325,9 +325,9 @@ xattr_entry_remove (struct ext2_xattr_header *header,
>    struct ext2_xattr_entry *entry;
>  
>    /* Remove the value */
> -  size = EXT2_XATTR_ALIGN (position->e_value_size);
> +  size = EXT2_XATTR_ALIGN (le32toh (position->e_value_size));
>    start = EXT2_XATTR_ENTRY_OFFSET (header, last) + rest;
> -  end = position->e_value_offs;
> +  end = le16toh (position->e_value_offs);
>  
>    memmove ((char *) header + start + size, (char *) header + start,
>             end - start);
> @@ -337,8 +337,8 @@ xattr_entry_remove (struct ext2_xattr_header *header,
>    entry = EXT2_XATTR_ENTRY_FIRST (header);
>    while (!EXT2_XATTR_ENTRY_LAST (entry))
>      {
> -      if (entry->e_value_offs < end)
> -        entry->e_value_offs += size;
> +      if (le16toh (entry->e_value_offs) < end)
> +        entry->e_value_offs = htole16 (le16toh (entry->e_value_offs) + size);
>        entry = EXT2_XATTR_ENTRY_NEXT (entry);
>      }
>  
> @@ -372,7 +372,7 @@ xattr_entry_replace (struct ext2_xattr_header *header,
>    size_t old_size;
>    size_t new_size;
>  
> -  old_size = EXT2_XATTR_ALIGN (position->e_value_size);
> +  old_size = EXT2_XATTR_ALIGN (le32toh (position->e_value_size));
>    new_size = EXT2_XATTR_ALIGN (len);
>  
>    if (rest < 4 || new_size - old_size > rest - 4)
> @@ -385,7 +385,7 @@ xattr_entry_replace (struct ext2_xattr_header *header,
>        struct ext2_xattr_entry *entry;
>  
>        start = EXT2_XATTR_ENTRY_OFFSET (header, last) + rest;
> -      end = position->e_value_offs;
> +      end = le16toh (position->e_value_offs);
>  
>        /* Remove the old value */
>        memmove ((char *) header + start + old_size, (char *) header + start,
> @@ -395,19 +395,19 @@ xattr_entry_replace (struct ext2_xattr_header *header,
>        entry = EXT2_XATTR_ENTRY_FIRST (header);
>        while (!EXT2_XATTR_ENTRY_LAST (entry))
>          {
> -          if (entry->e_value_offs < end)
> -            entry->e_value_offs += old_size;
> +          if (le16toh (entry->e_value_offs) < end)
> +            entry->e_value_offs = htole16 ( le16toh (entry->e_value_offs) + 
> old_size);
>            entry = EXT2_XATTR_ENTRY_NEXT (entry);
>          }
>  
> -      position->e_value_offs = start - (new_size - old_size);
> +      position->e_value_offs = htole16 (start - (new_size - old_size));
>      }
>  
> -  position->e_value_size = len;
> +  position->e_value_size = htole32 (len);
>  
>    /* Write the new value */
> -  memcpy ((char *) header + position->e_value_offs, value, len);
> -  memset ((char *) header + position->e_value_offs + len, 0, new_size - len);
> +  memcpy ((char *) header + le16toh (position->e_value_offs), value, len);
> +  memset ((char *) header + le16toh (position->e_value_offs) + len, 0, 
> new_size - len);
>  
>    return 0;
>  
> @@ -450,14 +450,15 @@ ext2_free_xattr_block (struct node *np)
>    block = disk_cache_block_ref (blkno);
>    header = EXT2_XATTR_HEADER (block);
>  
> -  if (header->h_magic != EXT2_XATTR_BLOCK_MAGIC || header->h_blocks != 1)
> +  if (header->h_magic != htole32 (EXT2_XATTR_BLOCK_MAGIC)
> +      || header->h_blocks != htole32 (1))
>      {
>        ext2_warning ("Invalid extended attribute block.");
>        err = EIO;
>        goto cleanup;
>      }
>  
> -  if (header->h_refcount == 1)
> +  if (le32toh (header->h_refcount) == 1)
>      {
>         ext2_debug("free block %d", blkno);
>  
> @@ -470,9 +471,9 @@ ext2_free_xattr_block (struct node *np)
>      }
>    else
>      {
> -       ext2_debug("h_refcount: %d", header->h_refcount);
> +       ext2_debug("h_refcount: %d", le32toh (header->h_refcount));
>  
> -       header->h_refcount--;
> +       header->h_refcount = htole32 (le32toh (header->h_refcount) - 1);
>         record_global_poke (block);
>      }
>  
> @@ -535,7 +536,8 @@ ext2_list_xattr (struct node *np, char *buffer, size_t 
> *len)
>    block = disk_cache_block_ref (blkno);
>  
>    header = EXT2_XATTR_HEADER (block);
> -  if (header->h_magic != EXT2_XATTR_BLOCK_MAGIC || header->h_blocks != 1)
> +  if (header->h_magic != htole32 (EXT2_XATTR_BLOCK_MAGIC)
> +      || header->h_blocks != htole32 (1))
>      {
>        ext2_warning ("Invalid extended attribute block.");
>        err = EIO;
> @@ -609,7 +611,8 @@ ext2_get_xattr (struct node *np, const char *name, char 
> *value, size_t *len)
>    dino_deref (ei);
>  
>    header = EXT2_XATTR_HEADER (block);
> -  if (header->h_magic != EXT2_XATTR_BLOCK_MAGIC || header->h_blocks != 1)
> +  if (header->h_magic != htole32 (EXT2_XATTR_BLOCK_MAGIC)
> +      || header->h_blocks != htole32 (1))
>      {
>        ext2_warning ("Invalid extended attribute block.");
>        err = EIO;
> @@ -699,7 +702,7 @@ ext2_set_xattr (struct node *np, const char *name, const 
> char *value,
>  
>        assert_backtrace (!diskfs_readonly);
>  
> -      goal = sblock->s_first_data_block + np->dn->info.i_block_group *
> +      goal = le32toh (sblock->s_first_data_block) + 
> np->dn->info.i_block_group *
>          EXT2_BLOCKS_PER_GROUP (sblock);
>        blkno = ext2_new_block (goal, 0, 0, 0);
>  
> @@ -713,15 +716,16 @@ ext2_set_xattr (struct node *np, const char *name, 
> const char *value,
>        memset (block, 0, block_size);
>  
>        header = EXT2_XATTR_HEADER (block);
> -      header->h_magic = EXT2_XATTR_BLOCK_MAGIC;
> -      header->h_blocks = 1;
> -      header->h_refcount = 1;
> +      header->h_magic = htole32 (EXT2_XATTR_BLOCK_MAGIC);
> +      header->h_blocks = htole32 (1);
> +      header->h_refcount = htole32 (1);
>      }
>    else
>      {
>        block = disk_cache_block_ref (blkno);
>        header = EXT2_XATTR_HEADER (block);
> -      if (header->h_magic != EXT2_XATTR_BLOCK_MAGIC || header->h_blocks != 1)
> +      if (header->h_magic != htole32 (EXT2_XATTR_BLOCK_MAGIC)
> +          || header->h_blocks != htole32 (1))
>          {
>            ext2_warning ("Invalid extended attribute block.");
>            err = EIO;
> @@ -761,7 +765,7 @@ ext2_set_xattr (struct node *np, const char *name, const 
> char *value,
>            break;
>          }
>  
> -      rest -= EXT2_XATTR_ALIGN (entry->e_value_size);
> +      rest -= EXT2_XATTR_ALIGN (le32toh (entry->e_value_size));
>        entry = EXT2_XATTR_ENTRY_NEXT (entry);
>      }
>  
> -- 
> 2.34.1
> 
> 



reply via email to

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