From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from zeniv.linux.org.uk ([195.92.253.2]:55962 "EHLO ZenIV.linux.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755925AbdBQTCX (ORCPT ); Fri, 17 Feb 2017 14:02:23 -0500 Date: Fri, 17 Feb 2017 17:51:18 +0000 From: Al Viro To: James Bottomley Cc: Djalal Harouni , Chris Mason , Theodore Tso , Josh Triplett , "Eric W. Biederman" , Andy Lutomirski , Seth Forshee , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-security-module@vger.kernel.org, Dongsu Park , David Herrmann , Miklos Szeredi , Alban Crequy , "Serge E. Hallyn" , Phil Estes Subject: Re: [RFC 1/1] shiftfs: uid/gid shifting bind mount Message-ID: <20170217175118.GF29622@ZenIV.linux.org.uk> References: <1486235880.2484.17.camel@HansenPartnership.com> <1486235972.2484.19.camel@HansenPartnership.com> <20170217022918.GC29622@ZenIV.linux.org.uk> <1487352280.4351.19.camel@HansenPartnership.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1487352280.4351.19.camel@HansenPartnership.com> Sender: linux-fsdevel-owner@vger.kernel.org List-ID: On Fri, Feb 17, 2017 at 09:24:40AM -0800, James Bottomley wrote: > > What happens when somebody comes along and creates the damn thing on > > the underlying fs? _Not_ via your code, that is - using the > > underlying fs mounted elsewhere. > > Point taken. This, I think fixes the dcache revalidation issue. No, it doesn't. Consider a local filesystem. Those do not have any ->d_revalidate() - the kernel bloody well knows what happens to directories. If e.g. a previously absent file gets created, it's been done by the kernel itself and dentry has been made positive; if a previously existing file has been removed, dentry has either become negative or, if it had been pinned (e.g. file was opened at the time, or your code had been holding a reference to it, etc.) it will be unhashed so that new lookups won't find it, etc. No need to revalidate anything. Now, consider your code. You've done a lookup in the underlying fs. It has, at the time, come negative, so you have your (negative) dentry pointing to that on the underlying fs. If somebody comes and does e.g. mkdir() via your fs, it will call vfs_mkdir() on the underlying sucker, hopefully turning it positive and associate a new in-core inode with your previously negative dentry. But what happens if mkdir is done via underlying fs, or via another instance of yours over the same tree? Underlying dentry goes positive; yours is still negative. The underlying fs either doesn't have ->d_revalidate() or, if there is one it says that the underlying dentry is valid, thank you very much, no need to invalidate anything. In other words, your patch does nothing for object getting created.