lkml.org 
[lkml]   [2016]   [Oct]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH 1/8] vfs - change d_manage() to take a struct path
    From
    Date
    For the autofs module to be able to reliably check if a dentry is a
    mountpoint in a multiple namespace environment the ->d_manage() dentry
    operation will need to take a path argument instead of a dentry.

    Signed-off-by: Ian Kent <raven@themaw.net>
    Cc: Al Viro <viro@ZenIV.linux.org.uk>
    Cc: Eric W. Biederman <ebiederm@xmission.com>
    Cc: Omar Sandoval <osandov@osandov.com>
    ---
    Documentation/filesystems/Locking | 2 +-
    Documentation/filesystems/vfs.txt | 2 +-
    fs/autofs4/root.c | 5 +++--
    fs/namei.c | 13 ++++++-------
    include/linux/dcache.h | 2 +-
    5 files changed, 12 insertions(+), 12 deletions(-)

    diff --git a/Documentation/filesystems/Locking b/Documentation/filesystems/Locking
    index fe15682..1949ac4 100644
    --- a/Documentation/filesystems/Locking
    +++ b/Documentation/filesystems/Locking
    @@ -20,7 +20,7 @@ prototypes:
    void (*d_iput)(struct dentry *, struct inode *);
    char *(*d_dname)((struct dentry *dentry, char *buffer, int buflen);
    struct vfsmount *(*d_automount)(struct path *path);
    - int (*d_manage)(struct dentry *, bool);
    + int (*d_manage)(struct path *, bool);
    struct dentry *(*d_real)(struct dentry *, const struct inode *,
    unsigned int);

    diff --git a/Documentation/filesystems/vfs.txt b/Documentation/filesystems/vfs.txt
    index bc3b8e0..db70d71 100644
    --- a/Documentation/filesystems/vfs.txt
    +++ b/Documentation/filesystems/vfs.txt
    @@ -934,7 +934,7 @@ struct dentry_operations {
    void (*d_iput)(struct dentry *, struct inode *);
    char *(*d_dname)(struct dentry *, char *, int);
    struct vfsmount *(*d_automount)(struct path *);
    - int (*d_manage)(struct dentry *, bool);
    + int (*d_manage)(struct path *, bool);
    struct dentry *(*d_real)(struct dentry *, const struct inode *,
    unsigned int);
    };
    diff --git a/fs/autofs4/root.c b/fs/autofs4/root.c
    index a11f731..5cbd4e1 100644
    --- a/fs/autofs4/root.c
    +++ b/fs/autofs4/root.c
    @@ -32,7 +32,7 @@ static int autofs4_dir_open(struct inode *inode, struct file *file);
    static struct dentry *autofs4_lookup(struct inode *,
    struct dentry *, unsigned int);
    static struct vfsmount *autofs4_d_automount(struct path *);
    -static int autofs4_d_manage(struct dentry *, bool);
    +static int autofs4_d_manage(struct path *, bool);
    static void autofs4_dentry_release(struct dentry *);

    const struct file_operations autofs4_root_operations = {
    @@ -421,8 +421,9 @@ static struct vfsmount *autofs4_d_automount(struct path *path)
    return NULL;
    }

    -static int autofs4_d_manage(struct dentry *dentry, bool rcu_walk)
    +static int autofs4_d_manage(struct path *path, bool rcu_walk)
    {
    + struct dentry *dentry = path->dentry;
    struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
    struct autofs_info *ino = autofs4_dentry_ino(dentry);
    int status;
    diff --git a/fs/namei.c b/fs/namei.c
    index a7f601c..704766a 100644
    --- a/fs/namei.c
    +++ b/fs/namei.c
    @@ -1200,7 +1200,7 @@ static int follow_managed(struct path *path, struct nameidata *nd)
    if (managed & DCACHE_MANAGE_TRANSIT) {
    BUG_ON(!path->dentry->d_op);
    BUG_ON(!path->dentry->d_op->d_manage);
    - ret = path->dentry->d_op->d_manage(path->dentry, false);
    + ret = path->dentry->d_op->d_manage(path, false);
    if (ret < 0)
    break;
    }
    @@ -1263,10 +1263,10 @@ int follow_down_one(struct path *path)
    }
    EXPORT_SYMBOL(follow_down_one);

    -static inline int managed_dentry_rcu(struct dentry *dentry)
    +static inline int managed_dentry_rcu(struct path *path)
    {
    - return (dentry->d_flags & DCACHE_MANAGE_TRANSIT) ?
    - dentry->d_op->d_manage(dentry, true) : 0;
    + return (path->dentry->d_flags & DCACHE_MANAGE_TRANSIT) ?
    + path->dentry->d_op->d_manage(path, true) : 0;
    }

    /*
    @@ -1282,7 +1282,7 @@ static bool __follow_mount_rcu(struct nameidata *nd, struct path *path,
    * Don't forget we might have a non-mountpoint managed dentry
    * that wants to block transit.
    */
    - switch (managed_dentry_rcu(path->dentry)) {
    + switch (managed_dentry_rcu(path)) {
    case -ECHILD:
    default:
    return false;
    @@ -1392,8 +1392,7 @@ int follow_down(struct path *path)
    if (managed & DCACHE_MANAGE_TRANSIT) {
    BUG_ON(!path->dentry->d_op);
    BUG_ON(!path->dentry->d_op->d_manage);
    - ret = path->dentry->d_op->d_manage(
    - path->dentry, false);
    + ret = path->dentry->d_op->d_manage(path, false);
    if (ret < 0)
    return ret == -EISDIR ? 0 : ret;
    }
    diff --git a/include/linux/dcache.h b/include/linux/dcache.h
    index 5beed7b..798bc04 100644
    --- a/include/linux/dcache.h
    +++ b/include/linux/dcache.h
    @@ -139,7 +139,7 @@ struct dentry_operations {
    void (*d_iput)(struct dentry *, struct inode *);
    char *(*d_dname)(struct dentry *, char *, int);
    struct vfsmount *(*d_automount)(struct path *);
    - int (*d_manage)(struct dentry *, bool);
    + int (*d_manage)(struct path *, bool);
    struct dentry *(*d_real)(struct dentry *, const struct inode *,
    unsigned int);
    } ____cacheline_aligned;
    \
     
     \ /
      Last update: 2016-10-11 07:37    [W:4.219 / U:0.520 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site