FAILED: patch "[PATCH] batman-adv: clean untagged VLAN on netdev registration" failed to apply to 5.15-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 5.15-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-5.15.y
git checkout FETCH_HEAD
git cherry-pick -x 8669a550c752d86baebc5fdc83b8ff35c4372c0e
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026072026-trade-smoking-ea24@gregkh' --subject-prefix 'PATCH 5.15.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 8669a550c752d86baebc5fdc83b8ff35c4372c0e Mon Sep 17 00:00:00 2001
From: Sven Eckelmann <[email protected]>
Date: Sat, 4 Jul 2026 09:46:09 +0200
Subject: [PATCH] batman-adv: clean untagged VLAN on netdev registration
failure
When an mesh interface is registered, it creates an untagged struct batadv_meshif_vlan on top of it via the NETDEV_REGISTER notifier. But in this process, another receiver of this notification can veto the registration. The netdev registration will be aborted because of this veto.
The register_netdevice() call will try to clean up the net_device using unregister_netdevice_queue() - which only uses the .priv_destructor to free private resources. In this situation, .dellink will not be called.
The cleanup of the untagged batadv_meshif_vlan must thefore be done in the destructor to avoid a leak of this object.
net/batman-adv/main.c +8 -0
@@ -259,6 +259,7 @@ int batadv_mesh_init(struct net_device *mesh_iface)void batadv_mesh_free (struct net_device *mesh_iface) {struct batadv_priv *bat_priv =netdev_priv (mesh_iface); +struct batadv_meshif_vlan *vlan;WRITE_ONCE (bat_priv->mesh_state,BATADV_MESH_DEACTIVATING );
@@ -273,6 +274,13 @@ void batadv_mesh_free(struct net_device *mesh_iface)batadv_mcast_free (bat_priv); +/* destroy the "untagged" VLAN */ + vlan =batadv_meshif_vlan_get (bat_priv,BATADV_NO_FLAGS ); +if (vlan) { +batadv_meshif_destroy_vlan (bat_priv, vlan); +batadv_meshif_vlan_put (vlan); + } +/* Free the TT and the originator tables only after having terminated * all the other depending components which may use these structures for * their purposes.
net/batman-adv/mesh-interface.c +2 -11
@@ -595,8 +595,8 @@ int batadv_meshif_create_vlan(struct batadv_priv *bat_priv, unsigned short vid)* @bat_priv: the bat priv with all the mesh interface information * @vlan: the object to remove */ -static void batadv_meshif_destroy_vlan (struct batadv_priv *bat_priv, -struct batadv_meshif_vlan *vlan) +void batadv_meshif_destroy_vlan (struct batadv_priv *bat_priv, +struct batadv_meshif_vlan *vlan) {/* explicitly remove the associated TT local entry because it is marked * with the NOPURGE flag
@@ -1091,22 +1091,13 @@ static int batadv_meshif_newlink(struct net_device *dev,static void batadv_meshif_destroy_netlink (struct net_device *mesh_iface,struct list_head *head) { -struct batadv_priv *bat_priv =netdev_priv (mesh_iface);struct batadv_hard_iface *hard_iface; -struct batadv_meshif_vlan *vlan;while (!list_empty (&mesh_iface->adj_list.lower)) { hard_iface =netdev_adjacent_get_private (mesh_iface->adj_list.lower.next);batadv_hardif_disable_interface (hard_iface); } -/* destroy the "untagged" VLAN */ - vlan =batadv_meshif_vlan_get (bat_priv,BATADV_NO_FLAGS ); -if (vlan) { -batadv_meshif_destroy_vlan (bat_priv, vlan); -batadv_meshif_vlan_put (vlan); - } -unregister_netdevice_queue (mesh_iface, head); }
net/batman-adv/mesh-interface.h +2 -0
@@ -21,6 +21,8 @@ void batadv_interface_rx(struct net_device *mesh_iface,bool batadv_meshif_is_valid (const struct net_device *net_dev);extern struct rtnl_link_ops batadv_link_ops;int batadv_meshif_create_vlan (struct batadv_priv *bat_priv,unsigned short vid); +void batadv_meshif_destroy_vlan (struct batadv_priv *bat_priv, +struct batadv_meshif_vlan *vlan);void batadv_meshif_vlan_release (struct kref *ref);struct batadv_meshif_vlan *batadv_meshif_vlan_get (struct batadv_priv *bat_priv,unsigned short vid);
Sven Eckelmann
maintainerPATCH 1/1 batman-adv: clean untagged VLAN on netdev registration failure
commit 8669a550c752d86baebc5fdc83b8ff35c4372c0e upstream.
When an mesh interface is registered, it creates an untagged struct batadv_meshif_vlan on top of it via the NETDEV_REGISTER notifier. But in this process, another receiver of this notification can veto the registration. The netdev registration will be aborted because of this veto.
The register_netdevice() call will try to clean up the net_device using unregister_netdevice_queue() - which only uses the .priv_destructor to free private resources. In this situation, .dellink will not be called.
The cleanup of the untagged batadv_meshif_vlan must thefore be done in the destructor to avoid a leak of this object.
--- net/batman-adv/main.c | 8 ++++++++ net/batman-adv/soft-interface.c | 13 ++----------- net/batman-adv/soft-interface.h | 2 ++ 3 files changed, 12 insertions(+), 11 deletions(-)
net/batman-adv/main.c +8 -0
@@ -258,6 +258,7 @@ int batadv_mesh_init(struct net_device *soft_iface)void batadv_mesh_free (struct net_device *soft_iface) {struct batadv_priv *bat_priv =netdev_priv (soft_iface); +struct batadv_softif_vlan *vlan;atomic_set (&bat_priv->mesh_state,BATADV_MESH_DEACTIVATING );
@@ -273,6 +274,13 @@ void batadv_mesh_free(struct net_device *soft_iface)batadv_mcast_free (bat_priv); +/* destroy the "untagged" VLAN */ + vlan =batadv_softif_vlan_get (bat_priv,BATADV_NO_FLAGS ); +if (vlan) { +batadv_softif_destroy_vlan (bat_priv, vlan); +batadv_softif_vlan_put (vlan); + } +/* Free the TT and the originator tables only after having terminated * all the other depending components which may use these structures for * their purposes.
net/batman-adv/soft-interface.c +2 -11
@@ -601,8 +601,8 @@ int batadv_softif_create_vlan(struct batadv_priv *bat_priv, unsigned short vid)* @bat_priv: the bat priv with all the soft interface information * @vlan: the object to remove */ -static void batadv_softif_destroy_vlan (struct batadv_priv *bat_priv, -struct batadv_softif_vlan *vlan) +void batadv_softif_destroy_vlan (struct batadv_priv *bat_priv, +struct batadv_softif_vlan *vlan) {/* explicitly remove the associated TT local entry because it is marked * with the NOPURGE flag
@@ -1084,22 +1084,13 @@ static int batadv_softif_newlink(struct net *src_net, struct net_device *dev,static void batadv_softif_destroy_netlink (struct net_device *soft_iface,struct list_head *head) { -struct batadv_priv *bat_priv =netdev_priv (soft_iface);struct batadv_hard_iface *hard_iface; -struct batadv_softif_vlan *vlan;list_for_each_entry (hard_iface, &batadv_hardif_list, list) {if (hard_iface->soft_iface == soft_iface)batadv_hardif_disable_interface (hard_iface); } -/* destroy the "untagged" VLAN */ - vlan =batadv_softif_vlan_get (bat_priv,BATADV_NO_FLAGS ); -if (vlan) { -batadv_softif_destroy_vlan (bat_priv, vlan); -batadv_softif_vlan_put (vlan); - } -unregister_netdevice_queue (soft_iface, head); }
net/batman-adv/soft-interface.h +2 -0
@@ -22,6 +22,8 @@ void batadv_interface_rx(struct net_device *soft_iface,bool batadv_softif_is_valid (const struct net_device *net_dev);extern struct rtnl_link_ops batadv_link_ops;int batadv_softif_create_vlan (struct batadv_priv *bat_priv,unsigned short vid); +void batadv_softif_destroy_vlan (struct batadv_priv *bat_priv, +struct batadv_softif_vlan *vlan);void batadv_softif_vlan_release (struct kref *ref);struct batadv_softif_vlan *batadv_softif_vlan_get (struct batadv_priv *bat_priv,unsigned short vid);
Signature · 1 line
2.47.3
Re: [PATCH 5.15.y] batman-adv: clean untagged VLAN on netdev registration failure
Quoted 3 lines
The
register_netdevice()call will try to clean up thenet_deviceusingunregister_netdevice_queue()- which only uses the .priv_destructor to free private resources. In this situation, .dellink will not be called.
Queued for 5.15, thanks.
Signature · 2 lines
Thanks, Sasha