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;