@@ -65,10 +65,12 @@ static struct l2tp_session *l2tp_nl_session_get(struct genl_info *info,
6565 (info -> attrs [L2TP_ATTR_CONN_ID ])) {
6666 tunnel_id = nla_get_u32 (info -> attrs [L2TP_ATTR_CONN_ID ]);
6767 session_id = nla_get_u32 (info -> attrs [L2TP_ATTR_SESSION_ID ]);
68- tunnel = l2tp_tunnel_find (net , tunnel_id );
69- if (tunnel )
68+ tunnel = l2tp_tunnel_get (net , tunnel_id );
69+ if (tunnel ) {
7070 session = l2tp_session_get (net , tunnel , session_id ,
7171 do_ref );
72+ l2tp_tunnel_dec_refcount (tunnel );
73+ }
7274 }
7375
7476 return session ;
@@ -271,8 +273,8 @@ static int l2tp_nl_cmd_tunnel_delete(struct sk_buff *skb, struct genl_info *info
271273 }
272274 tunnel_id = nla_get_u32 (info -> attrs [L2TP_ATTR_CONN_ID ]);
273275
274- tunnel = l2tp_tunnel_find (net , tunnel_id );
275- if (tunnel == NULL ) {
276+ tunnel = l2tp_tunnel_get (net , tunnel_id );
277+ if (! tunnel ) {
276278 ret = - ENODEV ;
277279 goto out ;
278280 }
@@ -282,6 +284,8 @@ static int l2tp_nl_cmd_tunnel_delete(struct sk_buff *skb, struct genl_info *info
282284
283285 (void ) l2tp_tunnel_delete (tunnel );
284286
287+ l2tp_tunnel_dec_refcount (tunnel );
288+
285289out :
286290 return ret ;
287291}
@@ -299,8 +303,8 @@ static int l2tp_nl_cmd_tunnel_modify(struct sk_buff *skb, struct genl_info *info
299303 }
300304 tunnel_id = nla_get_u32 (info -> attrs [L2TP_ATTR_CONN_ID ]);
301305
302- tunnel = l2tp_tunnel_find (net , tunnel_id );
303- if (tunnel == NULL ) {
306+ tunnel = l2tp_tunnel_get (net , tunnel_id );
307+ if (! tunnel ) {
304308 ret = - ENODEV ;
305309 goto out ;
306310 }
@@ -311,6 +315,8 @@ static int l2tp_nl_cmd_tunnel_modify(struct sk_buff *skb, struct genl_info *info
311315 ret = l2tp_tunnel_notify (& l2tp_nl_family , info ,
312316 tunnel , L2TP_CMD_TUNNEL_MODIFY );
313317
318+ l2tp_tunnel_dec_refcount (tunnel );
319+
314320out :
315321 return ret ;
316322}
@@ -438,34 +444,37 @@ static int l2tp_nl_cmd_tunnel_get(struct sk_buff *skb, struct genl_info *info)
438444
439445 if (!info -> attrs [L2TP_ATTR_CONN_ID ]) {
440446 ret = - EINVAL ;
441- goto out ;
447+ goto err ;
442448 }
443449
444450 tunnel_id = nla_get_u32 (info -> attrs [L2TP_ATTR_CONN_ID ]);
445451
446- tunnel = l2tp_tunnel_find (net , tunnel_id );
447- if (tunnel == NULL ) {
448- ret = - ENODEV ;
449- goto out ;
450- }
451-
452452 msg = nlmsg_new (NLMSG_DEFAULT_SIZE , GFP_KERNEL );
453453 if (!msg ) {
454454 ret = - ENOMEM ;
455- goto out ;
455+ goto err ;
456+ }
457+
458+ tunnel = l2tp_tunnel_get (net , tunnel_id );
459+ if (!tunnel ) {
460+ ret = - ENODEV ;
461+ goto err_nlmsg ;
456462 }
457463
458464 ret = l2tp_nl_tunnel_send (msg , info -> snd_portid , info -> snd_seq ,
459465 NLM_F_ACK , tunnel , L2TP_CMD_TUNNEL_GET );
460466 if (ret < 0 )
461- goto err_out ;
467+ goto err_nlmsg_tunnel ;
468+
469+ l2tp_tunnel_dec_refcount (tunnel );
462470
463471 return genlmsg_unicast (net , msg , info -> snd_portid );
464472
465- err_out :
473+ err_nlmsg_tunnel :
474+ l2tp_tunnel_dec_refcount (tunnel );
475+ err_nlmsg :
466476 nlmsg_free (msg );
467-
468- out :
477+ err :
469478 return ret ;
470479}
471480
@@ -509,33 +518,34 @@ static int l2tp_nl_cmd_session_create(struct sk_buff *skb, struct genl_info *inf
509518 ret = - EINVAL ;
510519 goto out ;
511520 }
521+
512522 tunnel_id = nla_get_u32 (info -> attrs [L2TP_ATTR_CONN_ID ]);
513- tunnel = l2tp_tunnel_find (net , tunnel_id );
523+ tunnel = l2tp_tunnel_get (net , tunnel_id );
514524 if (!tunnel ) {
515525 ret = - ENODEV ;
516526 goto out ;
517527 }
518528
519529 if (!info -> attrs [L2TP_ATTR_SESSION_ID ]) {
520530 ret = - EINVAL ;
521- goto out ;
531+ goto out_tunnel ;
522532 }
523533 session_id = nla_get_u32 (info -> attrs [L2TP_ATTR_SESSION_ID ]);
524534
525535 if (!info -> attrs [L2TP_ATTR_PEER_SESSION_ID ]) {
526536 ret = - EINVAL ;
527- goto out ;
537+ goto out_tunnel ;
528538 }
529539 peer_session_id = nla_get_u32 (info -> attrs [L2TP_ATTR_PEER_SESSION_ID ]);
530540
531541 if (!info -> attrs [L2TP_ATTR_PW_TYPE ]) {
532542 ret = - EINVAL ;
533- goto out ;
543+ goto out_tunnel ;
534544 }
535545 cfg .pw_type = nla_get_u16 (info -> attrs [L2TP_ATTR_PW_TYPE ]);
536546 if (cfg .pw_type >= __L2TP_PWTYPE_MAX ) {
537547 ret = - EINVAL ;
538- goto out ;
548+ goto out_tunnel ;
539549 }
540550
541551 if (tunnel -> version > 2 ) {
@@ -557,7 +567,7 @@ static int l2tp_nl_cmd_session_create(struct sk_buff *skb, struct genl_info *inf
557567 u16 len = nla_len (info -> attrs [L2TP_ATTR_COOKIE ]);
558568 if (len > 8 ) {
559569 ret = - EINVAL ;
560- goto out ;
570+ goto out_tunnel ;
561571 }
562572 cfg .cookie_len = len ;
563573 memcpy (& cfg .cookie [0 ], nla_data (info -> attrs [L2TP_ATTR_COOKIE ]), len );
@@ -566,7 +576,7 @@ static int l2tp_nl_cmd_session_create(struct sk_buff *skb, struct genl_info *inf
566576 u16 len = nla_len (info -> attrs [L2TP_ATTR_PEER_COOKIE ]);
567577 if (len > 8 ) {
568578 ret = - EINVAL ;
569- goto out ;
579+ goto out_tunnel ;
570580 }
571581 cfg .peer_cookie_len = len ;
572582 memcpy (& cfg .peer_cookie [0 ], nla_data (info -> attrs [L2TP_ATTR_PEER_COOKIE ]), len );
@@ -609,7 +619,7 @@ static int l2tp_nl_cmd_session_create(struct sk_buff *skb, struct genl_info *inf
609619 if ((l2tp_nl_cmd_ops [cfg .pw_type ] == NULL ) ||
610620 (l2tp_nl_cmd_ops [cfg .pw_type ]-> session_create == NULL )) {
611621 ret = - EPROTONOSUPPORT ;
612- goto out ;
622+ goto out_tunnel ;
613623 }
614624
615625 /* Check that pseudowire-specific params are present */
@@ -619,7 +629,7 @@ static int l2tp_nl_cmd_session_create(struct sk_buff *skb, struct genl_info *inf
619629 case L2TP_PWTYPE_ETH_VLAN :
620630 if (!info -> attrs [L2TP_ATTR_VLAN_ID ]) {
621631 ret = - EINVAL ;
622- goto out ;
632+ goto out_tunnel ;
623633 }
624634 break ;
625635 case L2TP_PWTYPE_ETH :
@@ -647,6 +657,8 @@ static int l2tp_nl_cmd_session_create(struct sk_buff *skb, struct genl_info *inf
647657 }
648658 }
649659
660+ out_tunnel :
661+ l2tp_tunnel_dec_refcount (tunnel );
650662out :
651663 return ret ;
652664}
0 commit comments