From mboxrd@z Thu Jan 1 00:00:00 1970 From: Al Viro Subject: Re: Q: spin_unlock(dentry) after lock_parent(dentry) Date: Wed, 4 Jun 2014 00:17:12 +0100 Message-ID: <20140603231712.GU18016@ZenIV.linux.org.uk> References: <23341.1401806215@jrobl> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: linux-fsdevel@vger.kernel.org To: "J. R. Okajima" Return-path: Received: from zeniv.linux.org.uk ([195.92.253.2]:50926 "EHLO ZenIV.linux.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751955AbaFCXRO (ORCPT ); Tue, 3 Jun 2014 19:17:14 -0400 Content-Disposition: inline In-Reply-To: <23341.1401806215@jrobl> Sender: linux-fsdevel-owner@vger.kernel.org List-ID: On Tue, Jun 03, 2014 at 11:36:55PM +0900, J. R. Okajima wrote: > > Hello Al Viro, > > I have a question about spin_unlock(dentry) after lock_parent(dentry). > In lock_parent(dentry), spin_unlock(dentry) is called. And > spin_lock(dentry) is called again when (parent != dentry) is > true. Otherwise, dentry left spin_unlock-ed and lock_parent() returns > NULL. Nope. You are misreading it. Note that in *all* cases the parent is locked. And NULL is returned exactly in the case when that parent is equal to dentry itself. IOW, in all cases, lock_parent(d) returns with d locked and after p = lock_parent(d) either 1) d->d_parent == d and p == NULL, or 2) d->d_parent == p, p != d and p is locked as well. That holds whether we had succeeded with trylock or had to drop and regain the lock on d. > Even in the case of lock_parent() returns NULL, shrink_dentry_list() > calls spin_unlock(dentry). Is it balanced and correct? Yes.