Return-Path: Received: from muru.com ([72.249.23.125]:53735 "EHLO muru.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751033AbcEITk6 (ORCPT ); Mon, 9 May 2016 15:40:58 -0400 Date: Mon, 9 May 2016 12:40:54 -0700 From: Tony Lindgren To: Al Viro Cc: Eric Dumazet , linux-nfs@vger.kernel.org, Jiri Pirko , netdev , Trond Myklebust , Christoph Hellwig , linux-omap@vger.kernel.org, Anna Schumaker , linux-arm-kernel@lists.infradead.org Subject: Re: NFSroot hangs with bad unlock balance in Linux next Message-ID: <20160509194054.GI5995@atomide.com> References: <20160505220344.GE5995@atomide.com> <20160508141629.GF2694@ZenIV.linux.org.uk> <20160509073235.GI2694@ZenIV.linux.org.uk> <20160509151219.GF5995@atomide.com> <20160509152138.GG5995@atomide.com> <20160509153932.GJ2694@ZenIV.linux.org.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii In-Reply-To: <20160509153932.GJ2694@ZenIV.linux.org.uk> Sender: linux-nfs-owner@vger.kernel.org List-ID: * Al Viro [160509 08:41]: > On Mon, May 09, 2016 at 08:21:38AM -0700, Tony Lindgren wrote: > > > Looks like with both patches applied I still also get this eventually: > > > > ===================================== > > [ BUG: bad unlock balance detected! ] > > 4.6.0-rc7-next-20160509+ #1264 Not tainted > > ------------------------------------- > > Lockdep warnings are noise. To make them STFU try the following incremental; > I'll fold it into #work.lookups and #for-next. Note that it will do nothing > to hangs - those are completely unrelated and you need Eric's patch to deal > with them. OK yeah that helps thanks: Tested-by: Tony Lindgren > diff --git a/fs/nfs/unlink.c b/fs/nfs/unlink.c > index d367b06..1868246 100644 > --- a/fs/nfs/unlink.c > +++ b/fs/nfs/unlink.c > @@ -64,7 +64,7 @@ static void nfs_async_unlink_release(void *calldata) > struct dentry *dentry = data->dentry; > struct super_block *sb = dentry->d_sb; > > - up_read(&NFS_I(d_inode(dentry->d_parent))->rmdir_sem); > + up_read_non_owner(&NFS_I(d_inode(dentry->d_parent))->rmdir_sem); > d_lookup_done(dentry); > nfs_free_unlinkdata(data); > dput(dentry); > @@ -117,10 +117,10 @@ static int nfs_call_unlink(struct dentry *dentry, struct nfs_unlinkdata *data) > struct inode *dir = d_inode(dentry->d_parent); > struct dentry *alias; > > - down_read(&NFS_I(dir)->rmdir_sem); > + down_read_non_owner(&NFS_I(dir)->rmdir_sem); > alias = d_alloc_parallel(dentry->d_parent, &data->args.name, &data->wq); > if (IS_ERR(alias)) { > - up_read(&NFS_I(dir)->rmdir_sem); > + up_read_non_owner(&NFS_I(dir)->rmdir_sem); > return 0; > } > if (!d_in_lookup(alias)) { > @@ -142,7 +142,7 @@ static int nfs_call_unlink(struct dentry *dentry, struct nfs_unlinkdata *data) > ret = 0; > spin_unlock(&alias->d_lock); > dput(alias); > - up_read(&NFS_I(dir)->rmdir_sem); > + up_read_non_owner(&NFS_I(dir)->rmdir_sem); > /* > * If we'd displaced old cached devname, free it. At that > * point dentry is definitely not a root, so we won't need