struct grub_zfs_device_desc *devices_attached;
unsigned n_devices_attached;
unsigned n_devices_allocated;
+ struct grub_zfs_device_desc *device_original;
uberblock_t current_uberblock;
}
static grub_err_t
-fill_vdev_info_real (const char *nvlist,
+fill_vdev_info_real (struct grub_zfs_data *data,
+ const char *nvlist,
struct grub_zfs_device_desc *fill,
struct grub_zfs_device_desc *insert)
{
fill->current_uberblock = insert->current_uberblock;
fill->original = insert->original;
}
+ if (!data->device_original)
+ data->device_original = fill;
return GRUB_ERR_NONE;
}
child = grub_zfs_nvlist_lookup_nvlist_array
(nvlist, ZPOOL_CONFIG_CHILDREN, i);
- err = fill_vdev_info_real (child, &fill->children[i], insert);
+ err = fill_vdev_info_real (data, child, &fill->children[i], insert);
grub_free (child);
for (i = 0; i < data->n_devices_attached; i++)
if (data->devices_attached[i].id == id)
- return fill_vdev_info_real (nvlist, &data->devices_attached[i],
+ return fill_vdev_info_real (data, nvlist, &data->devices_attached[i],
diskdesc);
data->n_devices_attached++;
grub_memset (&data->devices_attached[data->n_devices_attached - 1],
0, sizeof (data->devices_attached[data->n_devices_attached - 1]));
- return fill_vdev_info_real (nvlist,
+ return fill_vdev_info_real (data, nvlist,
&data->devices_attached[data->n_devices_attached - 1],
diskdesc);
}
zfs = zfs_mount (dev);
if (!zfs)
return grub_errno;
- err = zfs_fetch_nvlist (&zfs->devices_attached[0], nvlist);
+ err = zfs_fetch_nvlist (zfs->device_original, nvlist);
zfs_unmount (zfs);
return err;
}
if (! data)
return grub_errno;
- err = zfs_fetch_nvlist (data->devices_attached, &nvlist);
+ err = zfs_fetch_nvlist (data->device_original, &nvlist);
if (err)
{
zfs_unmount (data);