dcavalca / rpms / grub2

Forked from rpms/grub2 3 years ago
Clone

Blame SOURCES/0168-xfs-Convert-inode-numbers-to-cpu-endianity-immediate.patch

28f7f8
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
ecb9bb
From: Jan Kara <jack@suse.cz>
ecb9bb
Date: Mon, 14 Jul 2014 17:21:30 +0200
28f7f8
Subject: [PATCH] xfs: Convert inode numbers to cpu endianity immediately after
28f7f8
 reading
ecb9bb
ecb9bb
Currently XFS driver converted inode numbers to native endianity only
ecb9bb
when using them to compute inode position. Although this works, it is
ecb9bb
somewhat confusing. So convert inode numbers when reading them from disk
ecb9bb
structures as every other field.
ecb9bb
ecb9bb
Signed-off-by: Jan Kara <jack@suse.cz>
ecb9bb
---
ecb9bb
 grub-core/fs/xfs.c | 13 ++++++-------
ecb9bb
 1 file changed, 6 insertions(+), 7 deletions(-)
ecb9bb
ecb9bb
diff --git a/grub-core/fs/xfs.c b/grub-core/fs/xfs.c
28f7f8
index 4bd52d1e081..0d704e9a4d4 100644
ecb9bb
--- a/grub-core/fs/xfs.c
ecb9bb
+++ b/grub-core/fs/xfs.c
ecb9bb
@@ -180,14 +180,14 @@ static inline grub_uint64_t
ecb9bb
 GRUB_XFS_INO_INOINAG (struct grub_xfs_data *data,
ecb9bb
 		      grub_uint64_t ino)
ecb9bb
 {
ecb9bb
-  return (grub_be_to_cpu64 (ino) & ((1LL << GRUB_XFS_INO_AGBITS (data)) - 1));
ecb9bb
+  return (ino & ((1LL << GRUB_XFS_INO_AGBITS (data)) - 1));
ecb9bb
 }
ecb9bb
 
ecb9bb
 static inline grub_uint64_t
ecb9bb
 GRUB_XFS_INO_AG (struct grub_xfs_data *data,
ecb9bb
 		 grub_uint64_t ino)
ecb9bb
 {
ecb9bb
-  return (grub_be_to_cpu64 (ino) >> GRUB_XFS_INO_AGBITS (data));
ecb9bb
+  return (ino >> GRUB_XFS_INO_AGBITS (data));
ecb9bb
 }
ecb9bb
 
ecb9bb
 static inline grub_disk_addr_t
ecb9bb
@@ -506,13 +506,12 @@ grub_xfs_iterate_dir (grub_fshelp_node_t dir,
ecb9bb
 	if (smallino)
ecb9bb
 	  {
ecb9bb
 	    parent = grub_be_to_cpu32 (diro->inode.data.dir.dirhead.parent.i4);
ecb9bb
-	    parent = grub_cpu_to_be64 (parent);
ecb9bb
 	    /* The header is a bit smaller than usual.  */
ecb9bb
 	    de = (struct grub_xfs_dir_entry *) ((char *) de - 4);
ecb9bb
 	  }
ecb9bb
 	else
ecb9bb
 	  {
ecb9bb
-	    parent = diro->inode.data.dir.dirhead.parent.i8;
ecb9bb
+	    parent = grub_be_to_cpu64(diro->inode.data.dir.dirhead.parent.i8);
ecb9bb
 	  }
ecb9bb
 
ecb9bb
 	/* Synthesize the direntries for `.' and `..'.  */
ecb9bb
@@ -545,7 +544,6 @@ grub_xfs_iterate_dir (grub_fshelp_node_t dir,
ecb9bb
 		| (((grub_uint64_t) inopos[5]) << 16)
ecb9bb
 		| (((grub_uint64_t) inopos[6]) << 8)
ecb9bb
 		| (((grub_uint64_t) inopos[7]) << 0);
ecb9bb
-	    ino = grub_cpu_to_be64 (ino);
ecb9bb
 
ecb9bb
 	    c = de->name[de->len];
ecb9bb
 	    de->name[de->len] = '\0';
ecb9bb
@@ -627,7 +625,8 @@ grub_xfs_iterate_dir (grub_fshelp_node_t dir,
ecb9bb
 		   is not used by GRUB.  So it can be overwritten.  */
ecb9bb
 		filename[direntry->len] = '\0';
ecb9bb
 
ecb9bb
-		if (iterate_dir_call_hook (direntry->inode, filename, &ctx))
ecb9bb
+		if (iterate_dir_call_hook (grub_be_to_cpu64(direntry->inode), 
ecb9bb
+					   filename, &ctx))
ecb9bb
 		  {
ecb9bb
 		    grub_free (dirblock);
ecb9bb
 		    return 1;
ecb9bb
@@ -689,7 +688,7 @@ grub_xfs_mount (grub_disk_t disk)
ecb9bb
     goto fail;
ecb9bb
 
ecb9bb
   data->diropen.data = data;
ecb9bb
-  data->diropen.ino = data->sblock.rootino;
ecb9bb
+  data->diropen.ino = grub_be_to_cpu64(data->sblock.rootino);
ecb9bb
   data->diropen.inode_read = 1;
ecb9bb
   data->bsize = grub_be_to_cpu32 (data->sblock.bsize);
ecb9bb
   data->agsize = grub_be_to_cpu32 (data->sblock.agsize);