Re: [PATCH 04/79] ext4: split inode_operations for encrypted symlinks off the rest

From: Jan Kara
Date: Tue May 05 2015 - 05:10:45 EST


On Tue 05-05-15 06:21:38, Al Viro wrote:
> From: Al Viro <viro@xxxxxxxxxxxxxxxxxx>
>
> Signed-off-by: Al Viro <viro@xxxxxxxxxxxxxxxxxx>
Looks good. You can add:
Reviewed-by: Jan Kara <jack@xxxxxxx>

Honza

> ---
> fs/ext4/ext4.h | 1 +
> fs/ext4/inode.c | 10 ++++++++--
> fs/ext4/namei.c | 9 +++++----
> fs/ext4/symlink.c | 30 ++++++++++--------------------
> 4 files changed, 24 insertions(+), 26 deletions(-)
>
> diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
> index ef267ad..2640913 100644
> --- a/fs/ext4/ext4.h
> +++ b/fs/ext4/ext4.h
> @@ -2849,6 +2849,7 @@ extern int ext4_mpage_readpages(struct address_space *mapping,
> unsigned nr_pages);
>
> /* symlink.c */
> +extern const struct inode_operations ext4_encrypted_symlink_inode_operations;
> extern const struct inode_operations ext4_symlink_inode_operations;
> extern const struct inode_operations ext4_fast_symlink_inode_operations;
>
> diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
> index cbd0654..a320558 100644
> --- a/fs/ext4/inode.c
> +++ b/fs/ext4/inode.c
> @@ -4211,8 +4211,14 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino)
> inode->i_op = &ext4_dir_inode_operations;
> inode->i_fop = &ext4_dir_operations;
> } else if (S_ISLNK(inode->i_mode)) {
> - if (ext4_inode_is_fast_symlink(inode) &&
> - !ext4_encrypted_inode(inode)) {
> + if (ext4_encrypted_inode(inode)) {
> +#ifdef CONFIG_EXT4_FS_ENCRYPTION
> + inode->i_op = &ext4_encrypted_symlink_inode_operations;
> + ext4_set_aops(inode);
> +#else
> + BUILD_BUG();
> +#endif
> + } else if (ext4_inode_is_fast_symlink(inode)) {
> inode->i_op = &ext4_fast_symlink_inode_operations;
> nd_terminate_link(ei->i_data, inode->i_size,
> sizeof(ei->i_data) - 1);
> diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
> index 7223b0b..84b1920 100644
> --- a/fs/ext4/namei.c
> +++ b/fs/ext4/namei.c
> @@ -3266,10 +3266,12 @@ static int ext4_symlink(struct inode *dir,
> goto err_drop_inode;
> sd->len = cpu_to_le16(ostr.len);
> disk_link.name = (char *) sd;
> + inode->i_op = &ext4_encrypted_symlink_inode_operations;
> }
>
> if ((disk_link.len > EXT4_N_BLOCKS * 4)) {
> - inode->i_op = &ext4_symlink_inode_operations;
> + if (!encryption_required)
> + inode->i_op = &ext4_symlink_inode_operations;
> ext4_set_aops(inode);
> /*
> * We cannot call page_symlink() with transaction started
> @@ -3309,9 +3311,8 @@ static int ext4_symlink(struct inode *dir,
> } else {
> /* clear the extent format for fast symlink */
> ext4_clear_inode_flag(inode, EXT4_INODE_EXTENTS);
> - inode->i_op = encryption_required ?
> - &ext4_symlink_inode_operations :
> - &ext4_fast_symlink_inode_operations;
> + if (!encryption_required)
> + inode->i_op = &ext4_fast_symlink_inode_operations;
> memcpy((char *)&EXT4_I(inode)->i_data, disk_link.name,
> disk_link.len);
> inode->i_size = disk_link.len - 1;
> diff --git a/fs/ext4/symlink.c b/fs/ext4/symlink.c
> index 19f78f2..4ea5a01 100644
> --- a/fs/ext4/symlink.c
> +++ b/fs/ext4/symlink.c
> @@ -35,9 +35,6 @@ static void *ext4_follow_link(struct dentry *dentry, struct nameidata *nd)
> int res;
> u32 plen, max_size = inode->i_sb->s_blocksize;
>
> - if (!ext4_encrypted_inode(inode))
> - return page_follow_link_light(dentry, nd);
> -
> ctx = ext4_get_fname_crypto_ctx(inode, inode->i_sb->s_blocksize);
> if (IS_ERR(ctx))
> return ctx;
> @@ -97,18 +94,16 @@ errout:
> return ERR_PTR(res);
> }
>
> -static void ext4_put_link(struct dentry *dentry, struct nameidata *nd,
> - void *cookie)
> -{
> - struct page *page = cookie;
> -
> - if (!page) {
> - kfree(nd_get_link(nd));
> - } else {
> - kunmap(page);
> - page_cache_release(page);
> - }
> -}
> +const struct inode_operations ext4_encrypted_symlink_inode_operations = {
> + .readlink = generic_readlink,
> + .follow_link = ext4_follow_link,
> + .put_link = kfree_put_link,
> + .setattr = ext4_setattr,
> + .setxattr = generic_setxattr,
> + .getxattr = generic_getxattr,
> + .listxattr = ext4_listxattr,
> + .removexattr = generic_removexattr,
> +};
> #endif
>
> static void *ext4_follow_fast_link(struct dentry *dentry, struct nameidata *nd)
> @@ -120,13 +115,8 @@ static void *ext4_follow_fast_link(struct dentry *dentry, struct nameidata *nd)
>
> const struct inode_operations ext4_symlink_inode_operations = {
> .readlink = generic_readlink,
> -#ifdef CONFIG_EXT4_FS_ENCRYPTION
> - .follow_link = ext4_follow_link,
> - .put_link = ext4_put_link,
> -#else
> .follow_link = page_follow_link_light,
> .put_link = page_put_link,
> -#endif
> .setattr = ext4_setattr,
> .setxattr = generic_setxattr,
> .getxattr = generic_getxattr,
> --
> 2.1.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
Jan Kara <jack@xxxxxxx>
SUSE Labs, CR
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/