On 9/8/20 10:50 PM, Parav Pandit wrote:
> $ devlink port show pci/0000:06:00.0/2
> pci/0000:06:00.0/2: type eth netdev ens2f0c1pf0vf1 flavour pcivf controller 1 
> pfnum 0 vfnum 1 external true splittable false
>   function:
>     hw_addr 00:00:00:00:00:00
> 
> $ devlink port show pci/0000:06:00.0/2 -jp
> {
>     "port": {
>         "pci/0000:06:00.0/2": {
>             "type": "eth",
>             "netdev": "ens2f0c1pf0vf1",

That strlen is 14 chars. Any 2 ids go to a second digit and you overrrun
the IFNAMSZ which means ...

> diff --git a/net/core/devlink.c b/net/core/devlink.c
> index 9cf5b118253b..91c12612f2b7 100644
> --- a/net/core/devlink.c
> +++ b/net/core/devlink.c
> @@ -7793,9 +7793,23 @@ static int __devlink_port_phys_port_name_get(struct 
> devlink_port *devlink_port,
>               WARN_ON(1);
>               return -EINVAL;
>       case DEVLINK_PORT_FLAVOUR_PCI_PF:
> +             if (attrs->pci_pf.external) {
> +                     n = snprintf(name, len, "c%u", 
> attrs->pci_pf.controller);
> +                     if (n >= len)
> +                             return -EINVAL;

...  this function returns EINVAL which is going to be confusing to users.

> +                     len -= n;
> +                     name += n;
> +             }
>               n = snprintf(name, len, "pf%u", attrs->pci_pf.pf);
>               break;
>       case DEVLINK_PORT_FLAVOUR_PCI_VF:
> +             if (attrs->pci_vf.external) {
> +                     n = snprintf(name, len, "c%u", 
> attrs->pci_vf.controller);
> +                     if (n >= len)
> +                             return -EINVAL;
> +                     len -= n;
> +                     name += n;
> +             }
>               n = snprintf(name, len, "pf%uvf%u",
>                            attrs->pci_vf.pf, attrs->pci_vf.vf);
>               break;
> 

Reply via email to