From patchwork Wed Jun 1 10:55:37 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: sjur.brandeland@stericsson.com X-Patchwork-Id: 98166 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 A1EB5B6F7D for ; Wed, 1 Jun 2011 20:55:53 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1161093Ab1FAKzs (ORCPT ); Wed, 1 Jun 2011 06:55:48 -0400 Received: from sf1.isp.kq.no ([213.172.193.37]:42320 "EHLO pmx.vmail.no" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1161071Ab1FAKzr (ORCPT ); Wed, 1 Jun 2011 06:55:47 -0400 Received: from pmx.vmail.no (localhost [127.0.0.1]) by localhost (pmx9.isp.as2116.net) with SMTP id 5705561383; Wed, 1 Jun 2011 12:56:05 +0200 (CEST) Received: from smtp.bluecom.no (smtp.bluecom.no [193.75.75.28]) by pmx.vmail.no (pmx9.isp.as2116.net) with ESMTP id EF2E45F114; Wed, 1 Jun 2011 12:56:04 +0200 (CEST) Received: from localhost.localdomain (unknown [212.4.57.94]) by smtp.bluecom.no (Postfix) with ESMTP id 0D95618B; Wed, 1 Jun 2011 12:55:44 +0200 (CEST) From: =?UTF-8?q?Sjur=20Br=C3=A6ndeland?= To: "David S. Miller" , netdev@vger.kernel.org Cc: =?UTF-8?q?Sjur=20Br=C3=A6ndeland?= Subject: [PATCH] caif: Fix race when conditionally taking rtnl lock Date: Wed, 1 Jun 2011 12:55:37 +0200 Message-Id: <1306925737-1782-1-git-send-email-sjur.brandeland@stericsson.com> X-Mailer: git-send-email 1.7.0.4 MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Take the RTNL lock unconditionally when calling dev_close. Taking the lock conditionally may cause race conditions. Signed-off-by: Sjur Brændeland --- net/caif/chnl_net.c | 9 +++------ 1 files changed, 3 insertions(+), 6 deletions(-) diff --git a/net/caif/chnl_net.c b/net/caif/chnl_net.c index 649ebac..adbb424 100644 --- a/net/caif/chnl_net.c +++ b/net/caif/chnl_net.c @@ -139,17 +139,14 @@ static void close_work(struct work_struct *work) struct chnl_net *dev = NULL; struct list_head *list_node; struct list_head *_tmp; - /* May be called with or without RTNL lock held */ - int islocked = rtnl_is_locked(); - if (!islocked) - rtnl_lock(); + + rtnl_lock(); list_for_each_safe(list_node, _tmp, &chnl_net_list) { dev = list_entry(list_node, struct chnl_net, list_field); if (dev->state == CAIF_SHUTDOWN) dev_close(dev->netdev); } - if (!islocked) - rtnl_unlock(); + rtnl_unlock(); } static DECLARE_WORK(close_worker, close_work);