В Sun, 19 Apr 2015 22:53:35 +0300 Toomas Soome <tso...@me.com> пишет:
> > > On 19.04.2015, at 22:40, Andrei Borzenkov <arvidj...@gmail.com> wrote: > > > > В Thu, 16 Apr 2015 08:24:38 +0300 > > Toomas Soome <tso...@me.com> пишет: > > > >> > > > > Could you explain how these changes affect large block read? As far as > > I understand, this feature is basically "for free" - changes were > > needed to allow large block writes, but on disk format already > > supported them so reading should have just worked? > > > > > yes, large block is basically free, but, there are 2 conditions. > > 1. large blocks basically use extensible dataset feature, or to be exact, > setting recordsize above 128k will trigger large_block feature to be enabled > and storing such blocks is using feature extensible dataset. so the > extensible dataset is prerequisite. > > 2. once large block is enabled, its listed in label as well, and therefore it > should be listed in spa_feature_names, which is list of supported features. > > but otherwise, reading large blocks does not require any other changes > (assuming there is enough memory to read those blocks). Good. So the means that the only change needed was ... > > rgds, > toomas > > > > >> --- > >> grub-core/fs/zfs/zfs.c | 18 +++++++++++------- > >> 1 file changed, 11 insertions(+), 7 deletions(-) > >> > >> diff --git a/grub-core/fs/zfs/zfs.c b/grub-core/fs/zfs/zfs.c > >> index da44131..4a542e0 100644 > >> --- a/grub-core/fs/zfs/zfs.c > >> +++ b/grub-core/fs/zfs/zfs.c > >> @@ -283,6 +283,8 @@ static const char *spa_feature_names[] = { > >> "org.illumos:lz4_compress", > >> "com.delphix:hole_birth", > >> "com.delphix:embedded_data", > >> + "com.delphix:extensible_dataset", > >> + "org.open-zfs:large_blocks", ... this one. What all other changes below do and how they are related to these two features? > >> NULL > >> }; > >> > >> @@ -3080,7 +3082,7 @@ get_filesystem_dnode (dnode_end_t * mosmdn, char > >> *fsname, > >> > >> grub_dprintf ("zfs", "alive\n"); > >> > >> - err = dnode_get (mosmdn, objnum, DMU_OT_DSL_DIR, mdn, data); > >> + err = dnode_get (mosmdn, objnum, 0, mdn, data); > >> if (err) > >> return err; > >> > >> @@ -3113,7 +3115,7 @@ get_filesystem_dnode (dnode_end_t * mosmdn, char > >> *fsname, > >> if (err) > >> return err; > >> > >> - err = dnode_get (mosmdn, objnum, DMU_OT_DSL_DIR, mdn, data); > >> + err = dnode_get (mosmdn, objnum, 0, mdn, data); > >> if (err) > >> return err; > >> > >> @@ -3268,8 +3270,7 @@ dnode_get_fullpath (const char *fullpath, struct > >> subvolume *subvol, > >> > >> grub_dprintf ("zfs", "endian = %d\n", subvol->mdn.endian); > >> > >> - err = dnode_get (&(data->mos), headobj, DMU_OT_DSL_DATASET, > >> &subvol->mdn, > >> - data); > >> + err = dnode_get (&(data->mos), headobj, 0, &subvol->mdn, data); > >> if (err) > >> { > >> grub_free (fsname); > >> @@ -3665,8 +3666,11 @@ zfs_mount (grub_device_t dev) > >> if (ub->ub_version >= SPA_VERSION_FEATURES && > >> check_mos_features(&((objset_phys_t *) osp)->os_meta_dnode,ub_endian, > >> data) != 0) > >> - return NULL; > >> - > >> + { > >> + grub_error (GRUB_ERR_BAD_FS, "Unsupported features in pool"); > >> + return NULL; > >> + } > >> + > >> /* Got the MOS. Save it at the memory addr MOS. */ > >> grub_memmove (&(data->mos.dn), &((objset_phys_t *) osp)->os_meta_dnode, > >> DNODE_SIZE); > >> @@ -3963,7 +3967,7 @@ fill_fs_info (struct grub_dirhook_info *info, > >> { > >> headobj = grub_zfs_to_cpu64 (((dsl_dir_phys_t *) DN_BONUS > >> (&mdn.dn))->dd_head_dataset_obj, mdn.endian); > >> > >> - err = dnode_get (&(data->mos), headobj, DMU_OT_DSL_DATASET, &mdn, > >> data); > >> + err = dnode_get (&(data->mos), headobj, 0, &mdn, data); > >> if (err) > >> { > >> grub_dprintf ("zfs", "failed here\n"); > > > _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel