From: James Bottomley <James.Bottomley@HansenPartnership.com>
To: Al Viro <viro@ZenIV.linux.org.uk>
Cc: Djalal Harouni <tixxdz@gmail.com>, Chris Mason <clm@fb.com>,
Theodore Tso <tytso@mit.edu>,
Josh Triplett <josh@joshtriplett.org>,
"Eric W. Biederman" <ebiederm@xmission.com>,
Andy Lutomirski <luto@kernel.org>,
Seth Forshee <seth.forshee@canonical.com>,
linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-security-module@vger.kernel.org,
Dongsu Park <dongsu@endocode.com>,
David Herrmann <dh.herrmann@googlemail.com>,
Miklos Szeredi <mszeredi@redhat.com>,
Alban Crequy <alban.crequy@gmail.com>,
"Serge E. Hallyn" <serge@hallyn.com>,
Phil Estes <estesp@gmail.com>
Subject: Re: [RFC 1/1] shiftfs: uid/gid shifting bind mount
Date: Fri, 17 Feb 2017 12:50:12 -0800 [thread overview]
Message-ID: <1487364612.4351.34.camel@HansenPartnership.com> (raw)
In-Reply-To: <20170217175118.GF29622@ZenIV.linux.org.uk>
On Fri, 2017-02-17 at 17:51 +0000, Al Viro wrote:
> 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.
Right at the moment, the upper layer doesn't cache negative dentries,
but that's only a partial solution. I assume you'd now like me to
cache negative dentries (principle of least surprise) and handle the
underlying negative to positive transition in d_revalidate?
I can do that.
James
---
diff --git a/fs/shiftfs.c b/fs/shiftfs.c
index a4a1f98..5b50447 100644
--- a/fs/shiftfs.c
+++ b/fs/shiftfs.c
@@ -118,9 +118,50 @@ static struct dentry *shiftfs_d_real(struct dentry *dentry,
return real;
}
+static int shiftfs_d_weak_revalidate(struct dentry *dentry, unsigned int flags)
+{
+ struct dentry *real = dentry->d_fsdata;
+
+ if (d_unhashed(real))
+ return 0;
+
+ if (!(real->d_flags & DCACHE_OP_WEAK_REVALIDATE))
+ return 1;
+
+ return real->d_op->d_weak_revalidate(real, flags);
+}
+
+static int shiftfs_d_revalidate(struct dentry *dentry, unsigned int flags)
+{
+ struct dentry *real = dentry->d_fsdata;
+ int ret;
+
+ if (d_unhashed(real))
+ return 0;
+
+ /*
+ * inode state of underlying changed from positive to negative
+ * or vice versa; force a lookup to update our view
+ */
+ if (d_is_negative(real) != d_is_negative(dentry))
+ return 0;
+
+ if (!(real->d_flags & DCACHE_OP_REVALIDATE))
+ return 1;
+
+ ret = real->d_op->d_revalidate(real, flags);
+
+ if (ret == 0 && !(flags & LOOKUP_RCU))
+ d_invalidate(real);
+
+ return ret;
+}
+
static const struct dentry_operations shiftfs_dentry_ops = {
.d_release = shiftfs_d_release,
.d_real = shiftfs_d_real,
+ .d_revalidate = shiftfs_d_revalidate,
+ .d_weak_revalidate = shiftfs_d_weak_revalidate,
};
static int shiftfs_readlink(struct dentry *dentry, char __user *data,
@@ -423,7 +464,7 @@ static struct dentry *shiftfs_lookup(struct inode *dir, struct dentry *dentry,
dentry->d_fsdata = new;
if (!new->d_inode)
- return NULL;
+ goto out;
newi = shiftfs_new_inode(dentry->d_sb, new->d_inode->i_mode, new);
if (!newi) {
@@ -431,9 +472,8 @@ static struct dentry *shiftfs_lookup(struct inode *dir, struct dentry *dentry,
return ERR_PTR(-ENOMEM);
}
- d_splice_alias(newi, dentry);
-
- return NULL;
+ out:
+ return d_splice_alias(newi, dentry);
}
static int shiftfs_permission(struct inode *inode, int mask)
next prev parent reply other threads:[~2017-02-17 20:50 UTC|newest]
Thread overview: 82+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-02-04 19:18 [RFC 0/1] shiftfs: uid/gid shifting filesystem (s_user_ns version) James Bottomley
2017-02-04 19:19 ` [RFC 1/1] shiftfs: uid/gid shifting bind mount James Bottomley
2017-02-05 7:51 ` Amir Goldstein
2017-02-06 1:18 ` James Bottomley
2017-02-06 6:59 ` Amir Goldstein
2017-02-06 14:41 ` James Bottomley
2017-02-14 23:03 ` Vivek Goyal
2017-02-14 23:45 ` James Bottomley
2017-02-15 14:17 ` Vivek Goyal
2017-02-16 15:51 ` James Bottomley
2017-02-16 16:42 ` Vivek Goyal
2017-02-16 16:58 ` James Bottomley
2017-02-17 1:57 ` Eric W. Biederman
2017-02-17 8:39 ` Djalal Harouni
2017-02-17 17:19 ` James Bottomley
2017-02-20 4:24 ` Eric W. Biederman
2017-02-22 12:01 ` James Bottomley
2017-02-06 3:25 ` J. R. Okajima
2017-02-06 6:38 ` Amir Goldstein
2017-02-06 16:29 ` James Bottomley
2017-02-06 6:46 ` James Bottomley
2017-02-06 14:50 ` Theodore Ts'o
2017-02-06 15:18 ` James Bottomley
2017-02-06 15:38 ` lkml
2017-02-06 17:32 ` James Bottomley
2017-02-06 21:52 ` J. Bruce Fields
2017-02-07 0:10 ` James Bottomley
2017-02-07 1:35 ` J. Bruce Fields
2017-02-07 19:01 ` James Bottomley
2017-02-07 19:47 ` Christoph Hellwig
2017-02-06 16:24 ` J. R. Okajima
2017-02-21 0:48 ` James Bottomley
2017-02-21 2:57 ` J. R. Okajima
2017-02-21 4:07 ` James Bottomley
2017-02-21 4:34 ` J. R. Okajima
2017-02-07 9:19 ` Christoph Hellwig
2017-02-07 9:39 ` Djalal Harouni
2017-02-07 9:53 ` Christoph Hellwig
2017-02-07 16:37 ` James Bottomley
2017-02-07 17:59 ` Amir Goldstein
2017-02-07 18:10 ` Christoph Hellwig
2017-02-07 19:02 ` James Bottomley
2017-02-07 19:49 ` Christoph Hellwig
2017-02-07 20:05 ` James Bottomley
2017-02-07 21:01 ` Amir Goldstein
2017-02-07 22:25 ` Christoph Hellwig
2017-02-07 23:42 ` James Bottomley
2017-02-08 6:44 ` Amir Goldstein
2017-02-08 11:45 ` Konstantin Khlebnikov
2017-02-08 14:57 ` James Bottomley
2017-02-08 15:15 ` James Bottomley
2017-02-08 1:54 ` Josh Triplett
2017-02-08 15:22 ` James Bottomley
2017-02-09 10:36 ` Josh Triplett
2017-02-09 15:34 ` James Bottomley
2017-02-13 10:15 ` Eric W. Biederman
2017-02-15 9:33 ` Djalal Harouni
2017-02-15 9:37 ` Eric W. Biederman
2017-02-15 10:04 ` Djalal Harouni
2017-02-07 18:20 ` James Bottomley
2017-02-07 19:48 ` Djalal Harouni
2017-02-15 20:34 ` Vivek Goyal
2017-02-16 15:56 ` James Bottomley
2017-02-17 2:55 ` Al Viro
2017-02-17 17:34 ` James Bottomley
2017-02-17 20:35 ` Vivek Goyal
2017-02-19 3:24 ` James Bottomley
2017-02-20 19:26 ` Vivek Goyal
2017-02-21 0:38 ` James Bottomley
2017-02-17 2:29 ` Al Viro
2017-02-17 17:24 ` James Bottomley
2017-02-17 17:51 ` Al Viro
2017-02-17 20:27 ` Vivek Goyal
2017-02-17 20:50 ` James Bottomley [this message]
-- strict thread matches above, loose matches on Subject: below --
2016-05-12 19:06 [RFC 0/1] shiftfs: uid/gid shifting filesystem James Bottomley
2016-05-12 19:07 ` [RFC 1/1] shiftfs: uid/gid shifting bind mount James Bottomley
2016-05-16 19:41 ` Serge Hallyn
2016-05-17 2:28 ` James Bottomley
2016-05-17 3:47 ` Serge E. Hallyn
2016-05-17 10:23 ` James Bottomley
2016-05-17 20:59 ` James Bottomley
2016-05-19 2:28 ` Serge E. Hallyn
2016-05-19 10:53 ` James Bottomley
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1487364612.4351.34.camel@HansenPartnership.com \
--to=james.bottomley@hansenpartnership.com \
--cc=alban.crequy@gmail.com \
--cc=clm@fb.com \
--cc=dh.herrmann@googlemail.com \
--cc=dongsu@endocode.com \
--cc=ebiederm@xmission.com \
--cc=estesp@gmail.com \
--cc=josh@joshtriplett.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-security-module@vger.kernel.org \
--cc=luto@kernel.org \
--cc=mszeredi@redhat.com \
--cc=serge@hallyn.com \
--cc=seth.forshee@canonical.com \
--cc=tixxdz@gmail.com \
--cc=tytso@mit.edu \
--cc=viro@ZenIV.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome