From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from m12-18.163.com ([220.181.12.18]:59894 "EHLO m12-18.163.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753299AbcIDJD0 (ORCPT ); Sun, 4 Sep 2016 05:03:26 -0400 Subject: Re: Question: d_revalidate in rcu-walk To: Al Viro References: <60d375df.47a9.156efa7c83a.Coremail.shyodx1989@163.com> <20160903130312.GC2356@ZenIV.linux.org.uk> Cc: linux-fsdevel@vger.kernel.org, zhangshiming5@huawei.com, yuchao0@huawei.com, jaegeuk@kernel.org, chao@kernel.org From: Sheng Yong Message-ID: <57CBDF51.9070009@163.com> Date: Sun, 4 Sep 2016 16:46:09 +0800 MIME-Version: 1.0 In-Reply-To: <20160903130312.GC2356@ZenIV.linux.org.uk> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Sender: linux-fsdevel-owner@vger.kernel.org List-ID: Thanks for your reply. There is something wrong with my mail client. It sent an empty email which I don't know why :( I hope it works this time. 在 2016/9/3 21:03, Al Viro 写道: > On Sat, Sep 03, 2016 at 06:46:05PM +0800, shyodx1989 wrote: > >> >> But most filesystems, which have d_revalidate, return -ECHILD if LOOKUP_RCU is set instead of >> checking if it is safe for rcu-walk. > > For a good and simple reason that the work they would have to do in their > ->d_revalidate() can't be done without blocking. Which can't be done under > rcu_read_lock(), thus the "sorry, you have to leave RCU mode for that", aka > -ECHILD. So, basically, ECHILD does not care about wheter d_inode, d_flags or other d_xxx members are updated or invalidated. If d_revalidate is not blocked, thus the task will not be switched out to break grace period, it is safe to call d_revalidate in RCU mode. And during rcu-walk, the dentry may be out of date, the seqcount could help to detect if someone is updating or using the dentry. > >> However commit 5c0f360b083fb33d05d1bff4b138b82d715eb419 >> "jfs_ci_revalidate() is safe from RCU mode" removes the check. So why is jfs_ci_revalidate safe in >> RCU mode > > Because JFS ->d_revalidate() doesn't need anything blocking. > >> and if we only check d_inode (like the following code), what should we care about to >> tell if d_revalidate is safe for rcu-walk or not and? Ref-walk is much slower than rcu-walk, maybe >> it's better not to return -ECHILD directly if not necessary. >> >> >> d_revalidate(dentry, flags) >> { >> if (flags & LOOKUP_RCU) >> return -ECHILD >> if (!d_inode_rcu(dentry)) >> return 0; >> return 1; >> } > > Huh? Which filesystem would that be? Sure, in such case -ECHILD is pointless; > who does that? Some of them might be possible to drop ECHILD, but that needs > some care. Note, BTW, that things like dput() are blocking, so the things like > trying to grab parent, etc. can get tricky. In fact, there are no filesystems do that. I just wanted to revalidate negative dentries during lookup for my own test, and was wondering why JFS behaves different with other local filesystems. thanks, Sheng > > Which ->d_revalidate() instance do you have in mind? >