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