Hello. Here is a patch to add BFS support to GRUB2. BFS is a filesystem which was originally developped by Be, Inc for their proprietary BeOS. When Be Inc was sold to Palm and developpement of BeOS ceased a community formed to rewrite it from scratch under MIT license. Currently this project named Haiku is usable and interesting even if it for the moment lacks important feature to achieve its goal of use-friendly desktop OS. Currently they have plans to add multiboot support (see another thread). As AtheFS is a descendent of BeOS based on BFS driver from Haiku I used already existing afs driver and added necessary ifdefs. As you can see AFS and BFS are very similar
-- Regards Vladimir 'phcoder' Serbinenko Personal git repository: http://repo.or.cz/w/grub2/phcoder.git
diff --git a/ChangeLog b/ChangeLog index e7e5d4a..1a46546 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,42 @@ 2009-07-17 Vladimir Serbinenko <phco...@gmail.com> + Add BFS support + + * conf/common.rmk (grub_probe_SOURCES): Add fs/befs.c. + (grub_fstest_SOURCES): Likewise. + (pkglib_MODULES): Add befs.mod. + (befs_mod_SOURCES): New variable. + (befs_mod_CFLAGS): Likewise. + (befs_mod_LDFLAGS): Likewise. + * conf/i386-coreboot.rmk (grub_emu_SOURCES): Likewise. + * conf/i386-efi.rmk (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-ieee1275.rmk (grub_emu_SOURCES): Likewise. + (grub_setup_SOURCES): Likewise. + * fs/befs.c: New file. + * fs/afs.c (GRUB_AFS_FSNAME): New declaration. + (GRUB_AFS_SBLOCK_SECTOR): Likewise. + (GRUB_AFS_SBLOCK_MAGIC1) [BFS]: New conditional declaration. + (GRUB_AFS_BTREE_MAGIC) [BFS]: Likewise + (B_KEY_INDEX_ALIGN): New declaration. + (B_KEY_INDEX_OFFSET): Use B_KEY_INDEX_ALIGN. + (grub_afs_bnode) [BFS]: Make key_count and key_size 16-bit + (grub_afs_btree) [BFS]: New conditional declaration. + (grub_afs_sblock) [BFS]: Remove link_count. + (grub_afs_validate_sblock) [BFS]: Support BFS + (grub_afs_mount) [BFS]: Likewise. + (grub_afs_dir) [BFS]: Divide mtime by 65536 and not 1000000. + (grub_afs_fs): Use GRUB_AFS_FSNAME + (GRUB_MOD_INIT (afs)) [BFS]: Rename to ... + (GRUB_MOD_INIT (befs)) [BFS]: ... this + (GRUB_MOD_FINI (afs)) [BFS]: Rename to ... + (GRUB_MOD_FINI (befs)) [BFS]: ... this + +2009-07-17 Vladimir Serbinenko <phco...@gmail.com> + Fix and improve AtheFS support. * fs/afs.c: Fix comments style. diff --git a/conf/common.rmk b/conf/common.rmk index 07ff04e..032517f 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/tar.c \ + fs/ufs.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/tar.c \ + fs/ufs.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 \ @@ -177,7 +177,7 @@ CLEANFILES += grub-dumpbios pkglib_MODULES += fshelp.mod fat.mod ufs.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 + udf.mod afs.mod befs.mod # For fshelp.mod. fshelp_mod_SOURCES = fs/fshelp.c @@ -274,6 +274,11 @@ afs_mod_SOURCES = fs/afs.c afs_mod_CFLAGS = $(COMMON_CFLAGS) afs_mod_LDFLAGS = $(COMMON_LDFLAGS) +# For befs.mod. +befs_mod_SOURCES = fs/befs.c +befs_mod_CFLAGS = $(COMMON_CFLAGS) +befs_mod_LDFLAGS = $(COMMON_LDFLAGS) + # Partition maps. pkglib_MODULES += amiga.mod apple.mod pc.mod sun.mod acorn.mod gpt.mod diff --git a/conf/i386-coreboot.rmk b/conf/i386-coreboot.rmk index c70f7d2..7ba5737 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/tar.c \ + fs/ufs.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 75aa611..9177b9d 100644 --- a/conf/i386-efi.rmk +++ b/conf/i386-efi.rmk @@ -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/tar.c \ + fs/ufs.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 513e1b7..0321979 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/tar.c \ + fs/ufs.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 f1915b6..0c8348f 100644 --- a/conf/i386-pc.rmk +++ b/conf/i386-pc.rmk @@ -110,7 +110,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/tar.c \ + fs/ufs.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.c \ \ partmap/pc.c partmap/gpt.c \ \ @@ -154,7 +154,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/tar.c \ + fs/ufs.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 b12635e..af29d23 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/tar.c \ + fs/ufs.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 8183cbc..aabccee 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/tar.c \ + fs/ufs.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/tar.c \ + fs/ufs.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/fs/afs.c b/fs/afs.c index a35f41d..59604a6 100644 --- a/fs/afs.c +++ b/fs/afs.c @@ -26,17 +26,35 @@ #include <grub/types.h> #include <grub/fshelp.h> +#ifdef BFS +#define GRUB_AFS_FSNAME "befs" +#else +#define GRUB_AFS_FSNAME "afs" +#endif + #define GRUB_AFS_DIRECT_BLOCK_COUNT 12 #define GRUB_AFS_BLOCKS_PER_DI_RUN 4 +#ifdef BFS +#define GRUB_AFS_SBLOCK_SECTOR 1 +/* BFS1 in hexadecimal. */ +#define GRUB_AFS_SBLOCK_MAGIC1 0x42465331 +#else +#define GRUB_AFS_SBLOCK_SECTOR 2 /* AFS1 in hexadecimal. */ #define GRUB_AFS_SBLOCK_MAGIC1 0x41465331 +#endif + #define GRUB_AFS_SBLOCK_MAGIC2 0xdd121031 #define GRUB_AFS_SBLOCK_MAGIC3 0x15b6830e #define GRUB_AFS_INODE_MAGIC 0x64358428 +#ifdef BFS +#define GRUB_AFS_BTREE_MAGIC 0x69f6c2e8 +#else #define GRUB_AFS_BTREE_MAGIC 0x65768995 +#endif #define GRUB_AFS_BNODE_SIZE 1024 @@ -58,10 +76,17 @@ #define U64(sb, u) (((sb)->byte_order == GRUB_AFS_BO_LITTLE_ENDIAN) ? \ grub_le_to_cpu64 (u) : grub_be_to_cpu64 (u)) +#ifdef BFS +#define B_KEY_INDEX_ALIGN 8 +#else +#define B_KEY_INDEX_ALIGN 4 +#endif + #define B_KEY_INDEX_OFFSET(node) ((grub_uint16_t *) \ - ((char *) (node) + \ - sizeof (struct grub_afs_bnode) + \ - ((node->key_size + 3) & ~3))) + ((char *) (node) \ + + ((sizeof (struct grub_afs_bnode) \ + + node->key_size + B_KEY_INDEX_ALIGN - 1) \ + & ~(B_KEY_INDEX_ALIGN - 1)))) #define B_KEY_VALUE_OFFSET(node) ((grub_afs_bvalue_t *) \ ((char *) B_KEY_INDEX_OFFSET (node) + \ @@ -100,11 +125,27 @@ struct grub_afs_bnode grub_afs_bvalue_t left; grub_afs_bvalue_t right; grub_afs_bvalue_t overflow; +#ifdef BFS + grub_uint16_t key_count; + grub_uint16_t key_size; +#else grub_uint32_t key_count; grub_uint32_t key_size; +#endif char key_data[0]; } __attribute__ ((packed)); +#ifdef BFS +struct grub_afs_btree +{ + grub_uint32_t magic; + grub_uint32_t unused1; + grub_uint32_t tree_depth; + grub_uint32_t unused2; + grub_afs_bvalue_t root; + grub_uint32_t unused3[4]; +} __attribute__ ((packed)); +#else struct grub_afs_btree { grub_uint32_t magic; @@ -113,6 +154,7 @@ struct grub_afs_btree grub_afs_bvalue_t last_node; grub_afs_bvalue_t first_free; } __attribute__ ((packed)); +#endif struct grub_afs_sblock { @@ -154,7 +196,9 @@ struct grub_afs_inode grub_uint32_t gid; grub_uint32_t mode; grub_uint32_t flags; +#ifndef BFS grub_uint32_t link_count; +#endif grub_afs_bigtime create_time; grub_afs_bigtime modified_time; struct grub_afs_blockrun parent; @@ -431,8 +475,10 @@ grub_afs_validate_sblock (struct grub_afs_sblock *sb) { if (grub_le_to_cpu32 (sb->magic1) == GRUB_AFS_SBLOCK_MAGIC1) { +#ifndef BFS if (grub_le_to_cpu32 (sb->byte_order) != GRUB_AFS_BO_LITTLE_ENDIAN) return 0; +#endif sb->byte_order = GRUB_AFS_BO_LITTLE_ENDIAN; sb->magic2 = grub_le_to_cpu32 (sb->magic2); @@ -450,8 +496,10 @@ grub_afs_validate_sblock (struct grub_afs_sblock *sb) } else if (grub_be_to_cpu32 (sb->magic1) == GRUB_AFS_SBLOCK_MAGIC1) { +#ifndef BFS if (grub_be_to_cpu32 (sb->byte_order) != GRUB_AFS_BO_BIG_ENDIAN) return 0; +#endif sb->byte_order = GRUB_AFS_BO_BIG_ENDIAN; sb->magic2 = grub_be_to_cpu32 (sb->magic2); @@ -474,15 +522,22 @@ grub_afs_validate_sblock (struct grub_afs_sblock *sb) (sb->magic3 != GRUB_AFS_SBLOCK_MAGIC3)) return 0; - if (((grub_uint32_t) (1 << sb->block_shift) != sb->block_size) || - (sb->used_blocks > sb->num_blocks ) || - (sb->inode_size != sb->block_size) || - (0 == sb->block_size) || - ((grub_uint32_t) (1 << sb->alloc_group_shift) != - sb->block_per_group * sb->block_size) || - (sb->alloc_group_count * sb->block_per_group < sb->num_blocks) || - (U16 (sb, sb->log_block.len) != sb->log_size) || - (U32 (sb, sb->valid_log_blocks) > sb->log_size)) +#ifdef BFS + sb->block_per_group = 1 << (sb->alloc_group_shift); +#endif + + if (((grub_uint32_t) (1 << sb->block_shift) != sb->block_size) + || (sb->used_blocks > sb->num_blocks ) + || (sb->inode_size != sb->block_size) + || (0 == sb->block_size) +#ifndef BFS + || ((grub_uint32_t) (1 << sb->alloc_group_shift) != + sb->block_per_group * sb->block_size) + || (sb->alloc_group_count * sb->block_per_group < sb->num_blocks) + || (U16 (sb, sb->log_block.len) != sb->log_size) + || (U32 (sb, sb->valid_log_blocks) > sb->log_size) +#endif + ) return 0; return 1; @@ -498,8 +553,8 @@ grub_afs_mount (grub_disk_t disk) return 0; /* Read the superblock. */ - if (grub_disk_read (disk, 1 * 2, 0, sizeof (struct grub_afs_sblock), - &data->sblock)) + if (grub_disk_read (disk, GRUB_AFS_SBLOCK_SECTOR, 0, + sizeof (struct grub_afs_sblock), &data->sblock)) goto fail; if (! grub_afs_validate_sblock (&data->sblock)) @@ -518,7 +573,8 @@ grub_afs_mount (grub_disk_t disk) return data; fail: - grub_error (GRUB_ERR_BAD_FS, "not an afs filesystem"); + grub_error (GRUB_ERR_BAD_FS, "not an " GRUB_AFS_FSNAME " filesystem"); + grub_free (data); return 0; } @@ -596,7 +652,11 @@ grub_afs_dir (grub_device_t device, const char *path, grub_memset (&info, 0, sizeof (info)); info.dir = ((filetype & GRUB_FSHELP_TYPE_MASK) == GRUB_FSHELP_DIR); info.mtimeset = 1; +#ifdef BFS + info.mtime = node->inode.modified_time >> 16; +#else info.mtime = grub_divmod64 (node->inode.modified_time, 1000000, 0); +#endif grub_free (node); return hook (filename, &info); } @@ -648,7 +708,7 @@ grub_afs_label (grub_device_t device, char **label) static struct grub_fs grub_afs_fs = { - .name = "afs", + .name = GRUB_AFS_FSNAME, .dir = grub_afs_dir, .open = grub_afs_open, .read = grub_afs_read, @@ -657,13 +717,21 @@ static struct grub_fs grub_afs_fs = { .next = 0 }; +#ifdef BFS +GRUB_MOD_INIT (befs) +#else GRUB_MOD_INIT (afs) +#endif { grub_fs_register (&grub_afs_fs); my_mod = mod; } +#ifdef BFS +GRUB_MOD_FINI (befs) +#else GRUB_MOD_FINI (afs) +#endif { grub_fs_unregister (&grub_afs_fs); } diff --git a/fs/befs.c b/fs/befs.c new file mode 100644 index 0000000..148378e --- /dev/null +++ b/fs/befs.c @@ -0,0 +1,3 @@ +/* befs.c - The native BeOS/Haiku file-system. */ +#define BFS 1 +#include "afs.c"
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel