| From 575b6158e46e27aab24680a4f5b3c0c2cb3b0052 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 21 Jul 2021 15:39:44 +0300 |
| Subject: ionic: cleanly release devlink instance |
| |
| From: Leon Romanovsky <leonro@nvidia.com> |
| |
| [ Upstream commit c2255ff47768c94a0ebc3968f007928bb47ea43b ] |
| |
| The failure to register devlink will leave the system with dangled |
| devlink resource, which is not cleaned if devlink_port_register() fails. |
| |
| In order to remove access to ".registered" field of struct devlink_port, |
| require both devlink_register and devlink_port_register to success and |
| check it through device pointer. |
| |
| Fixes: fbfb8031533c ("ionic: Add hardware init and device commands") |
| Reviewed-by: Moshe Shemesh <moshe@nvidia.com> |
| Signed-off-by: Leon Romanovsky <leonro@nvidia.com> |
| Acked-by: Shannon Nelson <snelson@pensando.io> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| .../net/ethernet/pensando/ionic/ionic_devlink.c | 14 +++++++------- |
| 1 file changed, 7 insertions(+), 7 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/pensando/ionic/ionic_devlink.c b/drivers/net/ethernet/pensando/ionic/ionic_devlink.c |
| index b41301a5b0df..cd520e4c5522 100644 |
| --- a/drivers/net/ethernet/pensando/ionic/ionic_devlink.c |
| +++ b/drivers/net/ethernet/pensando/ionic/ionic_devlink.c |
| @@ -91,20 +91,20 @@ int ionic_devlink_register(struct ionic *ionic) |
| attrs.flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL; |
| devlink_port_attrs_set(&ionic->dl_port, &attrs); |
| err = devlink_port_register(dl, &ionic->dl_port, 0); |
| - if (err) |
| + if (err) { |
| dev_err(ionic->dev, "devlink_port_register failed: %d\n", err); |
| - else |
| - devlink_port_type_eth_set(&ionic->dl_port, |
| - ionic->lif->netdev); |
| + devlink_unregister(dl); |
| + return err; |
| + } |
| |
| - return err; |
| + devlink_port_type_eth_set(&ionic->dl_port, ionic->lif->netdev); |
| + return 0; |
| } |
| |
| void ionic_devlink_unregister(struct ionic *ionic) |
| { |
| struct devlink *dl = priv_to_devlink(ionic); |
| |
| - if (ionic->dl_port.registered) |
| - devlink_port_unregister(&ionic->dl_port); |
| + devlink_port_unregister(&ionic->dl_port); |
| devlink_unregister(dl); |
| } |
| -- |
| 2.30.2 |
| |