lkml.org 
[lkml]   [2020]   [Sep]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH 4/5] fscrypt: Have filesystems handle their d_ops
    From
    This shifts the responsibility of setting up dentry operations from
    fscrypt to the individual filesystems, allowing them to have their own
    operations while still setting fscrypt's d_revalidate as appropriate.

    Most filesystems can just use generic_set_encrypted_ci_d_ops, unless
    they have their own specific dentry operations as well. That operation
    will set the minimal d_ops required under the circumstances.

    Since the fscrypt d_ops are set later on, we must set all d_ops there,
    since we cannot adjust those later on. This should not result in any
    change in behavior.

    Signed-off-by: Daniel Rosenberg <drosen@google.com>
    ---
    fs/crypto/fname.c | 4 ----
    fs/crypto/hooks.c | 1 -
    fs/ext4/dir.c | 7 -------
    fs/ext4/ext4.h | 4 ----
    fs/ext4/namei.c | 1 +
    fs/ext4/super.c | 5 -----
    fs/f2fs/dir.c | 7 -------
    fs/f2fs/f2fs.h | 3 ---
    fs/f2fs/namei.c | 1 +
    fs/f2fs/super.c | 1 -
    fs/ubifs/dir.c | 1 +
    include/linux/fscrypt.h | 5 +++--
    12 files changed, 6 insertions(+), 34 deletions(-)

    diff --git a/fs/crypto/fname.c b/fs/crypto/fname.c
    index d45db23ff6c4..efa942e3ab53 100644
    --- a/fs/crypto/fname.c
    +++ b/fs/crypto/fname.c
    @@ -581,7 +581,3 @@ int fscrypt_d_revalidate(struct dentry *dentry, unsigned int flags)
    return valid;
    }
    EXPORT_SYMBOL_GPL(fscrypt_d_revalidate);
    -
    -const struct dentry_operations fscrypt_d_ops = {
    - .d_revalidate = fscrypt_d_revalidate,
    -};
    diff --git a/fs/crypto/hooks.c b/fs/crypto/hooks.c
    index 09fb8aa0f2e9..7d6898ca152a 100644
    --- a/fs/crypto/hooks.c
    +++ b/fs/crypto/hooks.c
    @@ -118,7 +118,6 @@ int __fscrypt_prepare_lookup(struct inode *dir, struct dentry *dentry,
    spin_lock(&dentry->d_lock);
    dentry->d_flags |= DCACHE_ENCRYPTED_NAME;
    spin_unlock(&dentry->d_lock);
    - d_set_d_op(dentry, &fscrypt_d_ops);
    }
    return err;
    }
    diff --git a/fs/ext4/dir.c b/fs/ext4/dir.c
    index b437120f0b3f..f0135042c2ad 100644
    --- a/fs/ext4/dir.c
    +++ b/fs/ext4/dir.c
    @@ -667,10 +667,3 @@ const struct file_operations ext4_dir_operations = {
    .open = ext4_dir_open,
    .release = ext4_release_dir,
    };
    -
    -#ifdef CONFIG_UNICODE
    -const struct dentry_operations ext4_dentry_ops = {
    - .d_hash = generic_ci_d_hash,
    - .d_compare = generic_ci_d_compare,
    -};
    -#endif
    diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
    index 5df0fbd6add4..cbde8447eddd 100644
    --- a/fs/ext4/ext4.h
    +++ b/fs/ext4/ext4.h
    @@ -3247,10 +3247,6 @@ static inline void ext4_unlock_group(struct super_block *sb,
    /* dir.c */
    extern const struct file_operations ext4_dir_operations;

    -#ifdef CONFIG_UNICODE
    -extern const struct dentry_operations ext4_dentry_ops;
    -#endif
    -
    /* file.c */
    extern const struct inode_operations ext4_file_inode_operations;
    extern const struct file_operations ext4_file_operations;
    diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
    index ea7dee80c8a4..592ea2f8ea19 100644
    --- a/fs/ext4/namei.c
    +++ b/fs/ext4/namei.c
    @@ -1615,6 +1615,7 @@ static struct buffer_head *ext4_lookup_entry(struct inode *dir,
    struct buffer_head *bh;

    err = ext4_fname_prepare_lookup(dir, dentry, &fname);
    + generic_set_encrypted_ci_d_ops(dentry);
    if (err == -ENOENT)
    return NULL;
    if (err)
    diff --git a/fs/ext4/super.c b/fs/ext4/super.c
    index 8a261a6bb608..ce67540bd882 100644
    --- a/fs/ext4/super.c
    +++ b/fs/ext4/super.c
    @@ -4719,11 +4719,6 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
    goto failed_mount4;
    }

    -#ifdef CONFIG_UNICODE
    - if (sb->s_encoding)
    - sb->s_d_op = &ext4_dentry_ops;
    -#endif
    -
    sb->s_root = d_make_root(root);
    if (!sb->s_root) {
    ext4_msg(sb, KERN_ERR, "get root dentry failed");
    diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c
    index a18f839b6fb2..0766e6250a88 100644
    --- a/fs/f2fs/dir.c
    +++ b/fs/f2fs/dir.c
    @@ -1106,10 +1106,3 @@ const struct file_operations f2fs_dir_operations = {
    .compat_ioctl = f2fs_compat_ioctl,
    #endif
    };
    -
    -#ifdef CONFIG_UNICODE
    -const struct dentry_operations f2fs_dentry_ops = {
    - .d_hash = generic_ci_d_hash,
    - .d_compare = generic_ci_d_compare,
    -};
    -#endif
    diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
    index 61fd78b1b1bd..af1d469e8c1e 100644
    --- a/fs/f2fs/f2fs.h
    +++ b/fs/f2fs/f2fs.h
    @@ -3774,9 +3774,6 @@ static inline void f2fs_update_sit_info(struct f2fs_sb_info *sbi) {}
    #endif

    extern const struct file_operations f2fs_dir_operations;
    -#ifdef CONFIG_UNICODE
    -extern const struct dentry_operations f2fs_dentry_ops;
    -#endif
    extern const struct file_operations f2fs_file_operations;
    extern const struct inode_operations f2fs_file_inode_operations;
    extern const struct address_space_operations f2fs_dblock_aops;
    diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c
    index 90565432559c..70a8e516fd32 100644
    --- a/fs/f2fs/namei.c
    +++ b/fs/f2fs/namei.c
    @@ -492,6 +492,7 @@ static struct dentry *f2fs_lookup(struct inode *dir, struct dentry *dentry,
    }

    err = f2fs_prepare_lookup(dir, dentry, &fname);
    + generic_set_encrypted_ci_d_ops(dentry);
    if (err == -ENOENT)
    goto out_splice;
    if (err)
    diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
    index 5fe614011e41..63c744c6aeff 100644
    --- a/fs/f2fs/super.c
    +++ b/fs/f2fs/super.c
    @@ -3410,7 +3410,6 @@ static int f2fs_setup_casefold(struct f2fs_sb_info *sbi)

    sbi->sb->s_encoding = encoding;
    sbi->sb->s_encoding_flags = encoding_flags;
    - sbi->sb->s_d_op = &f2fs_dentry_ops;
    }
    #else
    if (f2fs_sb_has_casefold(sbi)) {
    diff --git a/fs/ubifs/dir.c b/fs/ubifs/dir.c
    index 9d042942d8b2..fdae78934c02 100644
    --- a/fs/ubifs/dir.c
    +++ b/fs/ubifs/dir.c
    @@ -209,6 +209,7 @@ static struct dentry *ubifs_lookup(struct inode *dir, struct dentry *dentry,
    dbg_gen("'%pd' in dir ino %lu", dentry, dir->i_ino);

    err = fscrypt_prepare_lookup(dir, dentry, &nm);
    + generic_set_encrypted_ci_d_ops(dentry);
    if (err == -ENOENT)
    return d_splice_alias(NULL, dentry);
    if (err)
    diff --git a/include/linux/fscrypt.h b/include/linux/fscrypt.h
    index 265b1e9119dc..fc04452921b4 100644
    --- a/include/linux/fscrypt.h
    +++ b/include/linux/fscrypt.h
    @@ -740,8 +740,9 @@ static inline int fscrypt_prepare_rename(struct inode *old_dir,
    * filenames are presented in encrypted form. Therefore, we'll try to set up
    * the directory's encryption key, but even without it the lookup can continue.
    *
    - * This also installs a custom ->d_revalidate() method which will invalidate the
    - * dentry if it was created without the key and the key is later added.
    + * After calling this function, a filesystem should ensure that its dentry
    + * operations contain fscrypt_d_revalidate if DCACHE_ENCRYPTED_NAME was set,
    + * so that the dentry can be invalidated if the key is later added.
    *
    * Return: 0 on success; -ENOENT if key is unavailable but the filename isn't a
    * correctly formed encoded ciphertext name, so a negative dentry should be
    --
    2.28.0.681.g6f77f65b4e-goog
    \
     
     \ /
      Last update: 2020-09-23 03:09    [W:6.889 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site