@@ -441,14 +441,15 @@ int l2tp_session_register(struct l2tp_session *session,
441
441
int err ;
442
442
443
443
spin_lock_bh (& tunnel -> list_lock );
444
+ spin_lock_bh (& pn -> l2tp_session_idr_lock );
445
+
444
446
if (!tunnel -> acpt_newsess ) {
445
447
err = - ENODEV ;
446
- goto err_tlock ;
448
+ goto out ;
447
449
}
448
450
449
451
if (tunnel -> version == L2TP_HDR_VER_3 ) {
450
452
session_key = session -> session_id ;
451
- spin_lock_bh (& pn -> l2tp_session_idr_lock );
452
453
err = idr_alloc_u32 (& pn -> l2tp_v3_session_idr , NULL ,
453
454
& session_key , session_key , GFP_ATOMIC );
454
455
/* IP encap expects session IDs to be globally unique, while
@@ -462,43 +463,36 @@ int l2tp_session_register(struct l2tp_session *session,
462
463
err = l2tp_session_collision_add (pn , session ,
463
464
other_session );
464
465
}
465
- spin_unlock_bh (& pn -> l2tp_session_idr_lock );
466
466
} else {
467
467
session_key = l2tp_v2_session_key (tunnel -> tunnel_id ,
468
468
session -> session_id );
469
- spin_lock_bh (& pn -> l2tp_session_idr_lock );
470
469
err = idr_alloc_u32 (& pn -> l2tp_v2_session_idr , NULL ,
471
470
& session_key , session_key , GFP_ATOMIC );
472
- spin_unlock_bh (& pn -> l2tp_session_idr_lock );
473
471
}
474
472
475
473
if (err ) {
476
474
if (err == - ENOSPC )
477
475
err = - EEXIST ;
478
- goto err_tlock ;
476
+ goto out ;
479
477
}
480
478
481
479
l2tp_tunnel_inc_refcount (tunnel );
482
-
483
480
list_add (& session -> list , & tunnel -> session_list );
484
- spin_unlock_bh (& tunnel -> list_lock );
485
481
486
- spin_lock_bh (& pn -> l2tp_session_idr_lock );
487
482
if (tunnel -> version == L2TP_HDR_VER_3 ) {
488
483
if (!other_session )
489
484
idr_replace (& pn -> l2tp_v3_session_idr , session , session_key );
490
485
} else {
491
486
idr_replace (& pn -> l2tp_v2_session_idr , session , session_key );
492
487
}
493
- spin_unlock_bh (& pn -> l2tp_session_idr_lock );
494
-
495
- trace_register_session (session );
496
488
497
- return 0 ;
498
-
499
- err_tlock :
489
+ out :
490
+ spin_unlock_bh (& pn -> l2tp_session_idr_lock );
500
491
spin_unlock_bh (& tunnel -> list_lock );
501
492
493
+ if (!err )
494
+ trace_register_session (session );
495
+
502
496
return err ;
503
497
}
504
498
EXPORT_SYMBOL_GPL (l2tp_session_register );
@@ -1260,13 +1254,13 @@ static void l2tp_session_unhash(struct l2tp_session *session)
1260
1254
struct l2tp_net * pn = l2tp_pernet (tunnel -> l2tp_net );
1261
1255
struct l2tp_session * removed = session ;
1262
1256
1263
- /* Remove from the per-tunnel list */
1264
1257
spin_lock_bh (& tunnel -> list_lock );
1258
+ spin_lock_bh (& pn -> l2tp_session_idr_lock );
1259
+
1260
+ /* Remove from the per-tunnel list */
1265
1261
list_del_init (& session -> list );
1266
- spin_unlock_bh (& tunnel -> list_lock );
1267
1262
1268
1263
/* Remove from per-net IDR */
1269
- spin_lock_bh (& pn -> l2tp_session_idr_lock );
1270
1264
if (tunnel -> version == L2TP_HDR_VER_3 ) {
1271
1265
if (hash_hashed (& session -> hlist ))
1272
1266
l2tp_session_collision_del (pn , session );
@@ -1280,7 +1274,9 @@ static void l2tp_session_unhash(struct l2tp_session *session)
1280
1274
session_key );
1281
1275
}
1282
1276
WARN_ON_ONCE (removed && removed != session );
1277
+
1283
1278
spin_unlock_bh (& pn -> l2tp_session_idr_lock );
1279
+ spin_unlock_bh (& tunnel -> list_lock );
1284
1280
1285
1281
synchronize_rcu ();
1286
1282
}
0 commit comments