fa9dce8
Path: news.gmane.org!not-for-mail
fa9dce8
From: Tejun Heo <tj@kernel.org>
fa9dce8
Newsgroups: gmane.linux.kernel,gmane.linux.usb.general
fa9dce8
Subject: [PATCH driver-core-linus] kernfs: make kernfs_deactivate() honor
fa9dce8
 KERNFS_LOCKDEP flag
fa9dce8
Date: Wed, 29 Jan 2014 12:04:03 -0500
fa9dce8
Lines: 73
fa9dce8
Approved: news@gmane.org
fa9dce8
Message-ID: <20140129170403.GJ30842@htj.dyndns.org>
fa9dce8
References: <CAOJe8K20xx3o7HXH3E4pE3=G4pQ-nUf4LYF6sEwy5wYQE23+AA@mail.gmail.com>
fa9dce8
 <Pine.LNX.4.44L0.1401291134070.11997-100000@netrider.rowland.org>
fa9dce8
NNTP-Posting-Host: plane.gmane.org
fa9dce8
Mime-Version: 1.0
fa9dce8
Content-Type: text/plain; charset=us-ascii
fa9dce8
X-Trace: ger.gmane.org 1391015061 4057 80.91.229.3 (29 Jan 2014 17:04:21 GMT)
fa9dce8
X-Complaints-To: usenet@ger.gmane.org
fa9dce8
NNTP-Posting-Date: Wed, 29 Jan 2014 17:04:21 +0000 (UTC)
fa9dce8
Cc: Denis Kirjanov <kda@linux-powerpc.org>,
fa9dce8
	linux-kernel@vger.kernel.org, USB list <linux-usb@vger.kernel.org>
fa9dce8
To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
fa9dce8
	Fabio Estevam <festevam@gmail.com>,
fa9dce8
	Alan Stern <stern@rowland.harvard.edu>
fa9dce8
Original-X-From: linux-kernel-owner@vger.kernel.org Wed Jan 29 18:04:27 2014
fa9dce8
Return-path: <linux-kernel-owner@vger.kernel.org>
fa9dce8
Envelope-to: glk-linux-kernel-3@plane.gmane.org
fa9dce8
Original-Received: from vger.kernel.org ([209.132.180.67])
fa9dce8
	by plane.gmane.org with esmtp (Exim 4.69)
fa9dce8
	(envelope-from <linux-kernel-owner@vger.kernel.org>)
fa9dce8
	id 1W8YYs-0005VX-Uk
fa9dce8
	for glk-linux-kernel-3@plane.gmane.org; Wed, 29 Jan 2014 18:04:27 +0100
fa9dce8
Original-Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand
fa9dce8
	id S1752698AbaA2REJ (ORCPT <rfc822;glk-linux-kernel-3@m.gmane.org>);
fa9dce8
	Wed, 29 Jan 2014 12:04:09 -0500
fa9dce8
Original-Received: from mail-qc0-f169.google.com ([209.85.216.169]:41377 "EHLO
fa9dce8
	mail-qc0-f169.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org
fa9dce8
	with ESMTP id S1751973AbaA2REH (ORCPT
fa9dce8
	<rfc822;linux-kernel@vger.kernel.org>);
fa9dce8
	Wed, 29 Jan 2014 12:04:07 -0500
fa9dce8
Original-Received: by mail-qc0-f169.google.com with SMTP id w7so3165568qcr.14
fa9dce8
        for <multiple recipients>; Wed, 29 Jan 2014 09:04:06 -0800 (PST)
fa9dce8
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
fa9dce8
        d=gmail.com; s=20120113;
fa9dce8
        h=sender:date:from:to:cc:subject:message-id:references:mime-version
fa9dce8
         :content-type:content-disposition:in-reply-to:user-agent;
fa9dce8
        bh=Fh6SVzwapmccOTdEgQSF3oN1/EJKEwZvtYBUuXIZ0o4=;
fa9dce8
        b=rBrKrcnQDx5jOFp+S+kxTkHV0/kydN6rAWp8Hm4R/f1x8IEpY6l6pJIDqlk3yHcgh2
fa9dce8
         bGZkS+TswirT2pk1Gv4lcTtJRhjEXAr11bG9nr81fu1nQB/n7zVu+O/5TKLmSxBQAE0M
fa9dce8
         tLTNvWz1HcnTJstiZf2B5WUuAxF3x64eY6TNwCtqlE2U6PjtyBHi2bVnWPPD/zIrdhS1
fa9dce8
         tLtPw83syrLhuR0WloEZxUVcYcDxSJgK7IG82/attVP2vYZ6aPWj0H5fAO/pFCCdF7Xa
fa9dce8
         6WUCjRx6EmUfSmgc0FkJZwM9JC6IasvC8i13Xcewfpp1ZCVCaaR4/CR8oB9AWbHnKt7i
fa9dce8
         U/LQ==
fa9dce8
X-Received: by 10.224.165.133 with SMTP id i5mr13972741qay.75.1391015046591;
fa9dce8
        Wed, 29 Jan 2014 09:04:06 -0800 (PST)
fa9dce8
Original-Received: from htj.dyndns.org (207-38-225-25.c3-0.43d-ubr1.qens-43d.ny.cable.rcn.com. [207.38.225.25])
fa9dce8
        by mx.google.com with ESMTPSA id j65sm4205451qgj.18.2014.01.29.09.04.05
fa9dce8
        for <multiple recipients>
fa9dce8
        (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
fa9dce8
        Wed, 29 Jan 2014 09:04:05 -0800 (PST)
fa9dce8
Content-Disposition: inline
fa9dce8
In-Reply-To: <Pine.LNX.4.44L0.1401291134070.11997-100000@netrider.rowland.org>
fa9dce8
User-Agent: Mutt/1.5.21 (2010-09-15)
fa9dce8
Original-Sender: linux-kernel-owner@vger.kernel.org
fa9dce8
Precedence: bulk
fa9dce8
List-ID: <linux-kernel.vger.kernel.org>
fa9dce8
X-Mailing-List: linux-kernel@vger.kernel.org
fa9dce8
Xref: news.gmane.org gmane.linux.kernel:1637396 gmane.linux.usb.general:102347
fa9dce8
Archived-At: <http://permalink.gmane.org/gmane.linux.kernel/1637396>
fa9dce8
fa9dce8
kernfs_deactivate() forgot to check whether KERNFS_LOCKDEP is set
fa9dce8
before performing lockdep annotations and ends up feeding
fa9dce8
uninitialized lockdep_map to lockdep triggering warning like the
fa9dce8
following on USB stick hotunplug.
fa9dce8
fa9dce8
 usb 1-2: USB disconnect, device number 2
fa9dce8
 INFO: trying to register non-static key.
fa9dce8
 the code is fine but needs lockdep annotation.
fa9dce8
 turning off the locking correctness validator.
fa9dce8
 CPU: 1 PID: 62 Comm: khubd Not tainted 3.13.0-work+ #82
fa9dce8
 Hardware name: empty empty/S3992, BIOS 080011  10/26/2007
fa9dce8
  ffff880065ca7f60 ffff88013a4ffa08 ffffffff81cfb6bd 0000000000000002
fa9dce8
  ffff88013a4ffac8 ffffffff810f8530 ffff88013a4fc710 0000000000000002
fa9dce8
  ffff880100000000 ffffffff82a3db50 0000000000000001 ffff88013a4fc710
fa9dce8
 Call Trace:
fa9dce8
  [<ffffffff81cfb6bd>] dump_stack+0x4e/0x7a
fa9dce8
  [<ffffffff810f8530>] __lock_acquire+0x1910/0x1e70
fa9dce8
  [<ffffffff810f931a>] lock_acquire+0x9a/0x1d0
fa9dce8
  [<ffffffff8127c75e>] kernfs_deactivate+0xee/0x130
fa9dce8
  [<ffffffff8127d4c8>] kernfs_addrm_finish+0x38/0x60
fa9dce8
  [<ffffffff8127d701>] kernfs_remove_by_name_ns+0x51/0xa0
fa9dce8
  [<ffffffff8127b4f1>] remove_files.isra.1+0x41/0x80
fa9dce8
  [<ffffffff8127b7e7>] sysfs_remove_group+0x47/0xa0
fa9dce8
  [<ffffffff8127b873>] sysfs_remove_groups+0x33/0x50
fa9dce8
  [<ffffffff8177d66d>] device_remove_attrs+0x4d/0x80
fa9dce8
  [<ffffffff8177e25e>] device_del+0x12e/0x1d0
fa9dce8
  [<ffffffff819722c2>] usb_disconnect+0x122/0x1a0
fa9dce8
  [<ffffffff819749b5>] hub_thread+0x3c5/0x1290
fa9dce8
  [<ffffffff810c6a6d>] kthread+0xed/0x110
fa9dce8
  [<ffffffff81d0a56c>] ret_from_fork+0x7c/0xb0
fa9dce8
fa9dce8
Fix it by making kernfs_deactivate() perform lockdep annotations only
fa9dce8
if KERNFS_LOCKDEP is set.
fa9dce8
fa9dce8
Signed-off-by: Tejun Heo <tj@kernel.org>
fa9dce8
Reported-by: Fabio Estevam <festevam@gmail.com>
fa9dce8
Reported-by: Alan Stern <stern@rowland.harvard.edu>
fa9dce8
---
fa9dce8
 fs/kernfs/dir.c |   12 ++++++++----
fa9dce8
 1 file changed, 8 insertions(+), 4 deletions(-)
fa9dce8
fa9dce8
diff --git a/fs/kernfs/dir.c b/fs/kernfs/dir.c
fa9dce8
index 5104cf5..bd6e18b 100644
fa9dce8
--- a/fs/kernfs/dir.c
fa9dce8
+++ b/fs/kernfs/dir.c
fa9dce8
@@ -187,19 +187,23 @@ static void kernfs_deactivate(struct kernfs_node *kn)
fa9dce8
 
fa9dce8
 	kn->u.completion = (void *)&wait;
fa9dce8
 
fa9dce8
-	rwsem_acquire(&kn->dep_map, 0, 0, _RET_IP_);
fa9dce8
+	if (kn->flags & KERNFS_LOCKDEP)
fa9dce8
+		rwsem_acquire(&kn->dep_map, 0, 0, _RET_IP_);
fa9dce8
 	/* atomic_add_return() is a mb(), put_active() will always see
fa9dce8
 	 * the updated kn->u.completion.
fa9dce8
 	 */
fa9dce8
 	v = atomic_add_return(KN_DEACTIVATED_BIAS, &kn->active);
fa9dce8
 
fa9dce8
 	if (v != KN_DEACTIVATED_BIAS) {
fa9dce8
-		lock_contended(&kn->dep_map, _RET_IP_);
fa9dce8
+		if (kn->flags & KERNFS_LOCKDEP)
fa9dce8
+			lock_contended(&kn->dep_map, _RET_IP_);
fa9dce8
 		wait_for_completion(&wait);
fa9dce8
 	}
fa9dce8
 
fa9dce8
-	lock_acquired(&kn->dep_map, _RET_IP_);
fa9dce8
-	rwsem_release(&kn->dep_map, 1, _RET_IP_);
fa9dce8
+	if (kn->flags & KERNFS_LOCKDEP) {
fa9dce8
+		lock_acquired(&kn->dep_map, _RET_IP_);
fa9dce8
+		rwsem_release(&kn->dep_map, 1, _RET_IP_);
fa9dce8
+	}
fa9dce8
 }
fa9dce8
 
fa9dce8
 /**