Print this page
fixes + mirror

@@ -20,10 +20,11 @@
 #include <grub/types.h>
 #include <grub/misc.h>
 #include <grub/mm.h>
 #include <grub/err.h>
 #include <grub/dl.h>
+#include <grub/zfs/zfs.h>
 #include <grub/device.h>
 #include <grub/file.h>
 #include <grub/env.h>
 #include <grub/command.h>
 #include <grub/search.h>

@@ -42,14 +43,15 @@
 
 static struct cache_entry *cache;
 
 void
 FUNC_NAME (const char *key, const char *var, int no_floppy,
-           char **hints, unsigned nhints)
+           char **hints, unsigned nhints, int mirror)
 {
   int count = 0;
   int is_cache = 0;
+  grub_uint64_t txg = 0;
   grub_fs_autoload_hook_t saved_autoload;
 
   auto int iterate_device (const char *name);
   int iterate_device (const char *name)
   {

@@ -146,18 +148,39 @@
       }
 
     if (found)
       {
         count++;
-        if (var)
+        if (var) {
+          if (! mirror) {
           grub_env_set (var, name);
-        else
+          } else {
+            grub_uint64_t tmp_txg = 0;
+            char * nvlist = NULL;
+            grub_device_t dev = grub_device_open (name);
+            if (! dev) {
+              grub_errno = GRUB_ERR_BAD_DEVICE;
+              return 0;
+            }
+            grub_errno = grub_zfs_fetch_nvlist (dev, &nvlist);
+            grub_device_close (dev);
+            if (grub_errno)
+              return 0;
+            grub_zfs_nvlist_lookup_uint64 (nvlist, ZPOOL_CONFIG_POOL_TXG, &tmp_txg);
+            if (tmp_txg > txg) {
+              grub_env_set (var, name);
+              txg = tmp_txg;
+            }
+            grub_free (nvlist);
+          }
+        } else {
           grub_printf (" %s", name);
       }
+      }
 
     grub_errno = GRUB_ERR_NONE;
-    return (found && var);
+    return (found && var && !mirror);
   }
 
   auto int part_hook (grub_disk_t disk, const grub_partition_t partition);
   int part_hook (grub_disk_t disk, const grub_partition_t partition)
   {

@@ -278,11 +301,11 @@
 {
   if (argc == 0)
     return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected"));
 
   FUNC_NAME (args[0], argc == 1 ? 0 : args[1], 0, (args + 2),
-             argc > 2 ? argc - 2 : 0);
+             argc > 2 ? argc - 2 : 0, 0);
 
   return grub_errno;
 }
 
 static grub_command_t cmd;