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

Reply via email to