Im resubmitting an individual patch by Alain Greppin which was originaly
provided as part of a much larger patch (and declined for that reason). This
patch is required for support of the AROS operating system (www.aros.org).

 2008-03-08  Alain Greppin  <[EMAIL PROTECTED]>
 * fs/affs.c (grub_sfs_read_extent ): Allow AFFS to be used on MBR style
partitions.
Index: fs/affs.c
===================================================================
--- fs/affs.c    (revision 27991)
+++ fs/affs.c    (working copy)
@@ -25,6 +25,7 @@
 #include <grub/dl.h>
 #include <grub/types.h>
 #include <grub/fshelp.h>
+#include <grub/partition.h>

 /* The affs bootblock.  */
 struct grub_affs_bblock
@@ -166,6 +167,8 @@
   struct grub_affs_data *data;
   grub_uint32_t *rootblock = 0;
   struct grub_affs_rblock *rblock;
+  grub_uint64_t rdb_blockcount, rdb_reserved;
+  grub_disk_addr_t rblknum;

   int checksum = 0;
   int checksumr = 0;
@@ -210,8 +213,16 @@
   rblock = (struct grub_affs_rblock *) rootblock;

   /* Read the rootblock.  */
-  grub_disk_read (disk, (disk->total_sectors >> 1) + blocksize, 0,
-    GRUB_DISK_SECTOR_SIZE * 16, (char *) rootblock);
+  rdb_blockcount = disk->total_sectors;
+  rdb_reserved = 2;
+
+  if (disk->partition)
+    rdb_blockcount = disk->partition->len;
+
+  rblknum = (rdb_blockcount - 1 + rdb_reserved) >> 1;
+
+  grub_disk_read (disk, rblknum, 0,
+                 GRUB_DISK_SECTOR_SIZE * 16, (char *) rootblock);
   if (grub_errno)
     goto fail;

@@ -242,7 +253,7 @@
   data->disk = disk;
   data->htsize = grub_be_to_cpu32 (rblock->htsize);
   data->diropen.data = data;
-  data->diropen.block = (disk->total_sectors >> 1);
+  data->diropen.block = rblknum;

   grub_free (rootblock);
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to