All of lore.kernel.org
 help / color / mirror / Atom feed
From: Avnish Chouhan <avnish@linux.ibm.com>
To: Daniel Kiper <dkiper@net-space.pl>
Cc: grub-devel@gnu.org, brking@linux.ibm.com, meghanaprakash@in.ibm.com
Subject: Re: [PATCH v2] ieee1275: support added for multiple nvme bootpaths
Date: Wed, 28 May 2025 16:50:00 +0530	[thread overview]
Message-ID: <edf8e532f0fde0b07e915f3b1cdc04cd@linux.ibm.com> (raw)
In-Reply-To: <20250526193053.7vk2abhrzvwhd5bv@tomti.i.net-space.pl>

Hi Daniel,

Thank you so much for a review!

On 2025-05-27 01:00, Daniel Kiper wrote:
> On Mon, May 19, 2025 at 04:34:34PM +0530, Avnish Chouhan wrote:
>> This patch sets mupltiple NVMe boot-devices for more robust boot.
>> Scenario where NVMe multipaths are available, all the available 
>> bootpaths (Max 5)
>> will be added as the boot-device.
>> 
>> Signed-off-by: Avnish Chouhan <avnish@linux.ibm.com>
>> ---
>>  grub-core/osdep/unix/platform.c | 114 
>> ++++++++++++++++++++++++++++++++++++++++++++++++++++-
>>  grub-core/osdep/linux/ofpath.c  |   6 +++---
>>  include/grub/util/install.h     |   3 +++
>>  include/grub/util/ofpath.h      |   4 ++++
>>  4 files changed, 123 insertions(+), 4 deletion(-)
>> 
>> diff --git a/grub-core/osdep/unix/platform.c 
>> b/grub-core/osdep/unix/platform.c
>> index 55b8f40..124e0ed 100644
>> --- a/grub-core/osdep/unix/platform.c
>> +++ b/grub-core/osdep/unix/platform.c
>> @@ -28,6 +28,8 @@
>>  #include <dirent.h>
>>  #include <string.h>
>>  #include <errno.h>
>> +#include <grub/util/ofpath.h>
> 
> Please add empty line here.

Sure!

> 
>> +#define BOOTDEV_BUFFER  1000
>> 
>>  static char *
>>  get_ofpathname (const char *dev)
>> @@ -176,6 +178,105 @@ grub_install_register_efi (grub_device_t 
>> efidir_grub_dev,
>>    return ret;
>>  }
>> 
>> +
>> +char *
>> +add_multiple_nvme_bootdevices (const char *install_device)
>> +{
>> +  char *sysfs_path, *nvme_ns, *ptr, *non_splitter_path;
>> +  unsigned int nsid;
>> +  char *multipath_boot, *ofpath, *ext_dir;
>> +  struct dirent *ep, *splitter_ep;
>> +  DIR *dp, *splitter_dp;
>> +  char *cntl_id, *dirR1, *dirR2, *splitter_info_path;
>> +  int is_FC = 0, is_splitter = 0;
> 
> Please use bool type here.

Sure!

> 
>> +  nvme_ns = grub_strstr (install_device, "nvme");
> 
> grub_strstr() may return NULL. If it is not possible here then it 
> should
> be explained.
> 

NULL check not required here as this function works only on 
install_device as "/dev/nvme3n1p1". I'll add the comment in the next 
version!

>> +  nsid = of_path_get_nvme_nsid (nvme_ns);
>> +  if (nsid == 0)
>> +    return NULL;
>> +
>> +  sysfs_path = nvme_get_syspath (nvme_ns);
>> +  ofpath = xasprintf ("%s",get_ofpathname (nvme_ns));
> 
> Missing space after ",".

Sure, I'll add a space after ','.

> 
>> +  if (grub_strstr (ofpath, "fibre-channel"))
>> +    {
>> +      strcat (sysfs_path, "/device");
>> +      is_FC = 1;
>> +    }
>> +  else
>> +    {
>> +      strcat (sysfs_path, "/subsystem");
>> +      is_FC = 0;
>> +    }
>> +  if (is_FC == 0)
>> +    {
>> +      cntl_id = grub_strstr (nvme_ns, "e");
> 
> Again, missing NULL check and s/grub_strstr/grub_strchr/...
> 

NULL check not required as explained above. I'll change grub_strstr to 
grub_strchr.

>> +      dirR1 = xasprintf ("nvme%c",cntl_id[1]);
>> +
>> +      splitter_info_path = xasprintf ("%s%s%s", "/sys/block/", 
>> nvme_ns, "/device");
> 
> ... xasprintf ("/sys/block/%s/device", nvme_ns);
> 

Sure!

>> +      splitter_dp = opendir (splitter_info_path);
>> +      if (!splitter_dp)
>> +        return NULL;
>> +
>> +      while ((splitter_ep = readdir (splitter_dp)) != NULL)
>> +        {
>> +          if (grub_strstr (splitter_ep->d_name, "nvme"))
>> +	     {
>> +	       if (grub_strstr (splitter_ep->d_name, dirR1))
>> +	         continue;
>> +
>> +              ext_dir = grub_strstr (splitter_ep->d_name, "e");
> 
> s/grub_strstr/grub_strchr/
> 

Sure!

> Missing NULL check too...
> 

Not required as the check above "if (grub_strstr (splitter_ep->d_name, 
"nvme"))".

>> +              if (!(grub_strstr (ext_dir, "n")))
> 
> s/grub_strstr/grub_strchr/
> 

Sure, I'll change this!

> grub_strchr (ext_dir, 'n') == NULL
> 
>> +	         {
>> +                  dirR2 = xasprintf("%s", splitter_ep->d_name);
> 
> Something is off with indention...

Sure, I'll check and correct this!

> 
>> +	           is_splitter = 1;
>> +	           break;
>> +	         }
>> +	    }
>> +        }
>> +      closedir (splitter_dp);
>> +    }
>> +  sysfs_path = xrealpath (sysfs_path);
>> +  dp = opendir (sysfs_path);
>> +  if (!dp)
>> +    return NULL;
>> +
>> +  ptr = multipath_boot = xmalloc (BOOTDEV_BUFFER);
>> +  if (is_splitter == 0 && is_FC == 0)
>> +    {
>> +      non_splitter_path = xasprintf ("%s%s%x:1 ", get_ofpathname 
>> (dirR1), "/namespace@", nsid);
> 
> ... xasprintf ("%s/namespace@%x:1 ", get_ofpathname (dirR1), nsid);
> 
>> +      strncpy (ptr, non_splitter_path, strlen (non_splitter_path));
>> +      ptr += strlen (non_splitter_path);
>> +      free (non_splitter_path);
>> +    }
>> +  else
>> +    {
>> +      while ((ep = readdir (dp)) != NULL)
>> +        {
>> +          char *path;
> 
> Please add empty line here...
> 

Sure.

>> +          if (grub_strstr (ep->d_name, "nvme"))
> 
> grub_strstr (ep->d_name, "nvme") != NULL
> 
>> +            {
>> +              if (is_FC == 0 && !grub_strstr (ep->d_name, dirR1) && 
>> !grub_strstr (ep->d_name, dirR2))
> 
> ... grub_strstr (ep->d_name, dirR1) == NULL && grub_strstr
> (ep->d_name, dirR2) == NULL ...
> 
>> +                continue;
>> +              path = xasprintf ("%s%s%x ", get_ofpathname 
>> (ep->d_name), "/namespace@", nsid);
> 
> ... xasprintf ("%s/namespace@%x:1 ", get_ofpathname (ep->d_name), 
> nsid);
> 

I'll change as suggested here and in other places too!

>> +              if ((strlen (multipath_boot) + strlen (path)) > 
>> BOOTDEV_BUFFER)
>> +                {
>> +                  grub_util_warn (_("Maximum five entries are allowed 
>> in the bootlist"));
>> +                  free (path);
>> +                  break;
>> +                }
>> +              strncpy (ptr, path, strlen (path));
>> +              ptr += strlen (path);
>> +              free (path);
>> +            }
>> +        }
>> +    }
>> +  *--ptr = '\0';
>> +  closedir (dp);
>> +
>> +  return multipath_boot;
>> +}
>> +
>>  void
>>  grub_install_register_ieee1275 (int is_prep, const char 
>> *install_device,
>>  				int partno, const char *relpath)
>> @@ -215,8 +316,19 @@ grub_install_register_ieee1275 (int is_prep, 
>> const char *install_device,
>>  	}
>>        *ptr = '\0';
>>      }
>> +  else if (grub_strstr (install_device, "nvme"))
>> +    {
>> +      boot_device = add_multiple_nvme_bootdevices (install_device);
>> +    }
>>    else
>> -    boot_device = get_ofpathname (install_device);
>> +    {
>> +      boot_device = get_ofpathname (install_device);
>> +      if (grub_strstr (boot_device, "nvme-of"))
>> +        {
>> +          free (boot_device);
>> +          boot_device = add_multiple_nvme_bootdevices 
>> (install_device);
>> +        }
>> +    }
>> 
>>    if (grub_util_exec ((const char * []){ "nvsetenv", "boot-device",
>>  	  boot_device, NULL }))
>> diff --git a/grub-core/osdep/linux/ofpath.c 
>> b/grub-core/osdep/linux/ofpath.c
>> index 7158c8c..48f11c9 100644
>> --- a/grub-core/osdep/linux/ofpath.c
>> +++ b/grub-core/osdep/linux/ofpath.c
>> @@ -209,7 +209,7 @@ find_obppath (const char *sysfs_path_orig)
>>      }
>>  }
>> 
>> -static char *
>> +char *
>>  xrealpath (const char *in)
>>  {
>>    char *out;
>> @@ -224,7 +224,7 @@ xrealpath (const char *in)
>>    return out;
>>  }
>> 
>> -static char *
>> +char *
> 
> You do not need this change.
> 

We need this function as this is used by the function 
"of_path_get_nvme_nsid" we are using.


>>  block_device_get_sysfs_path_and_link(const char *devicenode)
>>  {
>>    char *rpath;
>> @@ -684,7 +684,7 @@ of_path_get_nvme_nsid (const char* devname)
>>    return nsid;
>>  }
>> 
>> -static char *
>> +char *
>>  nvme_get_syspath (const char *nvmedev)
>>  {
>>    char *sysfs_path;
>> diff --git a/include/grub/util/install.h b/include/grub/util/install.h
>> index 51f3b13..a67e225 100644
>> --- a/include/grub/util/install.h
>> +++ b/include/grub/util/install.h
>> @@ -235,6 +235,9 @@ grub_install_register_efi (grub_device_t 
>> efidir_grub_dev,
>>  			   const char *efifile_path,
>>  			   const char *efi_distributor);
>> 
>> +char *
>> +add_multiple_nvme_bootdevices (const char *install_device);
>> +
>>  void
>>  grub_install_register_ieee1275 (int is_prep, const char 
>> *install_device,
>>  				int partno, const char *relpath);
>> diff --git a/include/grub/util/ofpath.h b/include/grub/util/ofpath.h
>> index 5962322..78e78e7 100644
>> --- a/include/grub/util/ofpath.h
>> +++ b/include/grub/util/ofpath.h
>> @@ -30,5 +30,9 @@ int add_filename_to_pile (char *filename, struct 
>> ofpath_files_list_root* root);
>>  void find_file (char* filename, char* directory, struct 
>> ofpath_files_list_root* root, int max_depth, int depth);
>>  char* of_find_fc_host (char* host_wwpn);
>>  void free_ofpath_files_list (struct ofpath_files_list_root* root);
>> +char* nvme_get_syspath (const char *nvmedev);
>> +char* block_device_get_sysfs_path_and_link (const char *devicenode);
> 
> Please drop this declaration.
> 

Same as explained above!


> Daniel

Regards,
Avnish Chouhan

_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

  reply	other threads:[~2025-05-28 11:20 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-05-19 11:04 [PATCH v2] ieee1275: support added for multiple nvme bootpaths Avnish Chouhan
2025-05-26 19:30 ` Daniel Kiper
2025-05-28 11:20   ` Avnish Chouhan [this message]
2025-05-28 17:56     ` Daniel Kiper
2025-05-29  6:29       ` Avnish Chouhan
2025-05-29 16:22         ` Daniel Kiper
2025-06-03  6:03           ` Avnish Chouhan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=edf8e532f0fde0b07e915f3b1cdc04cd@linux.ibm.com \
    --to=avnish@linux.ibm.com \
    --cc=brking@linux.ibm.com \
    --cc=dkiper@net-space.pl \
    --cc=grub-devel@gnu.org \
    --cc=meghanaprakash@in.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.