2 problems:
* How does dm device ends up on ofpathname? It should be handled by grub
internal logic in most cases and not end up in of-specific paths
* Why not use existing devmapper functions already present in codebase?

Le jeu. 6 juin 2024, 14:40, Avnish Chouhan <avn...@linux.ibm.com> a écrit :

> This patch enables the device mapper discovery on ofpath.c. Currently,
> when we are dealing with a device like /dev/dm-* the ofpath returns null
> since there is no function implemented to handle this case.
>
> This patch implements a function that will look into /sys/block/dm-*
> devices and search recursively inside slaves directory to find the root
> disk.
>
> Signed-off-by: Diego Domingos <dieg...@br.ibm.com>
> Signed-off-by: Avnish Chouhan <avn...@linux.ibm.com>
> ---
>  grub-core/osdep/linux/ofpath.c | 64
> +++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 63 insertions(+), 1 deletion(-)
>
> diff --git a/grub-core/osdep/linux/ofpath.c
> b/grub-core/osdep/linux/ofpath.c
> index 0f5d54e9f2d..cc849d9c94c 100644
> --- a/grub-core/osdep/linux/ofpath.c
> +++ b/grub-core/osdep/linux/ofpath.c
> @@ -37,6 +37,7 @@
>  #include <fcntl.h>
>  #include <errno.h>
>  #include <ctype.h>
> +#include <dirent.h>
>
>  #ifdef __sparc__
>  typedef enum
> @@ -755,13 +756,74 @@ strip_trailing_digits (const char *p)
>    return new;
>  }
>
> +static char *
> +get_slave_from_dm (const char * device)
> +{
> +  char *curr_device, *tmp;
> +  char *directory;
> +  char *ret = NULL;
> +  directory = grub_strdup (device);
> +  tmp = get_basename (directory);
> +  curr_device = grub_strdup (tmp);
> +  *tmp = '\0';
> +
> +  /* Recursively check for slaves devices so we can find the root device
> */
> +  while ((curr_device[0] == 'd') && (curr_device[1] == 'm') &&
> (curr_device[2] == '-'))
> +    {
> +      DIR *dp;
> +      struct dirent *ep;
> +      char* device_path;
> +      device_path = grub_xasprintf ("/sys/block/%s/slaves", curr_device);
> +      dp = opendir (device_path);
> +
> +      if (dp != NULL)
> +        {
> +          ep = readdir (dp);
> +
> +          while (ep != NULL)
> +            {
> +              /* avoid some system directories */
> +              if (!strcmp(ep->d_name,"."))
> +                goto next_dir;
> +              if (!strcmp(ep->d_name,".."))
> +                goto next_dir;
> +
> +              free (curr_device);
> +              free (ret);
> +              curr_device = grub_strdup (ep->d_name);
> +              ret = grub_xasprintf ("%s%s", directory, curr_device);
> +              break;
> +
> +              next_dir:
> +              ep = readdir (dp);
> +              continue;
> +            }
> +          closedir (dp);
> +        }
> +      else
> +        grub_util_warn (_("cannot open directory `%s'"), device_path);
> +      free (device_path);
> +    }
> +  free (directory);
> +  free (curr_device);
> +
> +  return ret;
> +}
> +
>  char *
>  grub_util_devname_to_ofpath (const char *sys_devname)
>  {
> -  char *name_buf, *device, *devnode, *devicenode, *ofpath;
> +  char *name_buf, *device, *devnode, *devicenode, *ofpath, *realname;
>
>    name_buf = xrealpath (sys_devname);
>
> +  realname = get_slave_from_dm (name_buf);
> +  if (realname)
> +    {
> +      free (name_buf);
> +      name_buf = realname;
> +    }
> +
>    device = get_basename (name_buf);
>    devnode = strip_trailing_digits (name_buf);
>    devicenode = strip_trailing_digits (device);
>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> https://lists.gnu.org/mailman/listinfo/grub-devel
>
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to