Nick,

What is the state of your patch set? I think mine is much smaller if you want to roll it into yours and resubmit. We were told all along to wait until after 2.02, which should to be very soon, so it looks like it's show time!

Steve Kenton


On 02/14/2017 07:12 PM, Andrei Borzenkov wrote:
14.02.2017 21:00, Steve Kenton пишет:
Support both EFI and NT Disk Signature for passing to kernel as 
root=PARTUUID=$val

Yes, I guess we need to add it finally. Unfortunately it is too late for
2.02, but it should go after in release. There were also patches for
grub-probe and we also need to support it in search to be on par with
filesystem UUID. May be if you could prepare consolidated patch set it
would be great.

I apologize that it tool so long. Thank you for not giving up!

Signed-off-by: Steve Kenton <sken...@ou.edu>
---
It's been six months so I thought I'd resend this so it does not get lost
in case I get hit by a meteor or something before the next release

  grub-core/commands/probe.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++
  1 file changed, 53 insertions(+)

diff --git a/grub-core/commands/probe.c b/grub-core/commands/probe.c
index cf2793e..3afc8b8 100644
--- a/grub-core/commands/probe.c
+++ b/grub-core/commands/probe.c
Please also add patch for manual.

@@ -45,6 +45,7 @@ static const struct grub_arg_option options[] =
      {"fs",          'f', 0, N_("Determine filesystem type."), 0, 0},
      {"fs-uuid",             'u', 0, N_("Determine filesystem UUID."), 0, 0},
      {"label",               'l', 0, N_("Determine filesystem label."), 0, 0},
+    {"partuuid",     'g', 0, N_("Determine partition GUID/UUID."), 0, 0}, /* GUID but 
Linux kernel calls it "PARTUUID" */
      {0, 0, 0, 0, 0, 0}
    };
@@ -154,6 +155,58 @@ grub_cmd_probe (grub_extcmd_context_t ctxt, int argc, char **args)
        grub_device_close (dev);
        return GRUB_ERR_NONE;
      }
+  if (state[6].set)
+    {
+      char *partuuid = NULL; /* NULL to silence a spurious GCC warning */
+      grub_uint8_t diskbuf[16];
+      if (dev->disk && dev->disk->partition)
+       {
+         grub_partition_t p = dev->disk->partition;
+         if (!grub_strcmp (p->partmap->name, "msdos"))
+           {
+             const int diskid_offset = 440; /* location in MBR */
+             dev->disk->partition = p->parent;
+             /* little-endian 4-byte NT disk signature */
+             err = grub_disk_read (dev->disk, 0, diskid_offset, 4, diskbuf);
+             dev->disk->partition = p;
+             if (err)
+               return grub_errno;
+             partuuid = grub_xasprintf ("%02x%02x%02x%02x-%02x",
+                                        diskbuf[3], diskbuf[2], diskbuf[1], 
diskbuf[0],
+                                        p->number + 1); /* one based partition 
number */
+           }
+         else if (!grub_strcmp (p->partmap->name, "gpt"))
+           {
+             const int guid_offset = 16; /* location in entry */
+             dev->disk->partition = p->parent;
+             /* little-endian 16-byte EFI partition GUID */
+             err = grub_disk_read (dev->disk, p->offset, p->index + 
guid_offset, 16, diskbuf);
+             dev->disk->partition = p;
+             if (err)
+               return grub_errno;
+             partuuid = grub_xasprintf 
("%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
+                                        diskbuf[3], diskbuf[2], diskbuf[1], 
diskbuf[0],
+                                        diskbuf[5], diskbuf[4],
+                                        diskbuf[7], diskbuf[6],
+                                        diskbuf[8], diskbuf[9],
+                                        diskbuf[10], diskbuf[11], diskbuf[12], 
diskbuf[13], diskbuf[14], diskbuf[15]);
+           }
+         else
+           return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
+                              N_("partition map %s does not support partition 
UUIDs"),
+                              dev->disk->partition->partmap->name);
+       }
+      else
+       partuuid = grub_strdup (""); /* a freeable empty string */
+
+      if (state[0].set)
+       grub_env_set (state[0].arg, partuuid);
+      else
+       grub_printf ("%s", partuuid);
+      grub_free (partuuid);
+      grub_device_close (dev);
+      return GRUB_ERR_NONE;
+    }
    grub_device_close (dev);
    return grub_error (GRUB_ERR_BAD_ARGUMENT, "unrecognised target");
  }



_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to