On Tue, May 31, 2016 at 08:31:33PM -0400, James Bottomley wrote:

> +static struct dentry *shiftfs_lookup(struct inode *dir, struct dentry 
> *dentry,
> +                                  unsigned int flags)
> +{
> +     struct dentry *real = dir->i_private, *new;
> +     struct inode *reali = real->d_inode, *newi;
> +     const struct cred *oldcred, *newcred;
> +
> +     /* note: violation of usual fs rules here: dentries are never
> +      * added with d_add.  This is because we want no dentry cache
> +      * for shiftfs.  All lookups proceed through the dentry cache
> +      * of the underlying filesystem, meaning we always see any
> +      * changes in the underlying */
> +
> +     inode_lock(reali);
> +     oldcred = shiftfs_new_creds(&newcred, dentry->d_sb);
> +     new = lookup_one_len(dentry->d_name.name, real, dentry->d_name.len);
> +     shiftfs_old_creds(oldcred, &newcred);
> +     inode_unlock(reali);
> +
> +     if (IS_ERR(new))
> +             return new;
> +
> +     dentry->d_fsdata = new;
> +
> +     if (!new->d_inode)
> +             return NULL;
> +
> +     newi = shiftfs_new_inode(dentry->d_sb, new->d_inode->i_mode, new);
> +     if (!newi) {
> +             dput(new);
> +             return ERR_PTR(-ENOMEM);
> +     }
> +
> +     d_splice_alias(newi, dentry);
> +
> +     return NULL;

This is utter crap.  First of all, d_splice_alias() *WILL* hash them, so you
get all the coherency problems, in spades.  Moreover, if you did manage to
avoid hashing, you would get something absolutely unusable.
        * no mounting of anything on top of that thing
        * performance shot to hell
and that's just for starters.  I hadn't looked into the locking and semantics
issues - those would really depends upon how you would achieve that "no dentry
cache" thing; again, right now that's *not* what your code is doing.

PS: and then there's the choice of name.  I mean, just try to say it over the
phone several times in a row...

Reply via email to