From 4826833f1801cc8aaa95b6db3769a2efd3db1e61 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Mon, 10 Mar 2003 01:12:51 -0800 Subject: [PATCH] [IPV4]: Fix deadlock in IGMP locking. --- net/ipv4/igmp.c | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c index 80e8e74332353..1053e9093bee7 100644 --- a/net/ipv4/igmp.c +++ b/net/ipv4/igmp.c @@ -255,30 +255,22 @@ static void igmp_timer_expire(unsigned long data) { struct ip_mc_list *im=(struct ip_mc_list *)data; struct in_device *in_dev = im->interface; - int err; spin_lock(&im->lock); im->tm_running=0; - if (IGMP_V1_SEEN(in_dev)) - err = igmp_send_report(in_dev->dev, im->multiaddr, IGMP_HOST_MEMBERSHIP_REPORT); - else - err = igmp_send_report(in_dev->dev, im->multiaddr, IGMP_HOST_NEW_MEMBERSHIP_REPORT); - - /* Failed. Retry later. */ - if (err) { - if (!in_dev->dead) - igmp_start_timer(im, IGMP_Unsolicited_Report_Interval); - goto out; - } - if (im->unsolicit_count) { im->unsolicit_count--; igmp_start_timer(im, IGMP_Unsolicited_Report_Interval); } im->reporter = 1; -out: spin_unlock(&im->lock); + + if (IGMP_V1_SEEN(in_dev)) + igmp_send_report(in_dev->dev, im->multiaddr, IGMP_HOST_MEMBERSHIP_REPORT); + else + igmp_send_report(in_dev->dev, im->multiaddr, IGMP_HOST_NEW_MEMBERSHIP_REPORT); + ip_ma_put(im); } -- 2.53.0