From patchwork Thu Dec 17 00:28:08 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Markine X-Patchwork-Id: 41288 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 8C7A3B6F2B for ; Thu, 17 Dec 2009 11:28:24 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1762938AbZLQA2T (ORCPT ); Wed, 16 Dec 2009 19:28:19 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1762883AbZLQA2S (ORCPT ); Wed, 16 Dec 2009 19:28:18 -0500 Received: from smtp-out.google.com ([216.239.44.51]:27454 "EHLO smtp-out.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1759235AbZLQA2R (ORCPT ); Wed, 16 Dec 2009 19:28:17 -0500 Received: from spaceape11.eur.corp.google.com (spaceape11.eur.corp.google.com [172.28.16.145]) by smtp-out.google.com with ESMTP id nBH0SDVQ029996; Wed, 16 Dec 2009 16:28:13 -0800 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=google.com; s=beta; t=1261009694; bh=BATHLz9DFzq2WmRB2xqS8bQ500c=; h=From:To:Cc:Subject:Message-Id:Date; b=S5kK8o6c6lCiMlo17/qjQ4mNdeeNWGf0DfXgWiVwOR5/liUWfY6v9UbG1fNIXltEl 4srUpzehja42u/UJu/yVA== DomainKey-Signature: a=rsa-sha1; s=beta; d=google.com; c=nofws; q=dns; h=from:to:cc:subject:message-id:date; b=YUkyuIJf0gs5Qvt1F49lPKhlvq+0JQ6PZG2cSjHJtPXC13QK7/to1+KKqEGUgCdfG PTIztkaBqKUvBWlxAzDgw== Received: from hockey.mtv.corp.google.com (hockey.mtv.corp.google.com [172.18.125.62]) by spaceape11.eur.corp.google.com with ESMTP id nBH0S9d1025136; Wed, 16 Dec 2009 16:28:10 -0800 Received: by hockey.mtv.corp.google.com (Postfix, from userid 68020) id E44D0254177; Wed, 16 Dec 2009 16:28:08 -0800 (PST) From: Mikhail Markine To: Jay Vosburgh , David Miller , bonding-devel@lists.sourceforge.net, netdev@vger.kernel.org Cc: Mikhail Markine , Petri Gynther Subject: [PATCH] bonding: cancel_delayed_work() -> cancel_delayed_work_sync() Message-Id: <20091217002808.E44D0254177@hockey.mtv.corp.google.com> Date: Wed, 16 Dec 2009 16:28:08 -0800 (PST) Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org A race condition was observed with bond_mii_monitor() attempting to process an interface already closed by bond_close() in response to 'ifconfig bond down'. Change all instances of cancel_delayed_work() to cancel_delayed_work_sync(). Signed-off-by: Mikhail Markine Signed-off-by: Petri Gynther --- drivers/net/bonding/bond_main.c | 16 ++++++++-------- drivers/net/bonding/bond_sysfs.c | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index af9b9c4..2bdacb6 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -3786,20 +3786,20 @@ static int bond_close(struct net_device *bond_dev) write_unlock_bh(&bond->lock); if (bond->params.miimon) { /* link check interval, in milliseconds. */ - cancel_delayed_work(&bond->mii_work); + cancel_delayed_work_sync(&bond->mii_work); } if (bond->params.arp_interval) { /* arp interval, in milliseconds. */ - cancel_delayed_work(&bond->arp_work); + cancel_delayed_work_sync(&bond->arp_work); } switch (bond->params.mode) { case BOND_MODE_8023AD: - cancel_delayed_work(&bond->ad_work); + cancel_delayed_work_sync(&bond->ad_work); break; case BOND_MODE_TLB: case BOND_MODE_ALB: - cancel_delayed_work(&bond->alb_work); + cancel_delayed_work_sync(&bond->alb_work); break; default: break; @@ -4566,18 +4566,18 @@ static void bond_work_cancel_all(struct bonding *bond) write_unlock_bh(&bond->lock); if (bond->params.miimon && delayed_work_pending(&bond->mii_work)) - cancel_delayed_work(&bond->mii_work); + cancel_delayed_work_sync(&bond->mii_work); if (bond->params.arp_interval && delayed_work_pending(&bond->arp_work)) - cancel_delayed_work(&bond->arp_work); + cancel_delayed_work_sync(&bond->arp_work); if (bond->params.mode == BOND_MODE_ALB && delayed_work_pending(&bond->alb_work)) - cancel_delayed_work(&bond->alb_work); + cancel_delayed_work_sync(&bond->alb_work); if (bond->params.mode == BOND_MODE_8023AD && delayed_work_pending(&bond->ad_work)) - cancel_delayed_work(&bond->ad_work); + cancel_delayed_work_sync(&bond->ad_work); } /* diff --git a/drivers/net/bonding/bond_sysfs.c b/drivers/net/bonding/bond_sysfs.c index 4e00b4f..d951939 100644 --- a/drivers/net/bonding/bond_sysfs.c +++ b/drivers/net/bonding/bond_sysfs.c @@ -598,7 +598,7 @@ static ssize_t bonding_store_arp_interval(struct device *d, bond->dev->name, bond->dev->name); bond->params.miimon = 0; if (delayed_work_pending(&bond->mii_work)) { - cancel_delayed_work(&bond->mii_work); + cancel_delayed_work_sync(&bond->mii_work); flush_workqueue(bond->wq); } } @@ -1117,7 +1117,7 @@ static ssize_t bonding_store_miimon(struct device *d, BOND_ARP_VALIDATE_NONE; } if (delayed_work_pending(&bond->arp_work)) { - cancel_delayed_work(&bond->arp_work); + cancel_delayed_work_sync(&bond->arp_work); flush_workqueue(bond->wq); } }