All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Vladimir 'φ-coder/phcoder' Serbinenko" <phcoder@gmail.com>
To: The development of GNU GRUB <grub-devel@gnu.org>
Subject: Re: Are BSD partitions not supported?
Date: Wed, 19 May 2010 00:20:32 +0200	[thread overview]
Message-ID: <4BF312B0.8020700@gmail.com> (raw)
In-Reply-To: <4BF2F68E.8090906@gmail.com>

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

Vladimir 'φ-coder/phcoder' Serbinenko wrote:
> C. P. Ghost wrote:
>   
>> 2010/5/18 Vladimir 'φ-coder/phcoder' Serbinenko <phcoder@gmail.com>:
>>   
>>     
>>> C. P. Ghost wrote:
>>>     
>>>       
>>>> On Sun, May 16, 2010 at 6:24 PM, C. P. Ghost <cpghost@cordula.ws> wrote:
>>>>
>>>>       
>>>>         
>>>>> is support for BSD partitions (or maybe ufs2) broken in grub2 (1.98)?
>>>>>
>>>>>         
>>>>>           
>>>> No replies so far? Could a developer *please* have a closer look
>>>> at this?
>>>>
>>>>
>>>>       
>>>>         
>>> Your mail is quite long and looks like a tech support request. If it is
>>> such it's not right mailing list. Use help-grub@gnu.org or IRC. If it's
>>> a bug report please supply an image file which triggers bug.
>>> BSD partitions are supported as long as part_msdos and part_bsd (not
>>> necessary in release) are loaded.
>>>     
>>>       
>> (2nd try, mailer swallowed the attachment)
>>
>> Thank you for replying.
>>
>> Of course, it is a bug report. The steps to create the image are
>> very detailed and should be enough to reproduce the bug on a
>> FreeBSD/amd64 system.
>>
>> Here's a 362k 7z-compressed image of a 25MB disk
>> that contains one slice 's1' with a BSD partition 'a' and
>> a UFS2 filesystem on it:
>>
>> http://www.cordula.ws/tempdir/bsddisk.7z
>>
>> Don't expect it to boot, because grub-install wasn't able
>> to complete the task (grub-probe failed as in the long mail).
>> The file system contains the /boot/grub/* files though: those
>> were properly installed by grub-install. Just not the MBR.
>>
>> If I can provide more help, please do ask. :)
>>
>>   
>>     
> This bsdlabel has 2 strangenesses. First one is seen in your log:
>
>   a:   497936       16    unused        0     0
> In other words for some strange reason it's declared as unused entry slot.
> Second one is that offsets are stored relative to host partition, not relative to disk start. While the first can be easily fixed by checking length instead of type, second one isproblematic since it would break all other images (I've checked with FreeBSD andNetBSD images I had under my hand). So we need areliable way to determine which way is used. I found few differing bytes between your image and my FreeBSD image (specifically bytes 0x(80)30-0x(80)3f) but nothing that would allow a reliable detection. If you can find out the reason and a way of detecting this diskrepancy it will help
>
>   
My first thought was to use 'c' partition to find this base but I
dismissed it straight ahead because it's only a convention that 'c'
covers the whole disk. But then I played with bsdlabel and found out
that if I move 'c' partition FreeBSD itself is confused too. Since
nobody would consider it a bug if GRUB doesn't recognise properly a
partition not workable in FreeBSD itself I think we should go for
consistent behaviour for the lack of anything better. Try the patch:
=== modified file 'include/grub/bsdlabel.h'
--- include/grub/bsdlabel.h    2010-02-06 17:43:37 +0000
+++ include/grub/bsdlabel.h    2010-05-18 22:05:09 +0000
@@ -63,6 +63,8 @@
 #define    GRUB_PC_PARTITION_OPENBSD_TYPE_NTFS    18
 #define    GRUB_PC_PARTITION_OPENBSD_TYPE_RAID    19
 
+#define GRUB_PC_PARTITION_BSD_LABEL_WHOLE_DISK_PARTITION 2
+
 /* The BSD partition entry.  */
 struct grub_partition_bsd_entry
 {

=== modified file 'partmap/bsdlabel.c'
--- partmap/bsdlabel.c    2010-03-26 14:44:13 +0000
+++ partmap/bsdlabel.c    2010-05-18 22:13:37 +0000
@@ -37,9 +37,6 @@
   grub_disk_addr_t delta = 0;
   unsigned pos;
 
-  /* BSDLabel offsets are absolute even when it's embed inside
partition.  */
-  delta = grub_partition_get_start (disk->partition);
-
   /* Read the BSD label.  */
   if (grub_disk_read (disk, GRUB_PC_PARTITION_BSD_LABEL_SECTOR,
               0, sizeof (label), &label))
@@ -49,15 +46,36 @@
   if (label.magic != grub_cpu_to_le32 (GRUB_PC_PARTITION_BSD_LABEL_MAGIC))
     return grub_error (GRUB_ERR_BAD_PART_TABLE, "no signature");
 
+  /* A kludge to determine a base of be.offset.  */
+  if (GRUB_PC_PARTITION_BSD_LABEL_WHOLE_DISK_PARTITION
+      < grub_cpu_to_le16 (label.num_partitions))
+    {
+      struct grub_partition_bsd_entry whole_disk_be;
+
+      pos = sizeof (label) + GRUB_PC_PARTITION_BSD_LABEL_SECTOR
+    * GRUB_DISK_SECTOR_SIZE + sizeof (struct grub_partition_bsd_entry)
+    * GRUB_PC_PARTITION_BSD_LABEL_WHOLE_DISK_PARTITION;
+
+      if (grub_disk_read (disk, pos / GRUB_DISK_SECTOR_SIZE,
+              pos % GRUB_DISK_SECTOR_SIZE, sizeof (whole_disk_be),
+              &whole_disk_be))
+    return grub_errno;
+
+      delta = grub_le_to_cpu32 (whole_disk_be.offset);
+    }
+
   pos = sizeof (label) + GRUB_PC_PARTITION_BSD_LABEL_SECTOR
     * GRUB_DISK_SECTOR_SIZE;
 
   for (p.number = 0;
        p.number < grub_cpu_to_le16 (label.num_partitions);
-       p.number++)
+       p.number++, pos += sizeof (struct grub_partition_bsd_entry))
     {
       struct grub_partition_bsd_entry be;
 
+      if (p.number == GRUB_PC_PARTITION_BSD_LABEL_WHOLE_DISK_PARTITION)
+    continue;
+
       p.offset = pos / GRUB_DISK_SECTOR_SIZE;
       p.index = pos % GRUB_DISK_SECTOR_SIZE;
 
@@ -68,11 +86,9 @@
       p.len = grub_le_to_cpu32 (be.size);
       p.partmap = &grub_bsdlabel_partition_map;
 
-      if (be.fs_type != GRUB_PC_PARTITION_BSD_TYPE_UNUSED)
+      if (p.len != 0)
     if (hook (disk, &p))
       return grub_errno;
-
-      pos += sizeof (struct grub_partition_bsd_entry);
     }
 
   return GRUB_ERR_NONE;



-- 
Regards
Vladimir 'φ-coder/phcoder' Serbinenko



[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 293 bytes --]

      parent reply	other threads:[~2010-05-18 22:20 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-05-16 16:24 Are BSD partitions not supported? C. P. Ghost
2010-05-18 18:08 ` C. P. Ghost
2010-05-18 18:37   ` Vladimir 'φ-coder/phcoder' Serbinenko
2010-05-18 19:33     ` C. P. Ghost
2010-05-18 20:20       ` Vladimir 'φ-coder/phcoder' Serbinenko
2010-05-18 22:06         ` C. P. Ghost
2010-05-19 17:49           ` C. P. Ghost
2010-05-19 18:00             ` Vladimir 'φ-coder/phcoder' Serbinenko
2010-05-19 18:33               ` C. P. Ghost
2010-05-19 18:40                 ` C. P. Ghost
2010-05-19 18:50                   ` Vladimir 'φ-coder/phcoder' Serbinenko
2010-05-19 18:54                     ` Navdeep Parhar
2010-05-19 19:20                       ` C. P. Ghost
2010-05-19 19:12                     ` C. P. Ghost
2010-05-19 19:20                       ` Vladimir 'φ-coder/phcoder' Serbinenko
2010-05-19 19:41                         ` C. P. Ghost
2010-05-20 16:19                           ` C. P. Ghost
2010-05-23  9:50                         ` Grégoire Sutre
2010-05-23 15:44                           ` C. P. Ghost
2010-05-24  0:56                             ` Grégoire Sutre
2010-05-24 16:50                               ` C. P. Ghost
2010-05-31 21:16                           ` Vladimir 'φ-coder/phcoder' Serbinenko
2010-06-01 10:34                             ` Grégoire Sutre
2010-06-01 11:21                               ` Vladimir 'φ-coder/phcoder' Serbinenko
2010-06-06 17:05                                 ` Grégoire Sutre
2010-05-19 18:48                 ` Vladimir 'φ-coder/phcoder' Serbinenko
2010-05-18 22:20         ` Vladimir 'φ-coder/phcoder' Serbinenko [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4BF312B0.8020700@gmail.com \
    --to=phcoder@gmail.com \
    --cc=grub-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.