diff mbox series

[ethtool] ethtool: do_sset return correct value on fail

Message ID 20201213142503.25509-1-tariqt@nvidia.com (mailing list archive)
State Changes Requested
Delegated to: Michal Kubecek
Headers show
Series [ethtool] ethtool: do_sset return correct value on fail | expand

Checks

Context Check Description
netdev/tree_selection success Not a local patch

Commit Message

Tariq Toukan Dec. 13, 2020, 2:25 p.m. UTC
From: Roy Novich <royno@nvidia.com>

The return value for do_sset was constant and returned 0.
This value is misleading when returned on operation failure.
Changed return value to the correct function err status.

Fixes: 32c8037055f5 ("Initial import of ethtool version 3 + a few patches.")
Signed-off-by: Roy Novich <royno@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
---
 ethtool.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Michal Kubecek Dec. 14, 2020, 8:35 a.m. UTC | #1
On Sun, Dec 13, 2020 at 04:25:03PM +0200, Tariq Toukan wrote:
> From: Roy Novich <royno@nvidia.com>
> 
> The return value for do_sset was constant and returned 0.
> This value is misleading when returned on operation failure.
> Changed return value to the correct function err status.
> 
> Fixes: 32c8037055f5 ("Initial import of ethtool version 3 + a few patches.")
> Signed-off-by: Roy Novich <royno@nvidia.com>
> Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
> ---
>  ethtool.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/ethtool.c b/ethtool.c
> index 1d9067e774af..5cc875c64591 100644
> --- a/ethtool.c
> +++ b/ethtool.c
> @@ -3287,7 +3287,7 @@ static int do_sset(struct cmd_context *ctx)
>  		}
>  	}
>  
> -	return 0;
> +	return err;
>  }
>  
>  static int do_gregs(struct cmd_context *ctx)

I'm afraid it's not as easy as this. The problem with -s/--set
subcommand is that its parameters are in fact implemented by three
separate requests (for ioctl, four requests for netlink). Each of them
may fail or succeed independently of others. Currently do_sset() always
returns 0 which is indeed unfortunate but it's not clear what should we
return if some requests fail and some succeed.

With your patch, do_sset() would always return the result of last
request it sent to kernel which is inconsistent; consider e.g.

  ethtool -s eth0 mdix on wol g

If the ETHTOOL_SLINKSETTINGS request setting MDI-X succeeds and
ETHTOOL_SWOL setting WoL fails, the result would be a failure. But if
setting MDI-X fails and setting WoL succeeds, do_sset() would report
success.

So if we really want to change the behaviour after so many years, it
should be consistent: either return non-zero exit code if any request
fails or if all fail. (Personally, I would prefer the latter.) And we
should probably modify nl_sset() to behave the same way as it currently
bails out on first failed request.

Michal
diff mbox series

Patch

diff --git a/ethtool.c b/ethtool.c
index 1d9067e774af..5cc875c64591 100644
--- a/ethtool.c
+++ b/ethtool.c
@@ -3287,7 +3287,7 @@  static int do_sset(struct cmd_context *ctx)
 		}
 	}
 
-	return 0;
+	return err;
 }
 
 static int do_gregs(struct cmd_context *ctx)