diff --git a/ChangeLog b/ChangeLog index 675cc6d..8e13775 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,34 @@ +2009-08-13 Vladimir Serbinenko + + 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 * 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 #include - +#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) 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"