All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] Split ufs.mod into ufs1.mod and ufs2.mod
@ 2009-08-13 16:03 Vladimir 'phcoder' Serbinenko
  2009-08-13 20:00 ` Robert Millan
  0 siblings, 1 reply; 4+ messages in thread
From: Vladimir 'phcoder' Serbinenko @ 2009-08-13 16:03 UTC (permalink / raw)
  To: The development of GRUB 2

[-- Attachment #1: Type: text/plain, Size: 486 bytes --]

ufs1 and ufs2 mainly differ by some structure definitions. Putting
them into the same module and checking on runtime creates continuous
if ( ... == UFS1) { ... }
By using preprocessor it's possible to avoid most of such ifs
Additionally user needs only one FS in core so we save some space
core.img with ufs.mod: 23793
core.img with ufs1.mod: 23078
core.img with ufs2.mod: 23322

-- 
Regards
Vladimir 'phcoder' Serbinenko

Personal git repository: http://repo.or.cz/w/grub2/phcoder.git

[-- Attachment #2: ufssplit.diff --]
[-- Type: text/plain, Size: 21018 bytes --]

diff --git a/ChangeLog b/ChangeLog
index 675cc6d..8e13775 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,34 @@
+2009-08-13  Vladimir Serbinenko  <phcoder@gmail.com>
+
+	Split ufs.mod into ufs1.mod and ufs2.mod.
+
+	* conf/common.rmk (grub_probe_SOURCES): Add fs/ufs2.c.
+	(grub_fstest_SOURCES): Likewise.
+	(pkglib_MODULES): Remove ufs.mod. Add ufs1.mod and ufs2.mod.
+	(ufs_mod_SOURCES): Remove.
+	(ufs_mod_CFLAGS): Likewise.
+	(ufs_mod_LDFLAGS): Likewise.
+	(ufs1_mod_SOURCES): New variable.
+	(ufs1_mod_CFLAGS): Likewise.
+	(ufs1_mod_LDFLAGS): Likewise.
+	(ufs1_mod_SOURCES): New variable.
+	(ufs1_mod_CFLAGS): Likewise.
+	(ufs1_mod_LDFLAGS): Likewise.
+	* conf/i386-coreboot.rmk (grub_emu_SOURCES): Add fs/ufs2.c.
+	* conf/i386-efi.rmk (util/i386/efi/grub-mkimage.c_DEPENDENCIES):
+	Likewise.
+	(grub_emu_SOURCES): Likewise.
+	* conf/i386-ieee1275.rmk (grub_emu_SOURCES): Likewise.
+	* conf/i386-pc.rmk (grub_emu_SOURCES): Likewise.
+	(grub_setup_SOURCES): Likewise.
+	* conf/powerpc-ieee1275.rmk (grub_emu_SOURCES): Likewise.
+	* conf/sparc64.rmk (grub_emu_SOURCES): Likewise.
+	(grub_setup_SOURCES): Likewise.	
+	* conf/x86_64-efi.rmk (util/i386/efi/grub-mkimage.c_DEPENDENCIES):
+	Likewise.
+	* fs/ufs2.c: New file.
+	* fs/ufs.c: Separate UFS1 from UFS2 by using preprocessor.
+
 2009-08-10  Robert Millan  <rmh.grub@aybabtu.com>
 
 	* include/grub/i386/bsd.h (KERNEL_TYPE_NONE, KERNEL_TYPE_FREEBSD)
diff --git a/conf/common.rmk b/conf/common.rmk
index 032517f..819d413 100644
--- a/conf/common.rmk
+++ b/conf/common.rmk
@@ -17,7 +17,7 @@ grub_probe_SOURCES = util/grub-probe.c	\
 	fs/affs.c fs/cpio.c fs/fat.c fs/ext2.c fs/hfs.c		\
 	fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c	\
 	fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c		\
-	fs/ufs.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.c		\
+	fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.c		\
 	\
 	partmap/pc.c partmap/apple.c partmap/sun.c partmap/gpt.c\
 	kern/fs.c kern/env.c fs/fshelp.c			\
@@ -38,7 +38,7 @@ grub_fstest_SOURCES = util/grub-fstest.c util/hostfs.c util/misc.c 	\
 	fs/affs.c fs/cpio.c fs/fat.c fs/ext2.c fs/hfs.c			\
 	fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c		\
 	fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c			\
-	fs/ufs.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.c			\
+	fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.c			\
 	\
 	kern/partition.c partmap/pc.c partmap/apple.c partmap/sun.c	\
 	partmap/gpt.c							\
@@ -174,7 +174,7 @@ sbin_SCRIPTS += grub-dumpbios
 CLEANFILES += grub-dumpbios
 
 # Filing systems.
-pkglib_MODULES += fshelp.mod fat.mod ufs.mod ext2.mod ntfs.mod		\
+pkglib_MODULES += fshelp.mod fat.mod ufs1.mod ufs2.mod ext2.mod ntfs.mod \
 	ntfscomp.mod minix.mod hfs.mod jfs.mod iso9660.mod xfs.mod	\
 	affs.mod sfs.mod hfsplus.mod reiserfs.mod cpio.mod tar.mod	\
 	udf.mod	afs.mod befs.mod
@@ -189,10 +189,15 @@ fat_mod_SOURCES = fs/fat.c
 fat_mod_CFLAGS = $(COMMON_CFLAGS)
 fat_mod_LDFLAGS = $(COMMON_LDFLAGS)
 
-# For ufs.mod.
-ufs_mod_SOURCES = fs/ufs.c
-ufs_mod_CFLAGS = $(COMMON_CFLAGS)
-ufs_mod_LDFLAGS = $(COMMON_LDFLAGS)
+# For ufs1.mod.
+ufs1_mod_SOURCES = fs/ufs.c
+ufs1_mod_CFLAGS = $(COMMON_CFLAGS)
+ufs1_mod_LDFLAGS = $(COMMON_LDFLAGS)
+
+# For ufs2.mod.
+ufs2_mod_SOURCES = fs/ufs2.c
+ufs2_mod_CFLAGS = $(COMMON_CFLAGS)
+ufs2_mod_LDFLAGS = $(COMMON_LDFLAGS)
 
 # For ext2.mod.
 ext2_mod_SOURCES = fs/ext2.c
diff --git a/conf/i386-coreboot.rmk b/conf/i386-coreboot.rmk
index 7ba5737..ce2576b 100644
--- a/conf/i386-coreboot.rmk
+++ b/conf/i386-coreboot.rmk
@@ -116,7 +116,7 @@ grub_emu_SOURCES = commands/minicmd.c commands/cat.c commands/cmp.c	\
 	fs/affs.c fs/cpio.c fs/fat.c fs/ext2.c  fs/hfs.c		\
 	fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c		\
 	fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c			\
-	fs/ufs.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.c				\
+	fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.c				\
 	\
 	fs/fshelp.c							\
 	io/gzio.c							\
diff --git a/conf/i386-efi.rmk b/conf/i386-efi.rmk
index 9177b9d..6e3cbcf 100644
--- a/conf/i386-efi.rmk
+++ b/conf/i386-efi.rmk
@@ -24,7 +24,7 @@ util/i386/efi/grub-mkimage.c_DEPENDENCIES = Makefile
 #	util/misc.c util/getroot.c kern/device.c kern/disk.c	\
 #	kern/err.c kern/misc.c fs/fat.c fs/ext2.c fs/xfs.c fs/affs.c	\
 #	fs/sfs.c kern/parser.c kern/partition.c partmap/pc.c		\
-#	fs/ufs.c fs/minix.c fs/hfs.c fs/jfs.c fs/hfsplus.c kern/file.c	\
+#	fs/ufs.c fs/ufs2.c fs/minix.c fs/hfs.c fs/jfs.c fs/hfsplus.c kern/file.c	\
 #	kern/fs.c kern/env.c fs/fshelp.c
 
 # For grub-mkdevicemap.
@@ -44,7 +44,7 @@ grub_emu_SOURCES = commands/minicmd.c commands/cat.c commands/cmp.c 	\
 	fs/affs.c fs/cpio.c fs/ext2.c fs/fat.c fs/hfs.c			\
 	fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c		\
 	fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c			\
-	fs/ufs.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.c				\
+	fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.c				\
 	\
 	io/gzio.c							\
 	kern/device.c kern/disk.c kern/dl.c kern/elf.c kern/env.c	\
diff --git a/conf/i386-ieee1275.rmk b/conf/i386-ieee1275.rmk
index 0321979..65d1c6b 100644
--- a/conf/i386-ieee1275.rmk
+++ b/conf/i386-ieee1275.rmk
@@ -71,7 +71,7 @@ grub_emu_SOURCES = commands/minicmd.c commands/cat.c commands/cmp.c	\
 	fs/affs.c fs/cpio.c fs/fat.c fs/ext2.c fs/hfs.c			\
 	fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c		\
 	fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c			\
-	fs/ufs.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.c				\
+	fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.c				\
 	\
 	fs/fshelp.c							\
 	io/gzio.c							\
diff --git a/conf/i386-pc.rmk b/conf/i386-pc.rmk
index 798aee2..8da134c 100644
--- a/conf/i386-pc.rmk
+++ b/conf/i386-pc.rmk
@@ -104,7 +104,7 @@ grub_setup_SOURCES = util/i386/pc/grub-setup.c util/hostdisk.c	\
 	fs/affs.c fs/cpio.c fs/ext2.c fs/fat.c fs/hfs.c		\
 	fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c	\
 	fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c		\
-	fs/ufs.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.c			\
+	fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.c			\
 	\
 	partmap/pc.c partmap/gpt.c				\
 	\
@@ -148,7 +148,7 @@ grub_emu_SOURCES = commands/minicmd.c commands/cat.c commands/cmp.c	\
 	fs/affs.c fs/cpio.c  fs/fat.c fs/ext2.c fs/hfs.c		\
 	fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c		\
 	fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c			\
-	fs/ufs.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.c				\
+	fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.c				\
 	\
 	util/console.c util/hostfs.c util/grub-emu.c util/misc.c	\
 	util/hostdisk.c util/getroot.c					\
diff --git a/conf/powerpc-ieee1275.rmk b/conf/powerpc-ieee1275.rmk
index af29d23..c30f61a 100644
--- a/conf/powerpc-ieee1275.rmk
+++ b/conf/powerpc-ieee1275.rmk
@@ -51,7 +51,7 @@ grub_emu_SOURCES = commands/minicmd.c commands/cat.c commands/cmp.c 	\
 	fs/affs.c fs/cpio.c fs/fat.c fs/ext2.c fs/hfs.c			\
 	fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c		\
 	fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c			\
-	fs/ufs.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.c				\
+	fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.c				\
 	\
 	io/gzio.c							\
 	kern/device.c kern/disk.c kern/dl.c kern/elf.c kern/env.c	\
diff --git a/conf/sparc64-ieee1275.rmk b/conf/sparc64-ieee1275.rmk
index aabccee..b26496d 100644
--- a/conf/sparc64-ieee1275.rmk
+++ b/conf/sparc64-ieee1275.rmk
@@ -78,7 +78,7 @@ grub_setup_SOURCES = util/sparc64/ieee1275/grub-setup.c util/hostdisk.c	\
 	fs/affs.c fs/cpio.c fs/ext2.c fs/fat.c fs/hfs.c		\
 	fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c	\
 	fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c		\
-	fs/ufs.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.c			\
+	fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.c			\
 	\
 	partmap/amiga.c	partmap/apple.c partmap/pc.c		\
 	partmap/sun.c partmap/acorn.c				\
@@ -108,7 +108,7 @@ grub_emu_SOURCES = commands/minicmd.c commands/cat.c commands/cmp.c 	\
 	fs/affs.c fs/cpio.c fs/fat.c fs/ext2.c fs/hfs.c			\
 	fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c		\
 	fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c			\
-	fs/ufs.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.c				\
+	fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.c				\
 	\
 	io/gzio.c							\
 	kern/device.c kern/disk.c kern/dl.c kern/elf.c kern/env.c	\
diff --git a/conf/x86_64-efi.rmk b/conf/x86_64-efi.rmk
index 21da0e1..71a90ce 100644
--- a/conf/x86_64-efi.rmk
+++ b/conf/x86_64-efi.rmk
@@ -23,7 +23,7 @@ grub_mkimage_SOURCES = util/i386/efi/grub-mkimage.c util/misc.c \
 #	util/misc.c util/getroot.c kern/device.c kern/disk.c	\
 #	kern/err.c kern/misc.c fs/fat.c fs/ext2.c fs/xfs.c fs/affs.c	\
 #	fs/sfs.c kern/parser.c kern/partition.c partmap/pc.c		\
-#	fs/ufs.c fs/minix.c fs/hfs.c fs/jfs.c fs/hfsplus.c kern/file.c	\
+#	fs/ufs.c fs/ufs2.c fs/minix.c fs/hfs.c fs/jfs.c fs/hfsplus.c kern/file.c	\
 #	kern/fs.c kern/env.c fs/fshelp.c
 
 # For grub-mkdevicemap.
@@ -42,7 +42,7 @@ grub_emu_SOURCES = commands/minicmd.c commands/cat.c commands/cmp.c 	\
 	fs/affs.c fs/cpio.c fs/fat.c fs/ext2.c fs/hfs.c			\
 	fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c		\
 	fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c			\
-	fs/ufs.c fs/xfs.c fs/afs.c					\
+	fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c					\
 	\
 	io/gzio.c							\
 	kern/device.c kern/disk.c kern/dl.c kern/elf.c kern/env.c	\
diff --git a/fs/ufs.c b/fs/ufs.c
index 336507c..7f254af 100644
--- a/fs/ufs.c
+++ b/fs/ufs.c
@@ -25,9 +25,12 @@
 #include <grub/dl.h>
 #include <grub/types.h>
 
-
+#ifdef MODE_UFS2
+#define GRUB_UFS_MAGIC		0x19540119
+#else
 #define GRUB_UFS_MAGIC		0x11954
-#define GRUB_UFS2_MAGIC		0x19540119
+#endif
+
 #define GRUB_UFS_INODE		2
 #define GRUB_UFS_FILETYPE_DIR	4
 #define GRUB_UFS_FILETYPE_LNK	10
@@ -44,20 +47,29 @@
 #define GRUB_UFS_VOLNAME_LEN	32
 
 /* Calculate in which group the inode can be found.  */
-#define inode_group(inode,sblock) ()
-
 #define UFS_BLKSZ(sblock) (grub_le_to_cpu32 (sblock->bsize))
 
-#define INODE(data,field) (data->ufs_type == UFS1 ? \
-                           data->inode.  field : data->inode2.  field)
-#define INODE_ENDIAN(data,field,bits1,bits2) (data->ufs_type == UFS1 ? \
-                           grub_le_to_cpu##bits1 (data->inode.field) : \
-                           grub_le_to_cpu##bits2 (data->inode2.field))
+#define INODE(data,field) data->inode.  field
+#ifdef MODE_UFS2
+#define INODE_ENDIAN(data,field,bits1,bits2) grub_le_to_cpu##bits2 (data->inode.field)
+#else
+#define INODE_ENDIAN(data,field,bits1,bits2) grub_le_to_cpu##bits1 (data->inode.field)
+#endif
+
 #define INODE_SIZE(data) INODE_ENDIAN (data,size,32,64)
 #define INODE_NBLOCKS(data) INODE_ENDIAN (data,nblocks,32,64)
 
 #define INODE_MODE(data) INODE_ENDIAN (data,mode,16,16)
-#define INODE_BLKSZ(data) (data->ufs_type == UFS1 ? 4 : 8)
+#ifdef MODE_UFS2
+#define INODE_BLKSZ 8
+#else
+#define INODE_BLKSZ 4
+#endif
+#ifndef MODE_UFS2
+#define UFS_INODE_PER_BLOCK 4
+#else
+#define UFS_INODE_PER_BLOCK 2
+#endif
 #define INODE_DIRBLOCKS(data,blk) INODE_ENDIAN \
                                    (data,blocks.dir_blocks[blk],32,64)
 #define INODE_INDIRBLOCKS(data,blk) INODE_ENDIAN \
@@ -111,6 +123,7 @@ struct grub_ufs_sblock
   grub_uint32_t magic;
 };
 
+#ifndef MODE_UFS2
 /* UFS inode.  */
 struct grub_ufs_inode
 {
@@ -137,9 +150,9 @@ struct grub_ufs_inode
   grub_uint32_t unused;
   grub_uint8_t pad[12];
 } __attribute__ ((packed));
-
+#else
 /* UFS inode.  */
-struct grub_ufs2_inode
+struct grub_ufs_inode
 {
   grub_uint16_t mode;
   grub_uint16_t nlinks;
@@ -173,6 +186,7 @@ struct grub_ufs2_inode
 
   grub_uint8_t unused[24];
 } __attribute__ ((packed));
+#endif
 
 /* Directory entry.  */
 struct grub_ufs_dirent
@@ -195,17 +209,7 @@ struct grub_ufs_data
 {
   struct grub_ufs_sblock sblock;
   grub_disk_t disk;
-  union
-  {
-    struct grub_ufs_inode inode;
-    struct grub_ufs2_inode inode2;
-  };
-  enum
-    {
-      UFS1,
-      UFS2,
-      UNKNOWN
-    } ufs_type;
+  struct grub_ufs_inode inode;
   int ino;
   int linknest;
 };
@@ -217,7 +221,7 @@ static grub_err_t grub_ufs_find_file (struct grub_ufs_data *data,
 				      const char *path);
 
 
-static int
+static grub_disk_addr_t
 grub_ufs_get_file_block (struct grub_ufs_data *data, unsigned int blk)
 {
   struct grub_ufs_sblock *sblock = &data->sblock;
@@ -232,32 +236,38 @@ grub_ufs_get_file_block (struct grub_ufs_data *data, unsigned int blk)
 
   blk -= GRUB_UFS_DIRBLKS;
 
-  indirsz = UFS_BLKSZ (sblock) / INODE_BLKSZ (data);
+  indirsz = UFS_BLKSZ (sblock) / INODE_BLKSZ;
   /* Single indirect block.  */
   if (blk < indirsz)
     {
-      grub_uint32_t indir[UFS_BLKSZ (sblock) >> 2];
+#ifdef MODE_UFS2
+      grub_uint64_t indir[UFS_BLKSZ (sblock) / sizeof (grub_uint64_t)];
+#else
+      grub_uint32_t indir[UFS_BLKSZ (sblock) / sizeof (grub_uint32_t)];
+#endif
       grub_disk_read (data->disk, INODE_INDIRBLOCKS (data, 0) << log2_blksz,
 		      0, sizeof (indir), indir);
-      return (data->ufs_type == UFS1) ? indir[blk] : indir[blk << 1];
+      return indir[blk];
     }
   blk -= indirsz;
 
   /* Double indirect block.  */
   if (blk < indirsz * indirsz)
     {
-      grub_uint32_t indir[UFS_BLKSZ (sblock) >> 2];
+#ifdef MODE_UFS2
+      grub_uint64_t indir[UFS_BLKSZ (sblock) / sizeof (grub_uint64_t)];
+#else
+      grub_uint32_t indir[UFS_BLKSZ (sblock) / sizeof (grub_uint32_t)];
+#endif
 
       grub_disk_read (data->disk, INODE_INDIRBLOCKS (data, 1) << log2_blksz,
 		      0, sizeof (indir), indir);
       grub_disk_read (data->disk,
-      		      ((data->ufs_type == UFS1) ?
-		      indir[blk / indirsz] : indir [(blk / indirsz) << 1])
+		      (indir [blk / indirsz])
 		      << log2_blksz,
 		      0, sizeof (indir), indir);
 
-      return (data->ufs_type == UFS1) ?
-	     indir[blk % indirsz] : indir[(blk % indirsz) << 1];
+      return indir[blk % indirsz];
     }
 
 
@@ -334,7 +344,6 @@ grub_ufs_read_file (struct grub_ufs_data *data,
   return len;
 }
 
-
 /* Read inode INO from the mounted filesystem described by DATA.  This
    inode is used by default now.  */
 static grub_err_t
@@ -351,38 +360,20 @@ grub_ufs_read_inode (struct grub_ufs_data *data, int ino, char *inode)
   /* The first block of the group.  */
   int grpblk = group * (grub_le_to_cpu32 (sblock->frags_per_group));
 
-  if (data->ufs_type == UFS1)
+  if (!inode)
     {
-      if (!inode)
-	{
-	  inode = (char *) &data->inode;
-	  data->ino = ino;
-	}
-
-      grub_disk_read (data->disk,
-		      (((grub_le_to_cpu32 (sblock->inoblk_offs) + grpblk)
-			<< grub_le_to_cpu32 (data->sblock.log2_blksz)))
-		      + grpino / 4,
-		      (grpino % 4) * sizeof (struct grub_ufs_inode),
-		      sizeof (struct grub_ufs_inode),
-		      inode);
+      inode = (char *) &data->inode;
+      data->ino = ino;
     }
-  else
-    {
-      if (!inode)
-	{
-	  inode = (char *) &data->inode2;
-	  data->ino = ino;
-	}
 
-      grub_disk_read (data->disk,
-		      (((grub_le_to_cpu32 (sblock->inoblk_offs) + grpblk)
-			<< grub_le_to_cpu32 (data->sblock.log2_blksz)))
-		      + grpino / 2,
-		      (grpino % 2) * sizeof (struct grub_ufs2_inode),
-		      sizeof (struct grub_ufs2_inode),
-		      inode);
-    }
+  grub_disk_read (data->disk,
+		  ((grub_le_to_cpu32 (sblock->inoblk_offs) + grpblk)
+		   << grub_le_to_cpu32 (data->sblock.log2_blksz))
+		  + grpino / UFS_INODE_PER_BLOCK,
+		  (grpino % UFS_INODE_PER_BLOCK)
+		  * sizeof (struct grub_ufs_inode),
+		  sizeof (struct grub_ufs_inode),
+		  inode);
 
   return grub_errno;
 }
@@ -466,9 +457,11 @@ grub_ufs_find_file (struct grub_ufs_data *data, const char *path)
 			      (char *) &dirent) < 0)
 	return grub_errno;
 
-      namelen = (data->ufs_type == UFS2)
-	? dirent.namelen_bsd : grub_le_to_cpu16 (dirent.namelen);
-
+#ifdef MODE_UFS2
+      namelen = dirent.namelen_bsd;
+#else
+      namelen = grub_le_to_cpu16 (dirent.namelen);
+#endif
       {
 	char filename[namelen + 1];
 
@@ -530,8 +523,7 @@ grub_ufs_mount (grub_disk_t disk)
   if (!data)
     return 0;
 
-  /* Find a UFS1 or UFS2 sblock.  */
-  data->ufs_type = UNKNOWN;
+  /* Find a UFS sblock.  */
   while (*sblklist != -1)
     {
       grub_disk_read (disk, *sblklist, 0, sizeof (struct grub_ufs_sblock),
@@ -541,32 +533,26 @@ grub_ufs_mount (grub_disk_t disk)
 
       if (grub_le_to_cpu32 (data->sblock.magic) == GRUB_UFS_MAGIC)
 	{
-	  data->ufs_type = UFS1;
-	  break;
-	}
-      else if (grub_le_to_cpu32 (data->sblock.magic) == GRUB_UFS2_MAGIC)
-	{
-	  data->ufs_type = UFS2;
-	  break;
+	  data->disk = disk;
+	  data->linknest = 0;
+	  return data;
 	}
       sblklist++;
     }
-  if (data->ufs_type == UNKNOWN)
+
+ fail:
+
+  if (grub_errno == GRUB_ERR_NONE || grub_errno == GRUB_ERR_OUT_OF_RANGE)
     {
-      grub_error (GRUB_ERR_BAD_FS, "not an ufs filesystem");
-      goto fail;
+#ifdef MODE_UFS2
+      grub_error (GRUB_ERR_BAD_FS, "not an ufs2 filesystem");
+#else
+      grub_error (GRUB_ERR_BAD_FS, "not an ufs1 filesystem");
+#endif
     }
 
-  data->disk = disk;
-  data->linknest = 0;
-  return data;
-
- fail:
   grub_free (data);
 
-  if (grub_errno == GRUB_ERR_OUT_OF_RANGE)
-    grub_error (GRUB_ERR_BAD_FS, "not a ufs filesystem");
-
   return 0;
 }
 
@@ -615,12 +601,17 @@ grub_ufs_dir (grub_device_t device, const char *path,
 			      (char *) &dirent) < 0)
 	break;
 
-      namelen = (data->ufs_type == UFS2)
-	? dirent.namelen_bsd : grub_le_to_cpu16 (dirent.namelen);
+#ifdef MODE_UFS2
+      namelen = dirent.namelen_bsd;
+#else
+      namelen = grub_le_to_cpu16 (dirent.namelen);
+#endif
 
       {
 	char filename[namelen + 1];
 	struct grub_dirhook_info info;
+	struct grub_ufs_inode inode;
+
 	grub_memset (&info, 0, sizeof (info));
 
 	if (grub_ufs_read_file (data, 0, pos + sizeof (dirent),
@@ -628,24 +619,12 @@ grub_ufs_dir (grub_device_t device, const char *path,
 	  break;
 
 	filename[namelen] = '\0';
-	if (data->ufs_type == UFS1)
-	  {
-	    struct grub_ufs_inode inode;
-	    grub_ufs_read_inode (data, dirent.ino, (char *) &inode);
-	    info.dir = ((grub_le_to_cpu16 (inode.mode) & GRUB_UFS_ATTR_TYPE)
-			== GRUB_UFS_ATTR_DIR);
-	    info.mtime = grub_le_to_cpu64 (inode.mtime);
-	    info.mtimeset = 1;
-	  }
-	else
-	  {
-	    struct grub_ufs2_inode inode;
-	    grub_ufs_read_inode (data, dirent.ino, (char *) &inode);
-	    info.dir = ((grub_le_to_cpu16 (inode.mode) & GRUB_UFS_ATTR_TYPE)
-			== GRUB_UFS_ATTR_DIR);
-	    info.mtime = grub_le_to_cpu64 (inode.mtime);
-	    info.mtimeset = 1;
-	  }
+	grub_ufs_read_inode (data, dirent.ino, (char *) &inode);
+
+	info.dir = ((grub_le_to_cpu16 (inode.mode) & GRUB_UFS_ATTR_TYPE)
+		    == GRUB_UFS_ATTR_DIR);
+	info.mtime = grub_le_to_cpu64 (inode.mtime);
+	info.mtimeset = 1;
 
 	if (hook (filename, &info))
 	  break;
@@ -716,6 +695,7 @@ grub_ufs_close (grub_file_t file)
 }
 
 
+#ifdef MODE_UFS2
 static grub_err_t
 grub_ufs_label (grub_device_t device, char **label)
 {
@@ -727,10 +707,7 @@ grub_ufs_label (grub_device_t device, char **label)
 
   data = grub_ufs_mount (device->disk);
   if (data)
-    {
-      if (data->ufs_type == UFS2)
-        *label = grub_strdup ((char *) data->sblock.volume_name);
-    }
+    *label = grub_strdup ((char *) data->sblock.volume_name);
 
   grub_dl_unref (my_mod);
 
@@ -738,6 +715,7 @@ grub_ufs_label (grub_device_t device, char **label)
 
   return grub_errno;
 }
+#endif
 
 static grub_err_t
 grub_ufs_uuid (grub_device_t device, char **uuid)
@@ -748,7 +726,7 @@ grub_ufs_uuid (grub_device_t device, char **uuid)
   grub_dl_ref (my_mod);
 
   data = grub_ufs_mount (disk);
-  if (data)
+  if (data && (data->sblock.uuidhi != 0 || data->sblock.uuidlow != 0))
     {
       *uuid = grub_malloc (16 + sizeof ('\0'));
       grub_sprintf (*uuid, "%08x%08x",
@@ -777,10 +755,12 @@ grub_ufs_mtime (grub_device_t device, grub_int32_t *tm)
   data = grub_ufs_mount (device->disk);
   if (!data)
     *tm = 0;
-  else if (data->ufs_type == UFS1)
-    *tm = grub_le_to_cpu32 (data->sblock.mtime);
   else
+#ifdef MODE_UFS2
     *tm = grub_le_to_cpu64 (data->sblock.mtime2);
+#else
+    *tm = grub_le_to_cpu32 (data->sblock.mtime);
+#endif
 
   grub_dl_unref (my_mod);
 
@@ -793,24 +773,38 @@ grub_ufs_mtime (grub_device_t device, grub_int32_t *tm)
 \f
 static struct grub_fs grub_ufs_fs =
   {
-    .name = "ufs",
+#ifdef MODE_UFS2
+    .name = "ufs2",
+#else
+    .name = "ufs1",
+#endif
     .dir = grub_ufs_dir,
     .open = grub_ufs_open,
     .read = grub_ufs_read,
     .close = grub_ufs_close,
+#ifdef MODE_UFS2
     .label = grub_ufs_label,
+#endif
     .uuid = grub_ufs_uuid,
     .mtime = grub_ufs_mtime,
     .next = 0
   };
 
-GRUB_MOD_INIT(ufs)
+#ifdef MODE_UFS2
+GRUB_MOD_INIT(ufs2)
+#else
+GRUB_MOD_INIT(ufs1)
+#endif
 {
   grub_fs_register (&grub_ufs_fs);
   my_mod = mod;
 }
 
-GRUB_MOD_FINI(ufs)
+#ifdef MODE_UFS2
+GRUB_MOD_FINI(ufs2)
+#else
+GRUB_MOD_FINI(ufs1)
+#endif
 {
   grub_fs_unregister (&grub_ufs_fs);
 }
diff --git a/fs/ufs2.c b/fs/ufs2.c
new file mode 100644
index 0000000..7f4eb95
--- /dev/null
+++ b/fs/ufs2.c
@@ -0,0 +1,3 @@
+/* ufs2.c - Unix File System 2 */
+#define MODE_UFS2 1
+#include "ufs.c"

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 1/2] Split ufs.mod into ufs1.mod and ufs2.mod
  2009-08-13 16:03 [PATCH 1/2] Split ufs.mod into ufs1.mod and ufs2.mod Vladimir 'phcoder' Serbinenko
@ 2009-08-13 20:00 ` Robert Millan
  2009-08-13 20:12   ` Vladimir 'phcoder' Serbinenko
  0 siblings, 1 reply; 4+ messages in thread
From: Robert Millan @ 2009-08-13 20:00 UTC (permalink / raw)
  To: The development of GRUB 2

On Thu, Aug 13, 2009 at 06:03:44PM +0200, Vladimir 'phcoder' Serbinenko wrote:
> ufs1 and ufs2 mainly differ by some structure definitions. Putting
> them into the same module and checking on runtime creates continuous
> if ( ... == UFS1) { ... }
> By using preprocessor it's possible to avoid most of such ifs
> Additionally user needs only one FS in core so we save some space
> core.img with ufs.mod: 23793
> core.img with ufs1.mod: 23078
> core.img with ufs2.mod: 23322

Very nice.

> +#ifdef MODE_UFS2
> +#define INODE_BLKSZ 8
> +#else
> +#define INODE_BLKSZ 4
> +#endif
> +#ifndef MODE_UFS2
> +#define UFS_INODE_PER_BLOCK 4
> +#else
> +#define UFS_INODE_PER_BLOCK 2
> +#endif

When you commit this, could you please follow logical order with
ifdef/else/endif?  The negation is less intuitive to read.

> +#ifdef MODE_UFS2
> +      grub_uint64_t indir[UFS_BLKSZ (sblock) / sizeof (grub_uint64_t)];
> +#else
> +      grub_uint32_t indir[UFS_BLKSZ (sblock) / sizeof (grub_uint32_t)];
> +#endif

Can this be made simpler by using typeof() ?  (same for the other one below)

> -      return (data->ufs_type == UFS1) ? indir[blk] : indir[blk << 1];
> +      return indir[blk];

The blk bitshift was accounted for elsewhere?  (Btw I assume you've tested
on both filesystem types).

> -	? dirent.namelen_bsd : grub_le_to_cpu16 (dirent.namelen);
> +#ifdef MODE_UFS2
> +      namelen = dirent.namelen_bsd;
> +#else
> +      namelen = grub_le_to_cpu16 (dirent.namelen);
> +#endif

I wonder if there was a bug here (native endianess assumed for namelen_bsd?)

-- 
Robert Millan

  The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
  how) you may access your data; but nobody's threatening your freedom: we
  still allow you to remove your data and not access it at all."



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 1/2] Split ufs.mod into ufs1.mod and ufs2.mod
  2009-08-13 20:00 ` Robert Millan
@ 2009-08-13 20:12   ` Vladimir 'phcoder' Serbinenko
  2009-08-13 20:56     ` Robert Millan
  0 siblings, 1 reply; 4+ messages in thread
From: Vladimir 'phcoder' Serbinenko @ 2009-08-13 20:12 UTC (permalink / raw)
  To: The development of GRUB 2

>
> When you commit this, could you please follow logical order with
> ifdef/else/endif?  The negation is less intuitive to read.
Ok
>
>> +#ifdef MODE_UFS2
>> +      grub_uint64_t indir[UFS_BLKSZ (sblock) / sizeof (grub_uint64_t)];
>> +#else
>> +      grub_uint32_t indir[UFS_BLKSZ (sblock) / sizeof (grub_uint32_t)];
>> +#endif
>
> Can this be made simpler by using typeof() ?  (same for the other one below)
>
I tried using sizeof (indir[0]) but it doesn't work since indir isn't
defined at that point.
>> -      return (data->ufs_type == UFS1) ? indir[blk] : indir[blk << 1];
>> +      return indir[blk];
>
> The blk bitshift was accounted for elsewhere?
>
By using correct type (grub_uint64_t vs grub_uint32_t)
>  (Btw I assume you've tested
> on both filesystem types).
I tested on FreeBSD variants of UFS1 and UFS2. For Sun UFS1 I relied
on report by Seth Goldberg
>> -     ? dirent.namelen_bsd : grub_le_to_cpu16 (dirent.namelen);
>> +#ifdef MODE_UFS2
>> +      namelen = dirent.namelen_bsd;
>> +#else
>> +      namelen = grub_le_to_cpu16 (dirent.namelen);
>> +#endif
>
> I wonder if there was a bug here (native endianess assumed for namelen_bsd?)
>
It's one byte
> --
> Robert Millan
>
>  The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
>  how) you may access your data; but nobody's threatening your freedom: we
>  still allow you to remove your data and not access it at all."
>
>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> http://lists.gnu.org/mailman/listinfo/grub-devel
>



-- 
Regards
Vladimir 'phcoder' Serbinenko

Personal git repository: http://repo.or.cz/w/grub2/phcoder.git



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 1/2] Split ufs.mod into ufs1.mod and ufs2.mod
  2009-08-13 20:12   ` Vladimir 'phcoder' Serbinenko
@ 2009-08-13 20:56     ` Robert Millan
  0 siblings, 0 replies; 4+ messages in thread
From: Robert Millan @ 2009-08-13 20:56 UTC (permalink / raw)
  To: The development of GRUB 2

On Thu, Aug 13, 2009 at 10:12:34PM +0200, Vladimir 'phcoder' Serbinenko wrote:
> >
> > When you commit this, could you please follow logical order with
> > ifdef/else/endif?  The negation is less intuitive to read.
> Ok
> >
> >> +#ifdef MODE_UFS2
> >> +      grub_uint64_t indir[UFS_BLKSZ (sblock) / sizeof (grub_uint64_t)];
> >> +#else
> >> +      grub_uint32_t indir[UFS_BLKSZ (sblock) / sizeof (grub_uint32_t)];
> >> +#endif
> >
> > Can this be made simpler by using typeof() ?  (same for the other one below)
> >
> I tried using sizeof (indir[0]) but it doesn't work since indir isn't
> defined at that point.

Ah, of course..

> >> -      return (data->ufs_type == UFS1) ? indir[blk] : indir[blk << 1];
> >> +      return indir[blk];
> >
> > The blk bitshift was accounted for elsewhere?
> >
> By using correct type (grub_uint64_t vs grub_uint32_t)
> >  (Btw I assume you've tested
> > on both filesystem types).
> I tested on FreeBSD variants of UFS1 and UFS2. For Sun UFS1 I relied
> on report by Seth Goldberg
> >> -     ? dirent.namelen_bsd : grub_le_to_cpu16 (dirent.namelen);
> >> +#ifdef MODE_UFS2
> >> +      namelen = dirent.namelen_bsd;
> >> +#else
> >> +      namelen = grub_le_to_cpu16 (dirent.namelen);
> >> +#endif
> >
> > I wonder if there was a bug here (native endianess assumed for namelen_bsd?)
> >
> It's one byte

Ok.

Looks good to me then.  Please remember about the ifndef/else/endif thing.

-- 
Robert Millan

  The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
  how) you may access your data; but nobody's threatening your freedom: we
  still allow you to remove your data and not access it at all."



^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2009-08-13 20:57 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-08-13 16:03 [PATCH 1/2] Split ufs.mod into ufs1.mod and ufs2.mod Vladimir 'phcoder' Serbinenko
2009-08-13 20:00 ` Robert Millan
2009-08-13 20:12   ` Vladimir 'phcoder' Serbinenko
2009-08-13 20:56     ` Robert Millan

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.