On Sat, Oct 12, 2024 at 10:51:09AM GMT, Neal Gompa wrote: > On Fri, Oct 11, 2024 at 6:40 PM Leo Sandoval <lsand...@redhat.com> wrote: > > > > From: Michael Chang <mch...@suse.com> > > > > Signed-off-by: Michael Chang <mch...@suse.com> > > Signed-off-by: Robbie Harwood <rharw...@redhat.com> > > This needs a real commit message describing what this does. Please > work with Michael to come up with one. :)
I will provide the description to Leo. Same for other related patches. Thanks, Michael > > > --- > > grub-core/fs/btrfs.c | 107 ++++++++++++++++++++++++++++++------------- > > 1 file changed, 76 insertions(+), 31 deletions(-) > > > > diff --git a/grub-core/fs/btrfs.c b/grub-core/fs/btrfs.c > > index 14e38a4df..d47f9ab03 100644 > > --- a/grub-core/fs/btrfs.c > > +++ b/grub-core/fs/btrfs.c > > @@ -1335,6 +1335,7 @@ grub_btrfs_mount (grub_device_t dev) > > { > > struct grub_btrfs_data *data; > > grub_err_t err; > > + const char *relpath = grub_env_get ("btrfs_relative_path"); > > > > if (!dev->disk) > > { > > @@ -1365,11 +1366,14 @@ grub_btrfs_mount (grub_device_t dev) > > data->devices_attached[0].dev = dev; > > data->devices_attached[0].id = data->sblock.this_device.device_id; > > > > - err = btrfs_handle_subvol (data); > > - if (err) > > + if (relpath && (relpath[0] == '1' || relpath[0] == 'y')) > > { > > - grub_free (data); > > - return NULL; > > + err = btrfs_handle_subvol (data); > > + if (err) > > + { > > + grub_free (data); > > + return NULL; > > + } > > } > > > > return data; > > @@ -1966,24 +1970,39 @@ find_path (struct grub_btrfs_data *data, > > grub_size_t allocated = 0; > > struct grub_btrfs_dir_item *direl = NULL; > > struct grub_btrfs_key key_out; > > + int follow_default; > > const char *ctoken; > > grub_size_t ctokenlen; > > char *path_alloc = NULL; > > char *origpath = NULL; > > unsigned symlinks_max = 32; > > + const char *relpath = grub_env_get ("btrfs_relative_path"); > > > > + follow_default = 0; > > origpath = grub_strdup (path); > > if (!origpath) > > return grub_errno; > > > > - if (data->fs_tree) > > + if (relpath && (relpath[0] == '1' || relpath[0] == 'y')) > > { > > - *type = GRUB_BTRFS_DIR_ITEM_TYPE_DIRECTORY; > > - *tree = data->fs_tree; > > - /* This is a tree root, so everything starts at objectid 256 */ > > - key->object_id = grub_cpu_to_le64_compile_time > > (GRUB_BTRFS_OBJECT_ID_CHUNK); > > - key->type = GRUB_BTRFS_ITEM_TYPE_DIR_ITEM; > > - key->offset = 0; > > + if (data->fs_tree) > > + { > > + *type = GRUB_BTRFS_DIR_ITEM_TYPE_DIRECTORY; > > + *tree = data->fs_tree; > > + /* This is a tree root, so everything starts at objectid 256 */ > > + key->object_id = grub_cpu_to_le64_compile_time > > (GRUB_BTRFS_OBJECT_ID_CHUNK); > > + key->type = GRUB_BTRFS_ITEM_TYPE_DIR_ITEM; > > + key->offset = 0; > > + } > > + else > > + { > > + *type = GRUB_BTRFS_DIR_ITEM_TYPE_DIRECTORY; > > + *tree = data->sblock.root_tree; > > + key->object_id = data->sblock.root_dir_objectid; > > + key->type = GRUB_BTRFS_ITEM_TYPE_DIR_ITEM; > > + key->offset = 0; > > + follow_default = 1; > > + } > > } > > else > > { > > @@ -1994,15 +2013,23 @@ find_path (struct grub_btrfs_data *data, > > > > while (1) > > { > > - while (path[0] == '/') > > - path++; > > - if (!path[0]) > > - break; > > - slash = grub_strchr (path, '/'); > > - if (!slash) > > - slash = path + grub_strlen (path); > > - ctoken = path; > > - ctokenlen = slash - path; > > + if (!follow_default) > > + { > > + while (path[0] == '/') > > + path++; > > + if (!path[0]) > > + break; > > + slash = grub_strchr (path, '/'); > > + if (!slash) > > + slash = path + grub_strlen (path); > > + ctoken = path; > > + ctokenlen = slash - path; > > + } > > + else > > + { > > + ctoken = "default"; > > + ctokenlen = sizeof ("default") - 1; > > + } > > > > if (*type != GRUB_BTRFS_DIR_ITEM_TYPE_DIRECTORY) > > { > > @@ -2013,7 +2040,9 @@ find_path (struct grub_btrfs_data *data, > > > > if (ctokenlen == 1 && ctoken[0] == '.') > > { > > - path = slash; > > + if (!follow_default) > > + path = slash; > > + follow_default = 0; > > continue; > > } > > if (ctokenlen == 2 && ctoken[0] == '.' && ctoken[1] == '.') > > @@ -2044,8 +2073,9 @@ find_path (struct grub_btrfs_data *data, > > *type = GRUB_BTRFS_DIR_ITEM_TYPE_DIRECTORY; > > key->object_id = key_out.offset; > > > > - path = slash; > > - > > + if (!follow_default) > > + path = slash; > > + follow_default = 0; > > continue; > > } > > > > @@ -2114,7 +2144,9 @@ find_path (struct grub_btrfs_data *data, > > return err; > > } > > > > - path = slash; > > + if (!follow_default) > > + path = slash; > > + follow_default = 0; > > if (cdirel->type == GRUB_BTRFS_DIR_ITEM_TYPE_SYMLINK) > > { > > struct grub_btrfs_inode inode; > > @@ -2164,14 +2196,26 @@ find_path (struct grub_btrfs_data *data, > > path = path_alloc = tmp; > > if (path[0] == '/') > > { > > - if (data->fs_tree) > > + if (relpath && (relpath[0] == '1' || relpath[0] == 'y')) > > { > > - *type = GRUB_BTRFS_DIR_ITEM_TYPE_DIRECTORY; > > - *tree = data->fs_tree; > > - /* This is a tree root, so everything starts at objectid > > 256 */ > > - key->object_id = grub_cpu_to_le64_compile_time > > (GRUB_BTRFS_OBJECT_ID_CHUNK); > > - key->type = GRUB_BTRFS_ITEM_TYPE_DIR_ITEM; > > - key->offset = 0; > > + if (data->fs_tree) > > + { > > + *type = GRUB_BTRFS_DIR_ITEM_TYPE_DIRECTORY; > > + *tree = data->fs_tree; > > + /* This is a tree root, so everything starts at > > objectid 256 */ > > + key->object_id = grub_cpu_to_le64_compile_time > > (GRUB_BTRFS_OBJECT_ID_CHUNK); > > + key->type = GRUB_BTRFS_ITEM_TYPE_DIR_ITEM; > > + key->offset = 0; > > + } > > + else > > + { > > + *type = GRUB_BTRFS_DIR_ITEM_TYPE_DIRECTORY; > > + *tree = data->sblock.root_tree; > > + key->object_id = data->sblock.root_dir_objectid; > > + key->type = GRUB_BTRFS_ITEM_TYPE_DIR_ITEM; > > + key->offset = 0; > > + follow_default = 1; > > + } > > } > > else > > { > > @@ -2922,6 +2966,7 @@ GRUB_MOD_INIT (btrfs) > > subvolid_set_env); > > grub_env_export ("btrfs_subvol"); > > grub_env_export ("btrfs_subvolid"); > > + grub_env_export ("btrfs_relative_path"); > > } > > > > GRUB_MOD_FINI (btrfs) > > -- > > 2.46.2 > > > > > > _______________________________________________ > > Grub-devel mailing list > > Grub-devel@gnu.org > > https://lists.gnu.org/mailman/listinfo/grub-devel > > > > -- > 真実はいつも一つ!/ Always, there's only one truth! _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel