> On Dec 18, 2017, at 8:22 AM, Daniel Kiper <daniel.ki...@oracle.com> wrote:
> 
> On Wed, Dec 06, 2017 at 03:53:30PM -0800, Eric Snowberg wrote:
>> Fix the Open Firmware (OF) path property for sun4v SPARC systems.
>> These platforms do not have a /sas/ within their path.  Over time
>> different OF addressing schemes have been supported. There
>> is no generic addressing scheme that works across every HBA.
>> 
>> Signed-off-by: Eric Snowberg <eric.snowb...@oracle.com>
>> ---
>> grub-core/osdep/linux/ofpath.c | 147 
>> ++++++++++++++++++++++++++++++++++++++++-
>> 1 file changed, 144 insertions(+), 3 deletions(-)
>> 
>> diff --git a/grub-core/osdep/linux/ofpath.c b/grub-core/osdep/linux/ofpath.c
>> index 3a8bc95a9..525a42ae6 100644
>> --- a/grub-core/osdep/linux/ofpath.c
>> +++ b/grub-core/osdep/linux/ofpath.c
>> @@ -38,6 +38,44 @@
>> #include <errno.h>
>> #include <ctype.h>
>> 
>> +#ifdef __sparc__
> 
> This is not good. It will not work if you cross compile.

What error do you see on a cross compile?  I see __sparc__ used throughout the 
code.

> 
>> +typedef enum
>> +  {
>> +    GRUB_OFPATH_SPARC_WWN_ADDR = 1,
>> +    GRUB_OFPATH_SPARC_TGT_LUN,
>> +  } ofpath_sparc_addressing;
>> +
>> +struct ofpath_sparc_hba
>> +{
>> +  grub_uint32_t device_id;
>> +  ofpath_sparc_addressing addressing;
>> +};
>> +
>> +static struct ofpath_sparc_hba sparc_lsi_hba[] = {
>> +  /* Rhea, Jasper 320, LSI53C1020/1030.  */
> 
> Extra space after ".”.

I’ll take care of all the extra space changes in V2.

> 
>> +  {0x30, GRUB_OFPATH_SPARC_TGT_LUN},
>> +  /* SAS-1068E.  */
> 
> Ditto and below...
> 
>> +  {0x50, GRUB_OFPATH_SPARC_TGT_LUN},
>> +  /* SAS-1064E.  */
>> +  {0x56, GRUB_OFPATH_SPARC_TGT_LUN},
>> +  /* Pandora SAS-1068E.  */
>> +  {0x58, GRUB_OFPATH_SPARC_TGT_LUN},
>> +  /* Aspen, Invader, LSI SAS-3108.  */
>> +  {0x5d, GRUB_OFPATH_SPARC_TGT_LUN},
>> +  /* Niwot, SAS 2108.  */
>> +  {0x79, GRUB_OFPATH_SPARC_TGT_LUN},
>> +  /* Erie, Falcon, LSI SAS 2008.  */
>> +  {0x72, GRUB_OFPATH_SPARC_WWN_ADDR},
>> +  /* LSI WarpDrive 6203.  */
>> +  {0x7e, GRUB_OFPATH_SPARC_WWN_ADDR},
>> +  /* LSI SAS 2308.  */
>> +  {0x87, GRUB_OFPATH_SPARC_WWN_ADDR},
>> +  /* LSI SAS 3008.  */
>> +  {0x97, GRUB_OFPATH_SPARC_WWN_ADDR},
>> +  {0, 0}
>> +};
>> +#endif
>> +
>> #ifdef OFPATH_STANDALONE
>> #define xmalloc malloc
>> void
>> @@ -337,6 +375,66 @@ vendor_is_ATA(const char *path)
>>   return (memcmp(bufcont, "ATA", 3) == 0);
>> }
>> 
>> +#ifdef __sparc__
> 
> Ditto.
> 
>> +static void
>> +check_hba_identifiers (const char *sysfs_path, int *vendor, int *device_id)
>> +{
>> +  char *ed = strstr (sysfs_path, "host");
>> +  size_t path_size;
>> +  char *p = NULL, *path = NULL;
> 
> I think that you do not need to initialize *p here.

I’ll remove the initialization. 

> 
>> +  char buf[8];
>> +  int fd;
>> +
>> +  if (!ed)
>> +    return;
>> +
>> +  p = xstrdup (sysfs_path);
> 
> Why do you need to duplicate sysfs_path?
> I do not think it is needed. Just p = sysfs_path?

This is duplicated since the result of p is modified ...

> 
>> +  ed = strstr (p, "host");
>> +
>> +  if (!ed)
>> +    goto out;
>> +
>> +  *ed = '\0’;

right here.  If I didn’t duplicate the string, it would corrupt the sysfs_path. 
Also, sysfs_path is defined as const char *.

>> +
>> +  path_size = (strlen (p) + sizeof ("vendor"));
>> +  path = xmalloc (path_size);
>> +
>> +  if (!path)
>> +    goto out;
>> +
>> +  snprintf (path, path_size, "%svendor", p);
>> +  fd = open (path, O_RDONLY);
>> +
>> +  if (fd < 0)
>> +    goto out;
>> +
>> +  memset (buf, 0, sizeof (buf));
>> +
>> +  if (read (fd, buf, sizeof (buf) - 1) < 0)
>> +    goto out;
>> +
>> +  close (fd);
>> +  sscanf (buf, "%x", vendor);
> 
> Please add empty line here.
> 
>> +  snprintf (path, path_size, "%sdevice", p);
> 
> I have a feeling that p should be changed somehow here
> or to be precise a bit earlier... Should not it?

It is being changed above?  *ed is a pointer within it.

> 
>> +  fd = open (path, O_RDONLY);
>> +
>> +  if (fd < 0)
>> +    goto out;
>> +
>> +  memset (buf, 0, sizeof (buf));
>> +
>> +  if (read (fd, buf, sizeof (buf) - 1) < 0)
>> +    goto out;
>> +
>> +  close (fd);
>> +  sscanf (buf, "%x", device_id);
>> +
>> +out:
> 
> err:? And please add one extra space before the label.
> 
>> +  free (path);
>> +  free (p);
>> +}
>> +#endif
>> +
>> static void
>> check_sas (const char *sysfs_path, int *tgt, unsigned long int *sas_address)
>> {
>> @@ -398,7 +496,7 @@ of_path_of_scsi(const char *sys_devname 
>> __attribute__((unused)), const char *dev
>> {
>>   const char *p, *digit_string, *disk_name;
>>   int host, bus, tgt, lun;
>> -  unsigned long int sas_address;
>> +  unsigned long int sas_address = 0;
>>   char *sysfs_path, disk[MAX_DISK_CAT - sizeof ("/fp@0,0")];
>>   char *of_path;
>> 
>> @@ -415,9 +513,11 @@ of_path_of_scsi(const char *sys_devname 
>> __attribute__((unused)), const char *dev
>>     }
>> 
>>   of_path = find_obppath(sysfs_path);
>> -  free (sysfs_path);
>>   if (!of_path)
>> -    return NULL;
> 
> goto err:
> 
>> +    {
>> +      free (sysfs_path);
>> +      return NULL;
>> +    }
> 
> Drop this change.
> 
>> 
>>   if (strstr (of_path, "qlc"))
>>     strcat (of_path, "/fp@0,0");
>> @@ -446,6 +546,45 @@ of_path_of_scsi(const char *sys_devname 
>> __attribute__((unused)), const char *dev
>>     }
>>   else
>>     {
>> +#ifdef __sparc__
> 
> Ditto.
> 
>> +      ofpath_sparc_addressing addressing = GRUB_OFPATH_SPARC_TGT_LUN;
>> +      int vendor = 0, device_id = 0;
>> +      char *optr = disk;
>> +
>> +      check_hba_identifiers (sysfs_path, &vendor, &device_id);
>> +
>> +      /* LSI Logic Vendor ID */
>> +      if (vendor == 0x1000)
> 
> Could you define a constant?
> 
>> +        {
>> +          struct ofpath_sparc_hba *lsi_hba;
>> +
>> +          /* Over time different OF addressing schemes have been supported.
>> +             There is no generic addressing scheme that works across
>> +             every HBA. */
>> +          for (lsi_hba = sparc_lsi_hba; lsi_hba->device_id; lsi_hba++)
>> +            if (lsi_hba->device_id == device_id)
>> +              {
>> +                addressing = lsi_hba->addressing;
>> +                break;
>> +              }
>> +        }
>> +
>> +      if (addressing == GRUB_OFPATH_SPARC_WWN_ADDR)
>> +        optr += snprintf (disk, sizeof (disk), "/%s@w%lx,%x", disk_name,
>> +                          sas_address, lun);
>> +      else
>> +        optr += snprintf (disk, sizeof (disk), "/%s@%x,%x", disk_name, tgt,
>> +                          lun);
>> +
>> +      if (*digit_string != '\0')
>> +        {
>> +          int part;
>> +
>> +          sscanf (digit_string, "%d", &part);
>> +          snprintf (optr, sizeof (disk) - (optr - disk - 1), ":%c", 'a'
>> +                    + (part - 1));
>> +        }
>> +#else
>>       if (lun == 0)
>>         {
>>           int sas_id = 0;
>> @@ -493,7 +632,9 @@ of_path_of_scsi(const char *sys_devname 
>> __attribute__((unused)), const char *dev
>>             }
>>        free (lunstr);
>>         }
>> +#endif
>>     }
>> +  free (sysfs_path);
> 
> Drop this change.
> 
>>   strcat(of_path, disk);
> 
> err:
>  free (sysfs_path);

I’ll make these goto changes.

> 
>>   return of_path;
>> }
> 
> In general I am not happy with sscanf() usage as a string to number
> converter. Especially without any error checking. However, as I can
> see, it is common here. So, I will accept fixed patch with sscanf()
> eventually but I would be happy if you replace it everywhere with
> something more robust in separate patch.
> 

I could look at doing that in the future. I always try to follow the coding 
style within the file.



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

Reply via email to