On Mon, Jul 4, 2022 at 12:03 PM Al Viro <viro@xxxxxxxxxxxxxxxxxx> wrote: > > Anyway, I've thrown a mount_lock check in there, running xfstests to > see how it goes... So my reaction had been that it would be good to just do something like this: diff --git a/fs/namei.c b/fs/namei.c index 1f28d3f463c3..25c4bcc91142 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -1493,11 +1493,18 @@ static bool __follow_mount_rcu(struct n... if (flags & DCACHE_MOUNTED) { struct mount *mounted = __lookup_mnt(path->mnt, dentry); if (mounted) { + struct dentry *old_dentry = dentry; + unsigned old_seq = *seqp; + path->mnt = &mounted->mnt; dentry = path->dentry = mounted->mnt.mnt_root; nd->state |= ND_JUMPED; *seqp = read_seqcount_begin(&dentry->d_seq); *inode = dentry->d_inode; + + if (read_seqcount_retry(&old_dentry->d_seq, old_seq)) + return false; + /* * We don't need to re-check ->d_seq after this * ->d_inode read - there will be an RCU delay but the above is just whitespace-damaged random monkey-scribbling by yours truly. More like a "shouldn't we do something like this" than a serious patch, in other words. IOW, it has *NOT* had a lot of real thought behind it. Purely a "shouldn't we always clearly check the old sequence number after we've picked up the new one?" Linus