diff mbox series

[net,v3,1/2] rtnetlink: allow to set iface down before enslaving it

Message ID 20240104164300.3870209-2-nicolas.dichtel@6wind.com (mailing list archive)
State Superseded
Delegated to: Netdev Maintainers
Headers show
Series rtnetlink: allow to enslave with one msg an up interface | expand

Checks

Context Check Description
netdev/series_format success Posting correctly formatted
netdev/tree_selection success Clearly marked for net
netdev/ynl success SINGLE THREAD; Generated files up to date; no warnings/errors; no diff in generated;
netdev/fixes_present success Fixes tag present in non-next series
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 1115 this patch: 1115
netdev/cc_maintainers warning 2 maintainers not CCed: idosch@nvidia.com lucien.xin@gmail.com
netdev/build_clang success Errors and warnings before: 1141 this patch: 1141
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/deprecated_api success None detected
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success Fixes tag looks correct
netdev/build_allmodconfig_warn success Errors and warnings before: 1142 this patch: 1142
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 14 lines checked
netdev/build_clang_rust success No Rust files in patch. Skipping build
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

Nicolas Dichtel Jan. 4, 2024, 4:42 p.m. UTC
The below commit adds support for:
> ip link set dummy0 down
> ip link set dummy0 master bond0 up

but breaks the opposite:
> ip link set dummy0 up
> ip link set dummy0 master bond0 down

Let's add a workaround to have both commands working.

Cc: stable@vger.kernel.org
Fixes: a4abfa627c38 ("net: rtnetlink: Enslave device before bringing it up")
Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
Acked-by: Phil Sutter <phil@nwl.cc>
Reviewed-by: David Ahern <dsahern@kernel.org>
---
 net/core/rtnetlink.c | 8 ++++++++
 1 file changed, 8 insertions(+)

Comments

Jiri Pirko Jan. 5, 2024, 11:59 a.m. UTC | #1
Thu, Jan 04, 2024 at 05:42:59PM CET, nicolas.dichtel@6wind.com wrote:
>The below commit adds support for:
>> ip link set dummy0 down
>> ip link set dummy0 master bond0 up
>
>but breaks the opposite:
>> ip link set dummy0 up
>> ip link set dummy0 master bond0 down

It is a bit weird to see these 2 and assume some ordering.
The first one assumes:
dummy0 master bond 0, dummy0 up
The second one assumes:
dummy0 down, dummy0 master bond 0
But why?

What is the practival reason for a4abfa627c38 existence? I mean,
bond/team bring up the device themselfs when needed. Phil?
Wouldn't simple revert do better job here?


>
>Let's add a workaround to have both commands working.
>
>Cc: stable@vger.kernel.org
>Fixes: a4abfa627c38 ("net: rtnetlink: Enslave device before bringing it up")
>Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
>Acked-by: Phil Sutter <phil@nwl.cc>
>Reviewed-by: David Ahern <dsahern@kernel.org>
>---
> net/core/rtnetlink.c | 8 ++++++++
> 1 file changed, 8 insertions(+)
>
>diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
>index e8431c6c8490..dd79693c2d91 100644
>--- a/net/core/rtnetlink.c
>+++ b/net/core/rtnetlink.c
>@@ -2905,6 +2905,14 @@ static int do_setlink(const struct sk_buff *skb,
> 		call_netdevice_notifiers(NETDEV_CHANGEADDR, dev);
> 	}
> 
>+	/* Backward compat: enable to set interface down before enslaving it */
>+	if (!(ifm->ifi_flags & IFF_UP) && ifm->ifi_change & IFF_UP) {
>+		err = dev_change_flags(dev, rtnl_dev_combine_flags(dev, ifm),
>+				       extack);
>+		if (err < 0)
>+			goto errout;
>+	}
>+
> 	if (tb[IFLA_MASTER]) {
> 		err = do_set_master(dev, nla_get_u32(tb[IFLA_MASTER]), extack);
> 		if (err)
>-- 
>2.39.2
>
>
Nicolas Dichtel Jan. 5, 2024, 4:22 p.m. UTC | #2
Le 05/01/2024 à 12:59, Jiri Pirko a écrit :
> Thu, Jan 04, 2024 at 05:42:59PM CET, nicolas.dichtel@6wind.com wrote:
>> The below commit adds support for:
>>> ip link set dummy0 down
>>> ip link set dummy0 master bond0 up
>>
>> but breaks the opposite:
>>> ip link set dummy0 up
>>> ip link set dummy0 master bond0 down
> 
> It is a bit weird to see these 2 and assume some ordering.
> The first one assumes:
> dummy0 master bond 0, dummy0 up
> The second one assumes:
> dummy0 down, dummy0 master bond 0
> But why?
> 
> What is the practival reason for a4abfa627c38 existence? I mean,
> bond/team bring up the device themselfs when needed. Phil?
> Wouldn't simple revert do better job here?
Yeah, I assumed there was a good reason, but you're right.


> 
> 
>>
>> Let's add a workaround to have both commands working.
>>
>> Cc: stable@vger.kernel.org
>> Fixes: a4abfa627c38 ("net: rtnetlink: Enslave device before bringing it up")
>> Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
>> Acked-by: Phil Sutter <phil@nwl.cc>
>> Reviewed-by: David Ahern <dsahern@kernel.org>
>> ---
>> net/core/rtnetlink.c | 8 ++++++++
>> 1 file changed, 8 insertions(+)
>>
>> diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
>> index e8431c6c8490..dd79693c2d91 100644
>> --- a/net/core/rtnetlink.c
>> +++ b/net/core/rtnetlink.c
>> @@ -2905,6 +2905,14 @@ static int do_setlink(const struct sk_buff *skb,
>> 		call_netdevice_notifiers(NETDEV_CHANGEADDR, dev);
>> 	}
>>
>> +	/* Backward compat: enable to set interface down before enslaving it */
>> +	if (!(ifm->ifi_flags & IFF_UP) && ifm->ifi_change & IFF_UP) {
>> +		err = dev_change_flags(dev, rtnl_dev_combine_flags(dev, ifm),
>> +				       extack);
>> +		if (err < 0)
>> +			goto errout;
>> +	}
>> +
>> 	if (tb[IFLA_MASTER]) {
>> 		err = do_set_master(dev, nla_get_u32(tb[IFLA_MASTER]), extack);
>> 		if (err)
>> -- 
>> 2.39.2
>>
>>
Phil Sutter Jan. 6, 2024, 3:32 a.m. UTC | #3
Hi,

On Fri, Jan 05, 2024 at 12:59:24PM +0100, Jiri Pirko wrote:
> Thu, Jan 04, 2024 at 05:42:59PM CET, nicolas.dichtel@6wind.com wrote:
> >The below commit adds support for:
> >> ip link set dummy0 down
> >> ip link set dummy0 master bond0 up
> >
> >but breaks the opposite:
> >> ip link set dummy0 up
> >> ip link set dummy0 master bond0 down
> 
> It is a bit weird to see these 2 and assume some ordering.
> The first one assumes:
> dummy0 master bond 0, dummy0 up
> The second one assumes:
> dummy0 down, dummy0 master bond 0
> But why?
> 
> What is the practival reason for a4abfa627c38 existence? I mean,
> bond/team bring up the device themselfs when needed. Phil?
> Wouldn't simple revert do better job here?

Ah, I wasn't aware bond master manipulates slaves' links itself and thus
treated all types' link master setting the same by setting the slave up
afterwards. This is basically what a4abfa627c38 is good for: Enabling
'ip link set X master Y up' regardless of Y's link type.

If setting a bond slave up manually is not recommended, the easiest
solution is probbaly indeed to revert a4abfa627c38 and live with the
quirk in bond driver.

Cheers, Phil
Jiri Pirko Jan. 6, 2024, 11:08 a.m. UTC | #4
Sat, Jan 06, 2024 at 04:32:12AM CET, phil@nwl.cc wrote:
>Hi,
>
>On Fri, Jan 05, 2024 at 12:59:24PM +0100, Jiri Pirko wrote:
>> Thu, Jan 04, 2024 at 05:42:59PM CET, nicolas.dichtel@6wind.com wrote:
>> >The below commit adds support for:
>> >> ip link set dummy0 down
>> >> ip link set dummy0 master bond0 up
>> >
>> >but breaks the opposite:
>> >> ip link set dummy0 up
>> >> ip link set dummy0 master bond0 down
>> 
>> It is a bit weird to see these 2 and assume some ordering.
>> The first one assumes:
>> dummy0 master bond 0, dummy0 up
>> The second one assumes:
>> dummy0 down, dummy0 master bond 0
>> But why?
>> 
>> What is the practival reason for a4abfa627c38 existence? I mean,
>> bond/team bring up the device themselfs when needed. Phil?
>> Wouldn't simple revert do better job here?
>
>Ah, I wasn't aware bond master manipulates slaves' links itself and thus
>treated all types' link master setting the same by setting the slave up
>afterwards. This is basically what a4abfa627c38 is good for: Enabling
>'ip link set X master Y up' regardless of Y's link type.
>
>If setting a bond slave up manually is not recommended, the easiest
>solution is probbaly indeed to revert a4abfa627c38 and live with the
>quirk in bond driver.

Okay, lets revert then.

>
>Cheers, Phil
diff mbox series

Patch

diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index e8431c6c8490..dd79693c2d91 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -2905,6 +2905,14 @@  static int do_setlink(const struct sk_buff *skb,
 		call_netdevice_notifiers(NETDEV_CHANGEADDR, dev);
 	}
 
+	/* Backward compat: enable to set interface down before enslaving it */
+	if (!(ifm->ifi_flags & IFF_UP) && ifm->ifi_change & IFF_UP) {
+		err = dev_change_flags(dev, rtnl_dev_combine_flags(dev, ifm),
+				       extack);
+		if (err < 0)
+			goto errout;
+	}
+
 	if (tb[IFLA_MASTER]) {
 		err = do_set_master(dev, nla_get_u32(tb[IFLA_MASTER]), extack);
 		if (err)