if (!err)
err = zap_lookup (&subvol->mdn, snapname, &headobj, data, 0);
if (!err)
- err = dnode_get (&(data->mos), headobj, DMU_OT_DSL_DATASET,
+ err = dnode_get (&(data->mos), headobj, 0,
&subvol->mdn, data);
+ if (!err && subvol->mdn.dn.dn_type != DMU_OT_DSL_DATASET && subvol->mdn.dn.dn_bonustype != DMU_OT_DSL_DATASET)
+ return grub_error(GRUB_ERR_BAD_FS, "incorrect dataset dnode type");
+
if (err)
{
grub_free (fsname);
info->dir = 1;
- if (mdn.dn.dn_type == DMU_OT_DSL_DIR)
+ if (mdn.dn.dn_type == DMU_OT_DSL_DIR || mdn.dn.dn_bonustype == DMU_OT_DSL_DIR)
{
headobj = grub_zfs_to_cpu64 (((dsl_dir_phys_t *) DN_BONUS (&mdn.dn))->dd_head_dataset_obj, mdn.endian);
grub_errno = 0;
return 0;
}
- if (mdn.dn.dn_type != DMU_OT_DSL_DIR)
+ if (mdn.dn.dn_type != DMU_OT_DSL_DIR && mdn.dn.dn_bonustype != DMU_OT_DSL_DIR) {
+ grub_dprintf ("zfs", "type = 0x%x, val = 0x%llx\n", mdn.dn.dn_type, (long long)val);
return 0;
+ }
err = fill_fs_info (&info, &mdn, ctx->data);
if (err)
return 0;
}
- if (mdn.dn.dn_type != DMU_OT_DSL_DATASET)
+ if (mdn.dn.dn_type != DMU_OT_DSL_DATASET && mdn.dn.dn_bonustype != DMU_OT_DSL_DATASET)
return 0;
err = fill_fs_info (&info, &mdn, ctx->data);
zap_iterate_u64 (&dn, iterate_zap_fs, data, &ctx);
- err = dnode_get (&(data->mos), headobj, DMU_OT_DSL_DATASET, &dn, data);
+ err = dnode_get (&(data->mos), headobj, 0, &dn, data);
+ if (!err && dn.dn.dn_type != DMU_OT_DSL_DATASET && dn.dn.dn_bonustype != DMU_OT_DSL_DATASET)
+ return grub_error(GRUB_ERR_BAD_FS, "incorrect dataset dnode type");
+
if (err)
{
zfs_unmount (data);