@@ -61,9 +61,6 @@ static int rmnet_unregister_real_device(struct net_device *real_dev,
61
61
62
62
kfree (port );
63
63
64
- /* release reference on real_dev */
65
- dev_put (real_dev );
66
-
67
64
netdev_dbg (real_dev , "Removed from rmnet\n" );
68
65
return 0 ;
69
66
}
@@ -89,9 +86,6 @@ static int rmnet_register_real_device(struct net_device *real_dev)
89
86
return - EBUSY ;
90
87
}
91
88
92
- /* hold on to real dev for MAP data */
93
- dev_hold (real_dev );
94
-
95
89
for (entry = 0 ; entry < RMNET_MAX_LOGICAL_EP ; entry ++ )
96
90
INIT_HLIST_HEAD (& port -> muxed_ep [entry ]);
97
91
@@ -162,6 +156,10 @@ static int rmnet_newlink(struct net *src_net, struct net_device *dev,
162
156
if (err )
163
157
goto err1 ;
164
158
159
+ err = netdev_upper_dev_link (real_dev , dev , extack );
160
+ if (err < 0 )
161
+ goto err2 ;
162
+
165
163
port -> rmnet_mode = mode ;
166
164
167
165
hlist_add_head_rcu (& ep -> hlnode , & port -> muxed_ep [mux_id ]);
@@ -178,6 +176,8 @@ static int rmnet_newlink(struct net *src_net, struct net_device *dev,
178
176
179
177
return 0 ;
180
178
179
+ err2 :
180
+ unregister_netdevice (dev );
181
181
err1 :
182
182
rmnet_unregister_real_device (real_dev , port );
183
183
err0 :
@@ -209,33 +209,30 @@ static void rmnet_dellink(struct net_device *dev, struct list_head *head)
209
209
rmnet_vnd_dellink (mux_id , port , ep );
210
210
kfree (ep );
211
211
}
212
+ netdev_upper_dev_unlink (real_dev , dev );
212
213
rmnet_unregister_real_device (real_dev , port );
213
214
214
215
unregister_netdevice_queue (dev , head );
215
216
}
216
217
217
- static void rmnet_force_unassociate_device (struct net_device * dev )
218
+ static void rmnet_force_unassociate_device (struct net_device * real_dev )
218
219
{
219
- struct net_device * real_dev = dev ;
220
220
struct hlist_node * tmp_ep ;
221
221
struct rmnet_endpoint * ep ;
222
222
struct rmnet_port * port ;
223
223
unsigned long bkt_ep ;
224
224
LIST_HEAD (list );
225
225
226
- if (!rmnet_is_real_dev_registered (real_dev ))
227
- return ;
228
-
229
226
ASSERT_RTNL ();
230
227
231
- port = rmnet_get_port_rtnl (dev );
228
+ port = rmnet_get_port_rtnl (real_dev );
232
229
233
- rmnet_unregister_bridge (dev , port );
230
+ rmnet_unregister_bridge (real_dev , port );
234
231
235
232
hash_for_each_safe (port -> muxed_ep , bkt_ep , tmp_ep , ep , hlnode ) {
233
+ netdev_upper_dev_unlink (real_dev , ep -> egress_dev );
236
234
unregister_netdevice_queue (ep -> egress_dev , & list );
237
235
rmnet_vnd_dellink (ep -> mux_id , port , ep );
238
-
239
236
hlist_del_init_rcu (& ep -> hlnode );
240
237
kfree (ep );
241
238
}
@@ -248,15 +245,15 @@ static void rmnet_force_unassociate_device(struct net_device *dev)
248
245
static int rmnet_config_notify_cb (struct notifier_block * nb ,
249
246
unsigned long event , void * data )
250
247
{
251
- struct net_device * dev = netdev_notifier_info_to_dev (data );
248
+ struct net_device * real_dev = netdev_notifier_info_to_dev (data );
252
249
253
- if (!dev )
250
+ if (!rmnet_is_real_dev_registered ( real_dev ) )
254
251
return NOTIFY_DONE ;
255
252
256
253
switch (event ) {
257
254
case NETDEV_UNREGISTER :
258
- netdev_dbg (dev , "Kernel unregister\n" );
259
- rmnet_force_unassociate_device (dev );
255
+ netdev_dbg (real_dev , "Kernel unregister\n" );
256
+ rmnet_force_unassociate_device (real_dev );
260
257
break ;
261
258
262
259
default :
@@ -477,8 +474,8 @@ static int __init rmnet_init(void)
477
474
478
475
static void __exit rmnet_exit (void )
479
476
{
480
- unregister_netdevice_notifier (& rmnet_dev_notifier );
481
477
rtnl_link_unregister (& rmnet_link_ops );
478
+ unregister_netdevice_notifier (& rmnet_dev_notifier );
482
479
}
483
480
484
481
module_init (rmnet_init )
0 commit comments