Consolidate Post read processing code
Subsystems (10)
cover Consolidate Post read processing code
This patchset moves the "post read processing" code into a file of its own and gets the generic do_mpage_readpge() to make use of the functionality provided. With these changes in place, the patchset changes Ext4 to use mpage_readpage[s] instead of its own custom ext4_readpages() function. This is done to reduce duplicity of code across filesystems. Based on the reviews provided for this patchset, I will change F2FS to use mpage_readpage[s] and post the next version of this patchset to linux-fsdevel mailing list.
The patchset also includes patches from previous postings i.e. patches to replace per-filesystem encryption config options with a single config option that affects all filesystems making use of fscrypt code.
Chandan Rajendra (10):
ext4: use IS_ENCRYPTED() to check encryption status
f2fs: use IS_ENCRYPTED() to check encryption status
fscrypt: remove filesystem specific build config option Consolidate "post read processing" into a new file
fsverity: Add call back to decide if verity check has to be performed Introduce REQ_POST_READ_PROC bio flag
fsverity: Add call back to determine readpage limit
fsverity: Add call back to verify file holes
fs/mpage.c: Integrate post read processing
ext4: Wire up ext4_readpage[s] to use mpage_readpage[s]
Documentation/filesystems/fscrypt.rst | 4 +- arch/mips/configs/generic_defconfig | 2 +- arch/nds32/configs/defconfig | 2 +- arch/s390/configs/debug_defconfig | 2 +- arch/s390/configs/performance_defconfig | 2 +- fs/Makefile | 3 +- fs/crypto/Kconfig | 5 +- fs/crypto/bio.c | 21 +- fs/crypto/crypto.c | 1 + fs/crypto/fscrypt_private.h | 4 +- fs/ext4/Kconfig | 15 - fs/ext4/Makefile | 2 +- fs/ext4/dir.c | 10 +- fs/ext4/ext4.h | 14 +- fs/ext4/ext4_jbd2.h | 2 +- fs/ext4/extents.c | 4 +- fs/ext4/ialloc.c | 2 +- fs/ext4/inode.c | 29 +- fs/ext4/ioctl.c | 4 +- fs/ext4/move_extent.c | 3 +- fs/ext4/namei.c | 18 +- fs/ext4/page-io.c | 9 +- fs/ext4/readpage.c | 444 ------------------------ fs/ext4/super.c | 43 ++- fs/ext4/sysfs.c | 4 +- fs/f2fs/Kconfig | 12 +- fs/f2fs/data.c | 4 +- fs/f2fs/dir.c | 10 +- fs/f2fs/f2fs.h | 14 +- fs/f2fs/file.c | 10 +- fs/f2fs/inode.c | 4 +- fs/f2fs/namei.c | 6 +- fs/f2fs/super.c | 8 +- fs/f2fs/sysfs.c | 4 +- fs/mpage.c | 77 +++- fs/post_read_process.c | 128 +++++++ fs/ubifs/Kconfig | 12 +- fs/ubifs/Makefile | 2 +- fs/ubifs/ioctl.c | 4 +- fs/ubifs/sb.c | 2 +- fs/ubifs/super.c | 2 +- fs/ubifs/ubifs.h | 5 +- fs/verity/verify.c | 12 + include/linux/blk_types.h | 2 + include/linux/fs.h | 4 +- include/linux/fscrypt.h | 405 ++++++++++++++++++++- include/linux/fscrypt_notsupp.h | 231 ------------ include/linux/fscrypt_supp.h | 204 ----------- include/linux/fsverity.h | 3 + include/linux/post_read_process.h | 21 ++ 50 files changed, 757 insertions(+), 1078 deletions(-) delete mode 100644 fs/ext4/readpage.c create mode 100644 fs/post_read_process.c delete mode 100644 include/linux/fscrypt_notsupp.h delete mode 100644 include/linux/fscrypt_supp.h create mode 100644 include/linux/post_read_process.h
Signature · 1 line
2.19.1
RFC PATCH 1/10 ext4: use IS_ENCRYPTED() to check encryption status
This commit removes the ext4 specific ext4_encrypted_inode() and makes use of the generic IS_ENCRYPTED() macro to check for the encryption status of an inode.
--- fs/ext4/dir.c | 8 ++++---- fs/ext4/ext4.h | 5 ----- fs/ext4/ext4_jbd2.h | 2 +- fs/ext4/extents.c | 4 ++-- fs/ext4/ialloc.c | 2 +- fs/ext4/inode.c | 16 +++++++--------- fs/ext4/move_extent.c | 3 +-- fs/ext4/namei.c | 8 ++++---- fs/ext4/page-io.c | 3 +-- fs/ext4/readpage.c | 2 +- 10 files changed, 22 insertions(+), 31 deletions(-)
fs/ext4/dir.c +4 -4
@@ -111,7 +111,7 @@ static int ext4_readdir(struct file *file, struct dir_context *ctx)int dir_has_error =0 ;struct fscrypt_str fstr =FSTR_INIT (NULL ,0 ); -if (ext4_encrypted_inode (inode)) { +if (IS_ENCRYPTED (inode)) { err =fscrypt_get_encryption_info (inode);if (err && err != -ENOKEY )return err;
@@ -138,7 +138,7 @@ static int ext4_readdir(struct file *file, struct dir_context *ctx)return err; } -if (ext4_encrypted_inode (inode)) { +if (IS_ENCRYPTED (inode)) { err =fscrypt_fname_alloc_buffer (inode,EXT4_NAME_LEN , &fstr);if (err <0 )return err;
@@ -245,7 +245,7 @@ static int ext4_readdir(struct file *file, struct dir_context *ctx) offset +=ext4_rec_len_from_disk (de->rec_len, sb->s_blocksize); if (le32_to_cpu(de->inode)) { - if (!ext4_encrypted_inode(inode)) { + if (!IS_ENCRYPTED(inode)) { if (!dir_emit(ctx, de->name, de->name_len, le32_to_cpu(de->inode),
@@ -613,7 +613,7 @@ static int ext4_dx_readdir(struct file *file, struct dir_context *ctx)static int ext4_dir_open (struct inode * inode,struct file * filp) { -if (ext4_encrypted_inode (inode)) +if (IS_ENCRYPTED (inode))return fscrypt_get_encryption_info (inode) ? -EACCES :0 ;return 0 ; }
fs/ext4/ext4.h +0 -5
@@ -2286,11 +2286,6 @@ extern unsigned ext4_free_clusters_after_init(struct super_block *sb, struct ext4_group_desc *gdp);ext4_fsblk_t ext4_inode_to_goal_block (struct inode *); -static inline bool ext4_encrypted_inode (struct inode *inode) -{ -return ext4_test_inode_flag (inode,EXT4_INODE_ENCRYPT ); -} -#ifdef CONFIG_EXT4_FS_ENCRYPTION static inline int ext4_fname_setup_filename(struct inode *dir, const struct qstr *iname,
fs/ext4/ext4_jbd2.h +1 -1
@@ -411,7 +411,7 @@ static inline int ext4_inode_journal_mode(struct inode *inode) (ext4_test_inode_flag(inode, EXT4_INODE_JOURNAL_DATA) && !test_opt(inode->i_sb, DELALLOC))) {/* We do not support data journalling for encrypted data */ -if (S_ISREG (inode->i_mode) &&ext4_encrypted_inode (inode)) +if (S_ISREG (inode->i_mode) &&IS_ENCRYPTED (inode))return EXT4_INODE_ORDERED_DATA_MODE ;/* ordered */ return EXT4_INODE_JOURNAL_DATA_MODE ;/* journal data */ }
fs/ext4/extents.c +2 -2
@@ -3631,7 +3631,7 @@ static int ext4_ext_convert_to_initialized(handle_t *handle, max_zeroout = sbi->s_extent_max_zeroout_kb >> (inode->i_sb->s_blocksize_bits -10 ); -if (ext4_encrypted_inode (inode)) +if (IS_ENCRYPTED (inode)) max_zeroout =0 ;/*
@@ -4818,7 +4818,7 @@ long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len)* leave it disabled for encrypted inodes for now. This is a * bug we should fix.... */ -if (ext4_encrypted_inode (inode) && +if (IS_ENCRYPTED (inode) && (mode & (FALLOC_FL_COLLAPSE_RANGE |FALLOC_FL_INSERT_RANGE |FALLOC_FL_ZERO_RANGE )))return -EOPNOTSUPP ;
fs/ext4/ialloc.c +1 -1
@@ -771,7 +771,7 @@ struct inode *__ext4_new_inode(handle_t *handle, struct inode *dir,if (unlikely (ext4_forced_shutdown (sbi)))return ERR_PTR (-EIO ); -if ((ext4_encrypted_inode (dir) ||DUMMY_ENCRYPTION_ENABLED (sbi)) && +if ((IS_ENCRYPTED (dir) ||DUMMY_ENCRYPTION_ENABLED (sbi)) && (S_ISREG (mode) ||S_ISDIR (mode) ||S_ISLNK (mode)) && !(i_flags &EXT4_EA_INODE_FL )) { err =fscrypt_get_encryption_info (dir);
fs/ext4/inode.c +7 -9
@@ -415,7 +415,7 @@ int ext4_issue_zeroout(struct inode *inode, ext4_lblk_t lblk, ext4_fsblk_t pblk, {int ret; -if (ext4_encrypted_inode (inode)) +if (IS_ENCRYPTED (inode))return fscrypt_zeroout_range (inode, lblk, pblk, len); ret =sb_issue_zeroout (inode->i_sb, pblk, len,GFP_NOFS );
@@ -1217,8 +1217,7 @@ static int ext4_block_write_begin(struct page *page, loff_t pos, unsigned len, (block_start < from || block_end > to)) {ll_rw_block (REQ_OP_READ ,0 ,1 , &bh); *wait_bh++ = bh; - decrypt =ext4_encrypted_inode (inode) && -S_ISREG (inode->i_mode); + decrypt =IS_ENCRYPTED (inode) &&S_ISREG (inode->i_mode); } }/*
@@ -3881,7 +3880,7 @@ static ssize_t ext4_direct_IO(struct kiocb *iocb, struct iov_iter *iter)ssize_t ret;#ifdef CONFIG_EXT4_FS_ENCRYPTION -if (ext4_encrypted_inode (inode) &&S_ISREG (inode->i_mode)) +if (IS_ENCRYPTED (inode) &&S_ISREG (inode->i_mode))return 0 ;#endif
@@ -4068,8 +4067,7 @@ static int __ext4_block_zero_page_range(handle_t *handle,/* Uhhuh. Read error. Complain and punt. */ if (!buffer_uptodate (bh)) goto unlock; -if (S_ISREG (inode->i_mode) && -ext4_encrypted_inode (inode)) { +if (S_ISREG (inode->i_mode) &&IS_ENCRYPTED (inode)) {/* We expect the key to be set. */ BUG_ON (!fscrypt_has_encryption_key (inode));BUG_ON (blocksize !=PAGE_SIZE );
@@ -4145,7 +4143,7 @@ static int ext4_block_truncate_page(handle_t *handle,struct inode *inode = mapping->host;/* If we are processing an encrypted inode during orphan list handling */ -if (ext4_encrypted_inode (inode) && !fscrypt_has_encryption_key (inode)) +if (IS_ENCRYPTED (inode) && !fscrypt_has_encryption_key (inode))return 0 ; blocksize = inode->i_sb->s_blocksize;
@@ -4725,7 +4723,7 @@ static bool ext4_should_use_dax(struct inode *inode)return false;if (ext4_has_inline_data (inode))return false; -if (ext4_encrypted_inode (inode)) +if (ext4_test_inode_flag (inode,EXT4_INODE_ENCRYPT ))return false;if (ext4_test_inode_flag (inode,EXT4_INODE_VERITY ))return false;
@@ -5079,7 +5077,7 @@ struct inode *__ext4_iget(struct super_block *sb, unsigned long ino, ret = -EFSCORRUPTED ; goto bad_inode; } -if (ext4_encrypted_inode (inode)) { +if (IS_ENCRYPTED (inode)) { inode->i_op = &ext4_encrypted_symlink_inode_operations;ext4_set_aops (inode); }else if (ext4_inode_is_fast_symlink (inode)) {
fs/ext4/move_extent.c +1 -2
@@ -592,8 +592,7 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, __u64 orig_blk,return -EOPNOTSUPP ; } -if (ext4_encrypted_inode (orig_inode) || -ext4_encrypted_inode (donor_inode)) { +if (IS_ENCRYPTED (orig_inode) ||IS_ENCRYPTED (donor_inode)) {ext4_msg (orig_inode->i_sb,KERN_ERR ,"Online defrag not supported for encrypted files" );return -EOPNOTSUPP ;
fs/ext4/namei.c +4 -4
@@ -621,7 +621,7 @@ static struct stats dx_show_leaf(struct inode *dir, name = de->name; len = de->name_len; -if (ext4_encrypted_inode (dir)) +if (IS_ENCRYPTED (dir)) res =fscrypt_get_encryption_info (dir);if (res) { printk(KERN_WARNING "Error setting up"
@@ -986,7 +986,7 @@ static int htree_dirblock_to_tree(struct file *dir_file, EXT4_DIR_REC_LEN(0));#ifdef CONFIG_EXT4_FS_ENCRYPTION /* Check if the directory is encrypted */ -if (ext4_encrypted_inode (dir)) { +if (IS_ENCRYPTED (dir)) { err =fscrypt_get_encryption_info (dir);if (err <0 ) {brelse (bh);
@@ -1015,7 +1015,7 @@ static int htree_dirblock_to_tree(struct file *dir_file,continue ;if (de->inode ==0 )continue ; -if (!ext4_encrypted_inode (dir)) { +if (!IS_ENCRYPTED (dir)) { tmp_str.name = de->name; tmp_str.len = de->name_len; err = ext4_htree_store_dirent(dir_file,
@@ -1578,7 +1578,7 @@ static struct dentry *ext4_lookup(struct inode *dir, struct dentry *dentry, unsi ino);return ERR_PTR (-EFSCORRUPTED ); } -if (!IS_ERR (inode) &&ext4_encrypted_inode (dir) && +if (!IS_ERR (inode) &&IS_ENCRYPTED (dir) && (S_ISDIR (inode->i_mode) ||S_ISLNK (inode->i_mode)) && !fscrypt_has_permitted_context (dir, inode)) { ext4_warning(inode->i_sb,
fs/ext4/page-io.c +1 -2
@@ -477,8 +477,7 @@ int ext4_bio_write_page(struct ext4_io_submit *io, bh = head =page_buffers (page); -if (ext4_encrypted_inode (inode) &&S_ISREG (inode->i_mode) && - nr_to_submit) { +if (IS_ENCRYPTED (inode) &&S_ISREG (inode->i_mode) && nr_to_submit) {gfp_t gfp_flags =GFP_NOFS ; retry_encrypt:
fs/ext4/readpage.c +1 -1
@@ -156,7 +156,7 @@ static struct bio_post_read_ctx *get_bio_post_read_ctx(struct inode *inode,unsigned int post_read_steps =0 ;struct bio_post_read_ctx *ctx =NULL ; -if (ext4_encrypted_inode (inode) &&S_ISREG (inode->i_mode)) +if (IS_ENCRYPTED (inode) &&S_ISREG (inode->i_mode)) post_read_steps |=1 <<STEP_DECRYPT ;#ifdef CONFIG_FS_VERITY if (inode->i_verity_info != NULL &&
Signature · 1 line
2.19.1
RFC PATCH 2/10 f2fs: use IS_ENCRYPTED() to check encryption status
In reply to Chandan RajendraFrom: Chandan Rajendra <[email protected]>
This commit removes the f2fs specific f2fs_encrypted_inode() and makes use of the generic IS_ENCRYPTED() macro to check for the encryption status of an inode.
--- fs/f2fs/data.c | 4 ++-- fs/f2fs/dir.c | 10 +++++----- fs/f2fs/f2fs.h | 7 +------ fs/f2fs/file.c | 10 +++++----- fs/f2fs/inode.c | 4 ++-- fs/f2fs/namei.c | 6 +++--- 6 files changed, 18 insertions(+), 23 deletions(-)
fs/f2fs/data.c +2 -2
@@ -1495,7 +1495,7 @@ int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, }if (size) { -if (f2fs_encrypted_inode (inode)) +if (IS_ENCRYPTED (inode)) flags |=FIEMAP_EXTENT_DATA_ENCRYPTED ; ret = fiemap_fill_next_extent(fieinfo, logical,
@@ -1769,7 +1769,7 @@ static inline bool check_inplace_update_policy(struct inode *inode,if (policy & (0x1 <<F2FS_IPU_ASYNC ) && fio && fio->op ==REQ_OP_WRITE && !(fio->op_flags &REQ_SYNC ) && - !f2fs_encrypted_inode (inode)) + !IS_ENCRYPTED (inode))return true;/* this is only set during fdatasync */
fs/f2fs/dir.c +5 -5
@@ -385,7 +385,7 @@ struct page *f2fs_init_inode_metadata(struct inode *inode, struct inode *dir,if (err) goto put_error; -if ((f2fs_encrypted_inode (dir) || dummy_encrypt) && +if ((IS_ENCRYPTED (dir) || dummy_encrypt) &&f2fs_may_encrypt (inode)) { err =fscrypt_inherit_context (dir, inode, page, false);if (err)
@@ -399,7 +399,7 @@ struct page *f2fs_init_inode_metadata(struct inode *inode, struct inode *dir,if (new_name) {init_dent_inode (new_name, page); -if (f2fs_encrypted_inode (dir)) +if (IS_ENCRYPTED (dir))file_set_enc_name (inode); }
@@ -819,7 +819,7 @@ int f2fs_fill_dentries(struct dir_context *ctx, struct f2fs_dentry_ptr *d, goto out; } -if (f2fs_encrypted_inode (d->inode)) { +if (IS_ENCRYPTED (d->inode)) {int save_len = fstr->len; err = fscrypt_fname_disk_to_usr(d->inode,
@@ -862,7 +862,7 @@ static int f2fs_readdir(struct file *file, struct dir_context *ctx)struct fscrypt_str fstr =FSTR_INIT (NULL ,0 );int err =0 ; -if (f2fs_encrypted_inode (inode)) { +if (IS_ENCRYPTED (inode)) { err =fscrypt_get_encryption_info (inode);if (err && err != -ENOKEY ) goto out;
@@ -924,7 +924,7 @@ static int f2fs_readdir(struct file *file, struct dir_context *ctx)static int f2fs_dir_open (struct inode *inode,struct file *filp) { -if (f2fs_encrypted_inode (inode)) +if (IS_ENCRYPTED (inode))return fscrypt_get_encryption_info (inode) ? -EACCES :0 ;return 0 ; }
fs/f2fs/f2fs.h +1 -6
@@ -3466,14 +3466,9 @@ void f2fs_unregister_sysfs(struct f2fs_sb_info *sbi);/* * crypto support */ -static inline bool f2fs_encrypted_inode (struct inode *inode) -{ -return file_is_encrypt (inode); -} -static inline bool f2fs_encrypted_file (struct inode *inode) { -return f2fs_encrypted_inode (inode) &&S_ISREG (inode->i_mode); +return IS_ENCRYPTED (inode) &&S_ISREG (inode->i_mode); }static inline void f2fs_set_encrypted_inode (struct inode *inode)
fs/f2fs/file.c +5 -5
@@ -586,7 +586,7 @@ static int truncate_partial_data_page(struct inode *inode, u64 from,zero_user (page, offset,PAGE_SIZE - offset);/* An encrypted inode should have a key and truncate the last page. */ -f2fs_bug_on (F2FS_I_SB (inode), cache_only &&f2fs_encrypted_inode (inode)); +f2fs_bug_on (F2FS_I_SB (inode), cache_only &&IS_ENCRYPTED (inode));if (!cache_only)set_page_dirty (page);f2fs_put_page (page,1 );
@@ -731,7 +731,7 @@ int f2fs_getattr(const struct path *path, struct kstat *stat, stat->attributes |=STATX_ATTR_APPEND ;if (flags &F2FS_COMPR_FL ) stat->attributes |=STATX_ATTR_COMPRESSED ; -if (f2fs_encrypted_inode (inode)) +if (IS_ENCRYPTED (inode)) stat->attributes |=STATX_ATTR_ENCRYPTED ;if (flags &F2FS_IMMUTABLE_FL ) stat->attributes |=STATX_ATTR_IMMUTABLE ;
@@ -1587,7 +1587,7 @@ static long f2fs_fallocate(struct file *file, int mode,if (!S_ISREG (inode->i_mode))return -EINVAL ; -if (f2fs_encrypted_inode (inode) && +if (IS_ENCRYPTED (inode) && (mode & (FALLOC_FL_COLLAPSE_RANGE |FALLOC_FL_INSERT_RANGE )))return -EOPNOTSUPP ;
@@ -1671,7 +1671,7 @@ static int f2fs_ioc_getflags(struct file *filp, unsigned long arg)struct f2fs_inode_info *fi =F2FS_I (inode);unsigned int flags = fi->i_flags; -if (f2fs_encrypted_inode (inode)) +if (IS_ENCRYPTED (inode)) flags |=F2FS_ENCRYPT_FL ;if (f2fs_has_inline_data (inode) ||f2fs_has_inline_dentry (inode)) flags |=F2FS_INLINE_DATA_FL ;
@@ -2438,7 +2438,7 @@ static int f2fs_move_file_range(struct file *file_in, loff_t pos_in,if (!S_ISREG (src->i_mode) || !S_ISREG (dst->i_mode))return -EINVAL ; -if (f2fs_encrypted_inode (src) ||f2fs_encrypted_inode (dst)) +if (IS_ENCRYPTED (src) ||IS_ENCRYPTED (dst))return -EOPNOTSUPP ;if (src == dst) {
fs/f2fs/inode.c +2 -2
@@ -43,7 +43,7 @@ void f2fs_set_inode_flags(struct inode *inode) new_fl |=S_NOATIME ;if (flags &F2FS_DIRSYNC_FL ) new_fl |=S_DIRSYNC ; -if (f2fs_encrypted_inode (inode)) +if (file_is_encrypt (inode)) new_fl |=S_ENCRYPTED ;if (file_is_verity (inode)) new_fl |=S_VERITY ;
@@ -455,7 +455,7 @@ struct inode *f2fs_iget(struct super_block *sb, unsigned long ino) inode->i_mapping->a_ops = &f2fs_dblock_aops;inode_nohighmem (inode); }else if (S_ISLNK (inode->i_mode)) { -if (f2fs_encrypted_inode (inode)) +if (file_is_encrypt (inode)) inode->i_op = &f2fs_encrypted_symlink_inode_operations;else inode->i_op = &f2fs_symlink_inode_operations;
fs/f2fs/namei.c +3 -3
@@ -75,7 +75,7 @@ static struct inode *f2fs_new_inode(struct inode *dir, umode_t mode)set_inode_flag (inode,FI_NEW_INODE );/* If the directory encrypted, then we should encrypt the inode. */ -if ((f2fs_encrypted_inode (dir) ||DUMMY_ENCRYPTION_ENABLED (sbi)) && +if ((IS_ENCRYPTED (dir) ||DUMMY_ENCRYPTION_ENABLED (sbi)) &&f2fs_may_encrypt (inode))f2fs_set_encrypted_inode (inode);
@@ -476,7 +476,7 @@ static struct dentry *f2fs_lookup(struct inode *dir, struct dentry *dentry,if (err) goto out_iput; } -if (f2fs_encrypted_inode (dir) && +if (IS_ENCRYPTED (dir) && (S_ISDIR (inode->i_mode) ||S_ISLNK (inode->i_mode)) && !fscrypt_has_permitted_context (dir, inode)) { f2fs_msg(inode->i_sb, KERN_WARNING,
@@ -803,7 +803,7 @@ static int f2fs_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode)if (unlikely (f2fs_cp_error (sbi)))return -EIO ; -if (f2fs_encrypted_inode (dir) ||DUMMY_ENCRYPTION_ENABLED (sbi)) { +if (IS_ENCRYPTED (dir) ||DUMMY_ENCRYPTION_ENABLED (sbi)) {int err =fscrypt_get_encryption_info (dir);if (err)return err;
Signature · 1 line
2.19.1
RFC PATCH 3/10 fscrypt: remove filesystem specific build config option
In reply to Chandan RajendraFrom: Chandan Rajendra <[email protected]>
In order to have a common code base for fscrypt "post read" processing for all filesystems which support encryption, this commit removes filesystem specific build config option (e.g. CONFIG_EXT4_FS_ENCRYPTION) and replaces it with a build option (i.e. CONFIG_FS_ENCRYPTION) whose value affects all the filesystems making use of fscrypt.
--- Documentation/filesystems/fscrypt.rst | 4 +- arch/mips/configs/generic_defconfig | 2 +- arch/nds32/configs/defconfig | 2 +- arch/s390/configs/debug_defconfig | 2 +- arch/s390/configs/performance_defconfig | 2 +- fs/crypto/Kconfig | 5 +- fs/crypto/fscrypt_private.h | 1 - fs/ext4/Kconfig | 15 - fs/ext4/dir.c | 2 - fs/ext4/ext4.h | 7 +- fs/ext4/inode.c | 8 +- fs/ext4/ioctl.c | 4 +- fs/ext4/namei.c | 10 +- fs/ext4/page-io.c | 6 +- fs/ext4/readpage.c | 2 +- fs/ext4/super.c | 6 +- fs/ext4/sysfs.c | 4 +- fs/f2fs/Kconfig | 12 +- fs/f2fs/f2fs.h | 7 +- fs/f2fs/super.c | 8 +- fs/f2fs/sysfs.c | 4 +- fs/ubifs/Kconfig | 12 +- fs/ubifs/Makefile | 2 +- fs/ubifs/ioctl.c | 4 +- fs/ubifs/sb.c | 2 +- fs/ubifs/super.c | 2 +- fs/ubifs/ubifs.h | 5 +- include/linux/fs.h | 4 +- include/linux/fscrypt.h | 416 +++++++++++++++++++++++- include/linux/fscrypt_notsupp.h | 231 ------------- include/linux/fscrypt_supp.h | 204 ------------ 31 files changed, 460 insertions(+), 535 deletions(-) delete mode 100644 include/linux/fscrypt_notsupp.h delete mode 100644 include/linux/fscrypt_supp.h
Documentation/filesystems/fscrypt.rst +2 -2
@@ -343,9 +343,9 @@ FS_IOC_SET_ENCRYPTION_POLICY can fail with the following errors: - ``ENOTEMPTY``: the file is unencrypted and is a nonempty directory - ``ENOTTY``: this type of filesystem does not implement encryption - ``EOPNOTSUPP``: the kernel was not configured with encryption - support for this filesystem, or the filesystem superblock has not + support for filesystems, or the filesystem superblock has not had encryption enabled on it. (For example, to use encryption on an - ext4 filesystem, CONFIG_EXT4_ENCRYPTION must be enabled in the + ext4 filesystem, CONFIG_FS_ENCRYPTION must be enabled in the kernel config, and the superblock must have had the "encrypt" feature flag enabled using ``tune2fs -O encrypt`` or ``mkfs.ext4 -O encrypt``.)
arch/mips/configs/generic_defconfig +1 -1
@@ -59,7 +59,7 @@ CONFIG_HID_MONTEREY=y CONFIG_EXT4_FS=y CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_EXT4_FS_SECURITY=y -CONFIG_EXT4_ENCRYPTION=y +CONFIG_FS_ENCRYPTION=y CONFIG_FANOTIFY=y CONFIG_FUSE_FS=y CONFIG_CUSE=y
arch/nds32/configs/defconfig +1 -1
@@ -74,7 +74,7 @@ CONFIG_GENERIC_PHY=y CONFIG_EXT4_FS=y CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_EXT4_FS_SECURITY=y -CONFIG_EXT4_ENCRYPTION=y +CONFIG_FS_ENCRYPTION=y CONFIG_FUSE_FS=y CONFIG_MSDOS_FS=y CONFIG_VFAT_FS=y
arch/s390/configs/debug_defconfig +1 -1
@@ -500,7 +500,6 @@ CONFIG_S390_AP_IOMMU=y CONFIG_EXT4_FS=y CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_EXT4_FS_SECURITY=y -CONFIG_EXT4_ENCRYPTION=y CONFIG_JBD2_DEBUG=y CONFIG_JFS_FS=m CONFIG_JFS_POSIX_ACL=y
@@ -520,6 +519,7 @@ CONFIG_BTRFS_DEBUG=y CONFIG_NILFS2_FS=m CONFIG_FS_DAX=y CONFIG_EXPORTFS_BLOCK_OPS=y +CONFIG_FS_ENCRYPTION=y CONFIG_FANOTIFY=y CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y CONFIG_QUOTA_NETLINK_INTERFACE=y
arch/s390/configs/performance_defconfig +1 -1
@@ -497,7 +497,6 @@ CONFIG_S390_AP_IOMMU=y CONFIG_EXT4_FS=y CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_EXT4_FS_SECURITY=y -CONFIG_EXT4_ENCRYPTION=y CONFIG_JBD2_DEBUG=y CONFIG_JFS_FS=m CONFIG_JFS_POSIX_ACL=y
@@ -515,6 +514,7 @@ CONFIG_BTRFS_FS_POSIX_ACL=y CONFIG_NILFS2_FS=m CONFIG_FS_DAX=y CONFIG_EXPORTFS_BLOCK_OPS=y +CONFIG_FS_ENCRYPTION=y CONFIG_FANOTIFY=y CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y CONFIG_QUOTA_NETLINK_INTERFACE=y
fs/crypto/Kconfig +3 -2
@@ -1,5 +1,5 @@ config FS_ENCRYPTION - tristate "FS Encryption (Per-file encryption)" + bool "FS Encryption (Per-file encryption)" select CRYPTO select CRYPTO_AES select CRYPTO_CBC
@@ -13,4 +13,5 @@ config FS_ENCRYPTION Enable encryption of files and directories. This feature is similar to ecryptfs, but it is more memory efficient since it avoids caching the encrypted and - decrypted pages in the page cache. + decrypted pages in the page cache. Currently Ext4, + F2FS and UBIFS make use of this feature.
fs/crypto/fscrypt_private.h +0 -1
@@ -12,7 +12,6 @@#ifndef _FSCRYPT_PRIVATE_H#define _FSCRYPT_PRIVATE_H -#define __FS_HAS_ENCRYPTION 1#include <linux/fscrypt.h> #include <crypto/hash.h>
fs/ext4/Kconfig +0 -15
@@ -96,21 +96,6 @@ config EXT4_FS_SECURITY If you are not using a security module that requires using extended attributes for file security labels, say N. -config EXT4_ENCRYPTION - bool "Ext4 Encryption" - depends on EXT4_FS - select FS_ENCRYPTION - help - Enable encryption of ext4 files and directories. This - feature is similar to ecryptfs, but it is more memory - efficient since it avoids caching the encrypted and - decrypted pages in the page cache. - -config EXT4_FS_ENCRYPTION - bool - default y - depends on EXT4_ENCRYPTION - config EXT4_DEBUG bool "EXT4 debugging support" depends on EXT4_FS
fs/ext4/dir.c +0 -2
@@ -283,9 +283,7 @@ static int ext4_readdir(struct file *file, struct dir_context *ctx) done: err =0 ; errout: -#ifdef CONFIG_EXT4_FS_ENCRYPTION fscrypt_fname_free_buffer (&fstr); -#endif brelse (bh);return err; }
fs/ext4/ext4.h +3 -4
@@ -40,7 +40,6 @@#include <linux/compat.h> #endif -#define __FS_HAS_ENCRYPTION IS_ENABLED(CONFIG_EXT4_FS_ENCRYPTION)#include <linux/fscrypt.h> #include <linux/fsverity.h>
@@ -1330,7 +1329,7 @@ struct ext4_super_block {#define EXT4_MF_FS_ABORTED 0x0002/* Fatal error detected */ #define EXT4_MF_TEST_DUMMY_ENCRYPTION 0x0004 -#ifdef CONFIG_EXT4_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION #define DUMMY_ENCRYPTION_ENABLED (sbi) (unlikely((sbi)->s_mount_flags & \ EXT4_MF_TEST_DUMMY_ENCRYPTION))#else
@@ -2058,7 +2057,7 @@ struct ext4_filename {const struct qstr *usr_fname;struct fscrypt_str disk_name;struct dx_hash_info hinfo; -#ifdef CONFIG_EXT4_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION struct fscrypt_str crypto_buf;#endif };
@@ -2286,7 +2285,7 @@ extern unsigned ext4_free_clusters_after_init(struct super_block *sb, struct ext4_group_desc *gdp);ext4_fsblk_t ext4_inode_to_goal_block (struct inode *); -#ifdef CONFIG_EXT4_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION static inline int ext4_fname_setup_filename (struct inode *dir,const struct qstr *iname,int lookup,struct ext4_filename *fname)
fs/ext4/inode.c +4 -4
@@ -1150,7 +1150,7 @@ int do_journal_get_write_access(handle_t *handle,return ret; } -#ifdef CONFIG_EXT4_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION static int ext4_block_write_begin (struct page *page,loff_t pos,unsigned len,get_block_t *get_block) {
@@ -1302,7 +1302,7 @@ static int ext4_write_begin(struct file *file, struct address_space *mapping,/* In case writeback began while the page was unlocked */ wait_for_stable_page (page); -#ifdef CONFIG_EXT4_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION if (ext4_should_dioread_nolock (inode)) ret =ext4_block_write_begin (page, pos, len, ext4_get_block_unwritten);
@@ -3104,7 +3104,7 @@ static int ext4_da_write_begin(struct file *file, struct address_space *mapping,/* In case writeback began while the page was unlocked */ wait_for_stable_page (page); -#ifdef CONFIG_EXT4_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION ret =ext4_block_write_begin (page, pos, len, ext4_da_get_block_prep);#else
@@ -3879,7 +3879,7 @@ static ssize_t ext4_direct_IO(struct kiocb *iocb, struct iov_iter *iter)loff_t offset = iocb->ki_pos;ssize_t ret; -#ifdef CONFIG_EXT4_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION if (IS_ENCRYPTED (inode) &&S_ISREG (inode->i_mode))return 0 ;#endif
fs/ext4/ioctl.c +2 -2
@@ -210,7 +210,7 @@ static long swap_inode_boot_loader(struct super_block *sb,return err; } -#ifdef CONFIG_EXT4_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION static int uuid_is_zero (__u8 u[16 ]) {int i;
@@ -978,7 +978,7 @@ long ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)return fscrypt_ioctl_set_policy (filp, (const void __user *)arg);case EXT4_IOC_GET_ENCRYPTION_PWSALT : { -#ifdef CONFIG_EXT4_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION int err, err2;struct ext4_sb_info *sbi =EXT4_SB (sb);handle_t *handle;
fs/ext4/namei.c +5 -5
@@ -612,7 +612,7 @@ static struct stats dx_show_leaf(struct inode *dir, {if (show_names) { -#ifdef CONFIG_EXT4_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION int len;char *name; struct fscrypt_str fname_crypto_str =
@@ -984,7 +984,7 @@ static int htree_dirblock_to_tree(struct file *dir_file, top = (struct ext4_dir_entry_2 *) ((char *) de + dir->i_sb->s_blocksize -EXT4_DIR_REC_LEN (0 )); -#ifdef CONFIG_EXT4_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION /* Check if the directory is encrypted */ if (IS_ENCRYPTED (dir)) { err =fscrypt_get_encryption_info (dir);
@@ -1047,7 +1047,7 @@ static int htree_dirblock_to_tree(struct file *dir_file, } errout:brelse (bh); -#ifdef CONFIG_EXT4_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION fscrypt_fname_free_buffer (&fname_crypto_str);#endif return count;
@@ -1267,7 +1267,7 @@ static inline bool ext4_match(const struct ext4_filename *fname, f.usr_fname = fname->usr_fname; f.disk_name = fname->disk_name; -#ifdef CONFIG_EXT4_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION f.crypto_buf = fname->crypto_buf;#endif return fscrypt_match_name (&f, de->name, de->name_len);
@@ -1498,7 +1498,7 @@ static struct buffer_head * ext4_dx_find_entry(struct inode *dir,ext4_lblk_t block;int retval; -#ifdef CONFIG_EXT4_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION *res_dir =NULL ;#endif frame =dx_probe (fname, dir,NULL , frames);
fs/ext4/page-io.c +3 -3
@@ -66,7 +66,7 @@ static void ext4_finish_bio(struct bio *bio)bio_for_each_segment_all (bvec, bio, i) {struct page *page = bvec->bv_page; -#ifdef CONFIG_EXT4_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION struct page *data_page =NULL ;#endif struct buffer_head *bh, *head;
@@ -78,7 +78,7 @@ static void ext4_finish_bio(struct bio *bio)if (!page)continue ; -#ifdef CONFIG_EXT4_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION if (!page->mapping) {/* The bounce data pages are unmapped. */ data_page = page;
@@ -111,7 +111,7 @@ static void ext4_finish_bio(struct bio *bio)bit_spin_unlock (BH_Uptodate_Lock, &head->b_state);local_irq_restore (flags);if (!under_io) { -#ifdef CONFIG_EXT4_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION if (data_page)fscrypt_restore_control_page (data_page);#endif
fs/ext4/readpage.c +1 -1
@@ -54,7 +54,7 @@ static mempool_t *bio_post_read_ctx_pool;static inline bool ext4_bio_encrypted (struct bio *bio) { -#ifdef CONFIG_EXT4_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION return unlikely (bio->bi_private !=NULL );#else return false;
fs/ext4/super.c +3 -3
@@ -1233,7 +1233,7 @@ static int bdev_try_to_free_page(struct super_block *sb, struct page *page,return try_to_free_buffers (page); } -#ifdef CONFIG_EXT4_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION static int ext4_get_context (struct inode *inode,void *ctx,size_t len) { return ext4_xattr_get(inode, EXT4_XATTR_INDEX_ENCRYPTION,
@@ -2019,7 +2019,7 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token, *journal_ioprio =IOPRIO_PRIO_VALUE (IOPRIO_CLASS_BE , arg); }else if (token == Opt_test_dummy_encryption) { -#ifdef CONFIG_EXT4_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION sbi->s_mount_flags |=EXT4_MF_TEST_DUMMY_ENCRYPTION ;ext4_msg (sb,KERN_WARNING ,"Test dummy encryption mode enabled" );
@@ -4264,7 +4264,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) sb->s_op = &ext4_sops; sb->s_export_op = &ext4_export_ops; sb->s_xattr = ext4_xattr_handlers; -#ifdef CONFIG_EXT4_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION sb->s_cop = &ext4_cryptops;#endif #ifdef CONFIG_FS_VERITY
fs/ext4/sysfs.c +2 -2
@@ -224,7 +224,7 @@ static struct attribute *ext4_attrs[] = {EXT4_ATTR_FEATURE (lazy_itable_init);EXT4_ATTR_FEATURE (batched_discard);EXT4_ATTR_FEATURE (meta_bg_resize); -#ifdef CONFIG_EXT4_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION EXT4_ATTR_FEATURE (encryption);#endif #ifdef CONFIG_FS_VERITY
@@ -236,7 +236,7 @@ static struct attribute *ext4_feat_attrs[] = {ATTR_LIST (lazy_itable_init),ATTR_LIST (batched_discard),ATTR_LIST (meta_bg_resize), -#ifdef CONFIG_EXT4_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTIONATTR_LIST (encryption), #endif #ifdef CONFIG_FS_VERITY
fs/f2fs/Kconfig +1 -11
@@ -3,6 +3,7 @@ config F2FS_FS depends on BLOCK select CRYPTO select CRYPTO_CRC32 + select F2FS_FS_XATTR if FS_ENCRYPTION help F2FS is based on Log-structured File System (LFS), which supports versatile "flash-friendly" features. The design has been focused on
@@ -70,17 +71,6 @@ config F2FS_CHECK_FS If you want to improve the performance, say N. -config F2FS_FS_ENCRYPTION - bool "F2FS Encryption" - depends on F2FS_FS - depends on F2FS_FS_XATTR - select FS_ENCRYPTION - help - Enable encryption of f2fs files and directories. This - feature is similar to ecryptfs, but it is more memory - efficient since it avoids caching the encrypted and - decrypted pages in the page cache. - config F2FS_IO_TRACE bool "F2FS IO tracer" depends on F2FS_FS
fs/f2fs/f2fs.h +3 -4
@@ -24,7 +24,6 @@#include <linux/quotaops.h> #include <crypto/hash.h> -#define __FS_HAS_ENCRYPTION IS_ENABLED(CONFIG_F2FS_FS_ENCRYPTION)#include <linux/fscrypt.h> #include <linux/fsverity.h>
@@ -1140,7 +1139,7 @@ enum fsync_mode { FSYNC_MODE_NOBARRIER, /* fsync behaves nobarrier based on posix */ }; -#ifdef CONFIG_F2FS_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION #define DUMMY_ENCRYPTION_ENABLED (sbi) \ (unlikely(F2FS_OPTION(sbi).test_dummy_encryption))#else
@@ -3473,7 +3472,7 @@ static inline bool f2fs_encrypted_file(struct inode *inode)static inline void f2fs_set_encrypted_inode (struct inode *inode) { -#ifdef CONFIG_F2FS_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION file_set_encrypt (inode);f2fs_set_inode_flags (inode);#endif
@@ -3553,7 +3552,7 @@ static inline void set_opt_mode(struct f2fs_sb_info *sbi, unsigned int mt)static inline bool f2fs_may_encrypt (struct inode *inode) { -#ifdef CONFIG_F2FS_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION umode_t mode = inode->i_mode;return (S_ISREG (mode) ||S_ISDIR (mode) ||S_ISLNK (mode));
fs/f2fs/super.c +4 -4
@@ -757,7 +757,7 @@ static int parse_options(struct super_block *sb, char *options)kvfree (name);break ;case Opt_test_dummy_encryption: -#ifdef CONFIG_F2FS_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION if (!f2fs_sb_has_encrypt (sbi)) {f2fs_msg (sb,KERN_ERR ,"Encrypt feature is off" );return -EINVAL ;
@@ -1390,7 +1390,7 @@ static int f2fs_show_options(struct seq_file *seq, struct dentry *root)seq_printf (seq,",whint_mode=%s" ,"user-based" ); else if (F2FS_OPTION(sbi).whint_mode == WHINT_MODE_FS) seq_printf(seq, ",whint_mode=%s", "fs-based"); -#ifdef CONFIG_F2FS_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION if (F2FS_OPTION (sbi).test_dummy_encryption)seq_puts (seq,",test_dummy_encryption" );#endif
@@ -2154,7 +2154,7 @@ static const struct super_operations f2fs_sops = { .remount_fs = f2fs_remount, }; -#ifdef CONFIG_F2FS_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION static int f2fs_get_context (struct inode *inode,void *ctx,size_t len) { return f2fs_getxattr(inode, F2FS_XATTR_INDEX_ENCRYPTION,
@@ -3152,7 +3152,7 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent)#endif sb->s_op = &f2fs_sops; -#ifdef CONFIG_F2FS_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION sb->s_cop = &f2fs_cryptops;#endif #ifdef CONFIG_FS_VERITY
fs/f2fs/sysfs.c +2 -2
@@ -436,7 +436,7 @@ F2FS_GENERAL_RO_ATTR(lifetime_write_kbytes);F2FS_GENERAL_RO_ATTR (features);F2FS_GENERAL_RO_ATTR (current_reserved_blocks); -#ifdef CONFIG_F2FS_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION F2FS_FEATURE_RO_ATTR (encryption,FEAT_CRYPTO );#endif #ifdef CONFIG_BLK_DEV_ZONED
@@ -500,7 +500,7 @@ static struct attribute *f2fs_attrs[] = { }; static struct attribute *f2fs_feat_attrs[] = { -#ifdef CONFIG_F2FS_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION ATTR_LIST(encryption),#endif #ifdef CONFIG_BLK_DEV_ZONED
fs/ubifs/Kconfig +1 -11
@@ -8,6 +8,7 @@ config UBIFS_FS select CRYPTO_LZO if UBIFS_FS_LZO select CRYPTO_DEFLATE if UBIFS_FS_ZLIB select CRYPTO_HASH_INFO + select UBIFS_FS_XATTR if FS_ENCRYPTION depends on MTD_UBI help UBIFS is a file system for flash devices which works on top of UBI.
@@ -60,17 +61,6 @@ config UBIFS_FS_XATTR If unsure, say Y. -config UBIFS_FS_ENCRYPTION - bool "UBIFS Encryption" - depends on UBIFS_FS_XATTR && BLOCK - select FS_ENCRYPTION - default n - help - Enable encryption of UBIFS files and directories. This - feature is similar to ecryptfs, but it is more memory - efficient since it avoids caching the encrypted and - decrypted pages in the page cache. - config UBIFS_FS_SECURITY bool "UBIFS Security Labels" depends on UBIFS_FS_XATTR
fs/ubifs/Makefile +1 -1
@@ -6,6 +6,6 @@ ubifs-y += tnc.o master.o scan.o replay.o log.o commit.o gc.o orphan.o ubifs-y += budget.o find.o tnc_commit.o compress.o lpt.o lprops.o ubifs-y += recovery.o ioctl.o lpt_commit.o tnc_misc.o debug.o ubifs-y += misc.o -ubifs-$(CONFIG_UBIFS_FS_ENCRYPTION) += crypto.o +ubifs-$(CONFIG_FS_ENCRYPTION) += crypto.o ubifs-$(CONFIG_UBIFS_FS_XATTR) += xattr.o ubifs-$(CONFIG_UBIFS_FS_AUTHENTICATION) += auth.o
fs/ubifs/ioctl.c +2 -2
@@ -185,7 +185,7 @@ long ubifs_ioctl(struct file *file, unsigned int cmd, unsigned long arg)return err; }case FS_IOC_SET_ENCRYPTION_POLICY : { -#ifdef CONFIG_UBIFS_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION struct ubifs_info *c = inode->i_sb->s_fs_info; err =ubifs_enable_encryption (c);
@@ -198,7 +198,7 @@ long ubifs_ioctl(struct file *file, unsigned int cmd, unsigned long arg)#endif }case FS_IOC_GET_ENCRYPTION_POLICY : { -#ifdef CONFIG_UBIFS_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION return fscrypt_ioctl_get_policy (file, (void __user *)arg);#else return -EOPNOTSUPP ;
fs/ubifs/sb.c +1 -1
@@ -748,7 +748,7 @@ int ubifs_read_superblock(struct ubifs_info *c) goto out; } -#ifndef CONFIG_UBIFS_FS_ENCRYPTION +#ifndef CONFIG_FS_ENCRYPTION if (c->encrypted) {ubifs_err (c,"file system contains encrypted files but UBIFS" " was built without crypto support." );
fs/ubifs/super.c +1 -1
@@ -2146,7 +2146,7 @@ static int ubifs_fill_super(struct super_block *sb, void *data, int silent)#ifdef CONFIG_UBIFS_FS_XATTR sb->s_xattr = ubifs_xattr_handlers;#endif -#ifdef CONFIG_UBIFS_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION sb->s_cop = &ubifs_crypt_operations;#endif
fs/ubifs/ubifs.h +2 -3
@@ -43,7 +43,6 @@#include <crypto/hash.h> #include <crypto/algapi.h> -#define __FS_HAS_ENCRYPTION IS_ENABLED(CONFIG_UBIFS_FS_ENCRYPTION)#include <linux/fscrypt.h> #include "ubifs-media.h"
@@ -142,7 +141,7 @@*/ #define WORST_COMPR_FACTOR 2 -#ifdef CONFIG_UBIFS_FS_ENCRYPTION +#ifdef CONFIG_FS_ENCRYPTION #define UBIFS_CIPHER_BLOCK_SIZE FS_CRYPTO_BLOCK_SIZE#else #define UBIFS_CIPHER_BLOCK_SIZE 0
@@ -2072,7 +2071,7 @@ int ubifs_decompress(const struct ubifs_info *c, const void *buf, int len,#include "misc.h" #include "key.h" -#ifndef CONFIG_UBIFS_FS_ENCRYPTION +#ifndef CONFIG_FS_ENCRYPTION static inline int ubifs_encrypt(const struct inode *inode, struct ubifs_data_node *dn, unsigned int in_len, unsigned int *out_len,
include/linux/fs.h +2 -2
@@ -700,7 +700,7 @@ struct inode {struct fsnotify_mark_connector __rcu *i_fsnotify_marks;#endif -#if IS_ENABLED (CONFIG_FS_ENCRYPTION ) +#ifdef CONFIG_FS_ENCRYPTION struct fscrypt_info *i_crypt_info;#endif
@@ -1409,7 +1409,7 @@ struct super_block {void *s_security;#endif const struct xattr_handler **s_xattr; -#if IS_ENABLED (CONFIG_FS_ENCRYPTION ) +#ifdef CONFIG_FS_ENCRYPTION const struct fscrypt_operations *s_cop;#endif #ifdef CONFIG_FS_VERITY
include/linux/fscrypt.h +408 -8
434 lines not on this page · raw message
include/linux/fscrypt_notsupp.h deleted +0 -231
231 lines not on this page · raw message
include/linux/fscrypt_supp.h deleted +0 -204
204 lines not on this page · raw message
Signature · 1 line
2.19.1
RFC PATCH 4/10 Consolidate "post read processing" into a new file
In reply to Chandan RajendraThe post read processing code is used by both Ext4 and F2FS. Hence to remove duplicity, this commit moves the code into include/linux/post_read_process.h and fs/post_read_process.c.
The corresponding decrypt and verity "work" functions have been moved inside fscrypt and fsverity sources. With these in place, the post processing code now has to just invoke enqueue functions provided by fscrypt and fsverity.
--- fs/Makefile | 3 +- fs/crypto/bio.c | 21 ++-- fs/crypto/crypto.c | 1 + fs/crypto/fscrypt_private.h | 3 + fs/ext4/ext4.h | 2 - fs/ext4/readpage.c | 153 +----------------------------- fs/ext4/super.c | 9 +- fs/post_read_process.c | 127 +++++++++++++++++++++++++ fs/verity/verify.c | 12 +++ include/linux/fscrypt.h | 11 --- include/linux/post_read_process.h | 21 ++++ 11 files changed, 176 insertions(+), 187 deletions(-) create mode 100644 fs/post_read_process.c create mode 100644 include/linux/post_read_process.h
fs/Makefile +2 -1
@@ -12,7 +12,8 @@ obj-y := open.o read_write.o file_table.o super.o \ attr.o bad_inode.o file.o filesystems.o namespace.o \ seq_file.o xattr.o libfs.o fs-writeback.o \ pnode.o splice.o sync.o utimes.o d_path.o \ - stack.o fs_struct.o statfs.o fs_pin.o nsfs.o + stack.o fs_struct.o statfs.o fs_pin.o nsfs.o \ + post_read_process.o ifeq ($(CONFIG_BLOCK),y) obj-y += buffer.o block_dev.o direct-io.o mpage.o
fs/crypto/bio.c +7 -14
@@ -24,6 +24,8 @@#include <linux/module.h> #include <linux/bio.h> #include <linux/namei.h> +#include <linux/post_read_process.h> +#include "fscrypt_private.h" static void __fscrypt_decrypt_bio (struct bio *bio,bool done)
@@ -53,24 +55,15 @@ void fscrypt_decrypt_bio(struct bio *bio) }EXPORT_SYMBOL (fscrypt_decrypt_bio); -static void completion_pages (struct work_struct *work) +void fscrypt_decrypt_work (struct work_struct *work) { -struct fscrypt_ctx *ctx = - container_of(work, struct fscrypt_ctx, r.work); -struct bio *bio = ctx->r.bio; +struct bio_post_read_ctx *ctx = + container_of(work, struct bio_post_read_ctx, work); -__fscrypt_decrypt_bio (bio, true); -fscrypt_release_ctx (ctx); -bio_put (bio); -} +fscrypt_decrypt_bio (ctx->bio); -void fscrypt_enqueue_decrypt_bio (struct fscrypt_ctx *ctx,struct bio *bio) -{ -INIT_WORK (&ctx->r.work, completion_pages); - ctx->r.bio = bio; -fscrypt_enqueue_decrypt_work (&ctx->r.work); +bio_post_read_processing (ctx); } -EXPORT_SYMBOL (fscrypt_enqueue_decrypt_bio);void fscrypt_pullback_bio_page (struct page **page,bool restore) {
fs/crypto/crypto.c +1 -0
@@ -53,6 +53,7 @@ struct kmem_cache *fscrypt_info_cachep;void fscrypt_enqueue_decrypt_work (struct work_struct *work) { +INIT_WORK (work, fscrypt_decrypt_work);queue_work (fscrypt_read_workqueue, work); }EXPORT_SYMBOL (fscrypt_enqueue_decrypt_work);
fs/crypto/fscrypt_private.h +3 -0
@@ -114,6 +114,9 @@ static inline bool fscrypt_valid_enc_modes(u32 contents_mode,return false; } +/* bio.c */ +void fscrypt_decrypt_work (struct work_struct *work); +/* crypto.c */ extern struct kmem_cache *fscrypt_info_cachep;extern int fscrypt_initialize (unsigned int cop_flags);
fs/ext4/ext4.h +0 -2
@@ -3088,8 +3088,6 @@ static inline void ext4_set_de_type(struct super_block *sb,extern int ext4_mpage_readpages (struct address_space *mapping,struct list_head *pages,struct page *page,unsigned nr_pages,bool is_readahead); -extern int __init ext4_init_post_read_processing (void ); -extern void ext4_exit_post_read_processing (void );/* symlink.c */ extern const struct inode_operations ext4_encrypted_symlink_inode_operations;
fs/ext4/readpage.c +2 -151
180 lines not on this page · raw message
fs/ext4/super.c +1 -8
@@ -6102,10 +6102,6 @@ static int __init ext4_init_fs(void)return err; err =ext4_init_pending (); -if (err) - goto out7; - - err =ext4_init_post_read_processing ();if (err) goto out6;
@@ -6147,10 +6143,8 @@ static int __init ext4_init_fs(void) out4:ext4_exit_pageio (); out5: -ext4_exit_post_read_processing (); -out6:ext4_exit_pending (); -out7: +out6:ext4_exit_es ();return err;
@@ -6167,7 +6161,6 @@ static void __exit ext4_exit_fs(void)ext4_exit_sysfs ();ext4_exit_system_zone ();ext4_exit_pageio (); -ext4_exit_post_read_processing ();ext4_exit_es ();ext4_exit_pending (); }
fs/post_read_process.c new file +127 -0
127 lines not on this page · raw message
fs/verity/verify.c +12 -0
@@ -13,6 +13,7 @@#include <linux/pagemap.h> #include <linux/ratelimit.h> #include <linux/scatterlist.h> +#include <linux/post_read_process.h> struct workqueue_struct *fsverity_read_workqueue;
@@ -283,6 +284,16 @@ void fsverity_verify_bio(struct bio *bio)EXPORT_SYMBOL_GPL (fsverity_verify_bio);#endif /* CONFIG_BLOCK */ +static void fsverity_verify_work (struct work_struct *work) +{ +struct bio_post_read_ctx *ctx = + container_of(work, struct bio_post_read_ctx, work); + +fsverity_verify_bio (ctx->bio); + +bio_post_read_processing (ctx); +} +/** * fsverity_enqueue_verify_work - enqueue work on the fs-verity workqueue *
@@ -290,6 +301,7 @@ EXPORT_SYMBOL_GPL(fsverity_verify_bio);*/ void fsverity_enqueue_verify_work (struct work_struct *work) { +INIT_WORK (work, fsverity_verify_work);queue_work (fsverity_read_workqueue, work); }EXPORT_SYMBOL_GPL (fsverity_enqueue_verify_work);
include/linux/fscrypt.h +0 -11
@@ -68,10 +68,6 @@ struct fscrypt_ctx {struct page *bounce_page;/* Ciphertext page */ struct page *control_page;/* Original page */ } w; -struct { -struct bio *bio; -struct work_struct work; - } r;struct list_head free_list;/* Free list */ };u8 flags;/* Flags */
@@ -206,8 +202,6 @@ static inline bool fscrypt_match_name(const struct fscrypt_name *fname,/* bio.c */ extern void fscrypt_decrypt_bio (struct bio *); -extern void fscrypt_enqueue_decrypt_bio (struct fscrypt_ctx *ctx, -struct bio *bio);extern void fscrypt_pullback_bio_page (struct page **,bool );extern int fscrypt_zeroout_range (const struct inode *,pgoff_t ,sector_t ,unsigned int );
@@ -376,11 +370,6 @@ static inline void fscrypt_decrypt_bio(struct bio *bio) { } -static inline void fscrypt_enqueue_decrypt_bio (struct fscrypt_ctx *ctx, -struct bio *bio) -{ -} -static inline void fscrypt_pullback_bio_page (struct page **page,bool restore) {return ;
include/linux/post_read_process.h new file +21 -0
@@ -0,0 +1,21 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _POST_READ_PROCESS_H +#define _POST_READ_PROCESS_H + +struct bio_post_read_ctx { +struct bio *bio; +struct inode *inode; +struct work_struct work; +unsigned int cur_step; +unsigned int enabled_steps; +}; + +void end_bio_post_read_processing (struct bio *bio); +void bio_post_read_processing (struct bio_post_read_ctx *ctx); +struct bio_post_read_ctx *get_bio_post_read_ctx (struct inode *inode, +struct bio *bio, +pgoff_t index); +void put_bio_post_read_ctx (struct bio_post_read_ctx *ctx); +bool bio_post_read_required (struct bio *bio); + +#endif /* _POST_READ_PROCESS_H */
Signature · 1 line
2.19.1
Eric Biggers
maintainerRe: [RFC PATCH 04/10] Consolidate "post read processing" into a new file
Hi Chandan,
Quoted 31 lines · Chandan Rajendra
The post read processing code is used by both Ext4 and F2FS. Hence to remove duplicity, this commit moves the code into
include/linux/post_read_process.handfs/post_read_process.c.The corresponding decrypt and verity "work" functions have been moved inside fscrypt and fsverity sources. With these in place, the post processing code now has to just invoke enqueue functions provided by fscrypt and fsverity.
Signed-off-by Chandan Rajendra <[email protected]>--- fs/Makefile | 3 +- fs/crypto/bio.c | 21 ++-- fs/crypto/crypto.c | 1 + fs/crypto/fscrypt_private.h | 3 + fs/ext4/ext4.h | 2 - fs/ext4/readpage.c | 153 +----------------------------- fs/ext4/super.c | 9 +- fs/post_read_process.c | 127 +++++++++++++++++++++++++ fs/verity/verify.c | 12 +++ include/linux/fscrypt.h | 11 --- include/linux/post_read_process.h | 21 ++++ 11 files changed, 176 insertions(+), 187 deletions(-) create mode 100644 fs/post_read_process.c create mode 100644 include/linux/post_read_process.hfs/Makefile +0
-0
fs/Makefile obj-y := open.o read_write.o file_table.o super.o \ · line 17
Quoted 7 lines
fs/Makefile +2
-1@@ -12,7 +12,8 @@ obj-y := open.o read_write.o file_table.o super.o \ attr.o bad_inode.o file.o filesystems.o namespace.o \ seq_file.o xattr.o libfs.o fs-writeback.o \ pnode.o splice.o sync.o utimes.o d_path.o \ - stack.o fs_struct.o statfs.o fs_pin.o nsfs.o + stack.o fs_struct.o statfs.o fs_pin.o nsfs.o \ + post_read_process.o
To avoid bloating every Linux kernel in existence, post_read_process.c should only be compiled if CONFIG_FS_ENCRYPTION || CONFIG_FS_VERITY.
Quoted 313 lines
fs/Makefile +0
-0ifeq ($(CONFIG_BLOCK),y) obj-y += buffer.o block_dev.o direct-io.o mpage.ofs/crypto/bio.c +7
-14@@ -24,6 +24,8 @@#include <linux/module.h> #include <linux/bio.h> #include <linux/namei.h> +#include <linux/post_read_process.h> +#include "fscrypt_private.h" static void __fscrypt_decrypt_bio (struct bio *bio,bool done)@@ -53,24 +55,15 @@ void fscrypt_decrypt_bio(struct bio *bio) }EXPORT_SYMBOL (fscrypt_decrypt_bio); -static void completion_pages (struct work_struct *work) +void fscrypt_decrypt_work (struct work_struct *work) { -struct fscrypt_ctx *ctx = - container_of(work, struct fscrypt_ctx, r.work); -struct bio *bio = ctx->r.bio; +struct bio_post_read_ctx *ctx = + container_of(work, struct bio_post_read_ctx, work); -__fscrypt_decrypt_bio (bio, true); -fscrypt_release_ctx (ctx); -bio_put (bio); -} +fscrypt_decrypt_bio (ctx->bio); -void fscrypt_enqueue_decrypt_bio (struct fscrypt_ctx *ctx,struct bio *bio) -{ -INIT_WORK (&ctx->r.work, completion_pages); - ctx->r.bio = bio; -fscrypt_enqueue_decrypt_work (&ctx->r.work); +bio_post_read_processing (ctx); } -EXPORT_SYMBOL (fscrypt_enqueue_decrypt_bio);void fscrypt_pullback_bio_page (struct page **page,bool restore) {fs/crypto/crypto.c +1
-0@@ -53,6 +53,7 @@ struct kmem_cache *fscrypt_info_cachep;void fscrypt_enqueue_decrypt_work (struct work_struct *work) { +INIT_WORK (work, fscrypt_decrypt_work);queue_work (fscrypt_read_workqueue, work); }EXPORT_SYMBOL (fscrypt_enqueue_decrypt_work);fs/crypto/fscrypt_private.h +3
-0@@ -114,6 +114,9 @@ static inline bool fscrypt_valid_enc_modes(u32 contents_mode,return false; } +/* bio.c */ +void fscrypt_decrypt_work (struct work_struct *work); +/* crypto.c */ extern struct kmem_cache *fscrypt_info_cachep;extern int fscrypt_initialize (unsigned int cop_flags);fs/ext4/ext4.h +0
-2@@ -3088,8 +3088,6 @@ static inline void ext4_set_de_type(struct super_block *sb,extern int ext4_mpage_readpages (struct address_space *mapping,struct list_head *pages,struct page *page,unsigned nr_pages,bool is_readahead); -extern int __init ext4_init_post_read_processing (void ); -extern void ext4_exit_post_read_processing (void );/* symlink.c */ extern const struct inode_operations ext4_encrypted_symlink_inode_operations;fs/ext4/readpage.c +2
-151@@ -44,14 +44,10 @@#include <linux/backing-dev.h> #include <linux/pagevec.h> #include <linux/cleancache.h> +#include <linux/post_read_process.h> #include "ext4.h" -#define NUM_PREALLOC_POST_READ_CTXS 128 - -static struct kmem_cache *bio_post_read_ctx_cache; -static mempool_t *bio_post_read_ctx_pool; -static inline bool ext4_bio_encrypted (struct bio *bio) {#ifdef CONFIG_FS_ENCRYPTION @@ -61,124 +57,6 @@ static inline bool ext4_bio_encrypted(struct bio *bio)#endif } -/* postprocessing steps for read bios */ -enum bio_post_read_step { -STEP_INITIAL =0 , -STEP_DECRYPT , -STEP_VERITY , -}; - -struct bio_post_read_ctx { -struct bio *bio; -struct work_struct work; -unsigned int cur_step; -unsigned int enabled_steps; -}; - -static void __read_end_io (struct bio *bio) -{ -struct page *page; -struct bio_vec *bv; -int i; - -bio_for_each_segment_all (bv, bio, i) { - page = bv->bv_page; - -/* PG_error was set if any post_read step failed */ -if (bio->bi_status ||PageError (page)) { -ClearPageUptodate (page); -SetPageError (page); - }else { -SetPageUptodate (page); - } -unlock_page (page); - } -if (bio->bi_private) -mempool_free (bio->bi_private, bio_post_read_ctx_pool); -bio_put (bio); -} - -static void bio_post_read_processing (struct bio_post_read_ctx *ctx); - -static void decrypt_work (struct work_struct *work) -{ -struct bio_post_read_ctx *ctx = - container_of(work, struct bio_post_read_ctx, work); - -fscrypt_decrypt_bio (ctx->bio); - -bio_post_read_processing (ctx); -} - -static void verity_work (struct work_struct *work) -{ -struct bio_post_read_ctx *ctx = - container_of(work, struct bio_post_read_ctx, work); - -fsverity_verify_bio (ctx->bio); - -bio_post_read_processing (ctx); -} - -static void bio_post_read_processing (struct bio_post_read_ctx *ctx) -{ -/* -* We use different work queues for decryption and for verity because -* verity may require reading metadata pages that need decryption, and -* we shouldn't recurse to the same workqueue. -*/ -switch (++ctx->cur_step) { -case STEP_DECRYPT : -if (ctx->enabled_steps & (1 <<STEP_DECRYPT )) { -INIT_WORK (&ctx->work, decrypt_work); -fscrypt_enqueue_decrypt_work (&ctx->work); -return ; - } - ctx->cur_step++; -/* fall-through */ -case STEP_VERITY : -if (ctx->enabled_steps & (1 <<STEP_VERITY )) { -INIT_WORK (&ctx->work, verity_work); -fsverity_enqueue_verify_work (&ctx->work); -return ; - } - ctx->cur_step++; -/* fall-through */ -default : -__read_end_io (ctx->bio); - } -} - -static struct bio_post_read_ctx *get_bio_post_read_ctx (struct inode *inode, -struct bio *bio, -pgoff_t index) -{ -unsigned int post_read_steps =0 ; -struct bio_post_read_ctx *ctx =NULL ; - -if (IS_ENCRYPTED (inode) &&S_ISREG (inode->i_mode)) - post_read_steps |=1 <<STEP_DECRYPT ; -#ifdef CONFIG_FS_VERITY -if (inode->i_verity_info !=NULL && - (index < ((i_size_read (inode) +PAGE_SIZE -1 ) >>PAGE_SHIFT ))) - post_read_steps |=1 <<STEP_VERITY ; -#endif -if (post_read_steps) { - ctx =mempool_alloc (bio_post_read_ctx_pool,GFP_NOFS ); -if (!ctx) -return ERR_PTR (-ENOMEM ); - ctx->bio = bio; - ctx->enabled_steps = post_read_steps; - bio->bi_private = ctx; - } -return ctx; -} - -static bool bio_post_read_required (struct bio *bio) -{ -return bio->bi_private && !bio->bi_status; -} -/* * I/O completion handler for multipage BIOs. * @@ -196,11 +74,10 @@ static void mpage_end_io(struct bio *bio)if (bio_post_read_required (bio)) {struct bio_post_read_ctx *ctx = bio->bi_private; - ctx->cur_step =STEP_INITIAL ;bio_post_read_processing (ctx);return ; } -__read_end_io (bio); +end_bio_post_read_processing (bio); }static inline loff_t ext4_readpage_limit (struct inode *inode)@@ -416,29 +293,3 @@ int ext4_mpage_readpages(struct address_space *mapping,submit_bio (bio);return 0 ; } - -int __init ext4_init_post_read_processing (void ) -{ - bio_post_read_ctx_cache = -kmem_cache_create ("ext4_bio_post_read_ctx" , -sizeof (struct bio_post_read_ctx ),0 ,0 ,NULL ); -if (!bio_post_read_ctx_cache) - goto fail; - bio_post_read_ctx_pool = -mempool_create_slab_pool (NUM_PREALLOC_POST_READ_CTXS , - bio_post_read_ctx_cache); -if (!bio_post_read_ctx_pool) - goto fail_free_cache; -return 0 ; - -fail_free_cache: -kmem_cache_destroy (bio_post_read_ctx_cache); -fail: -return -ENOMEM ; -} - -void ext4_exit_post_read_processing (void ) -{ -mempool_destroy (bio_post_read_ctx_pool); -kmem_cache_destroy (bio_post_read_ctx_cache); -}fs/ext4/super.c +1
-8@@ -6102,10 +6102,6 @@ static int __init ext4_init_fs(void)return err; err =ext4_init_pending (); -if (err) - goto out7; - - err =ext4_init_post_read_processing ();if (err) goto out6;@@ -6147,10 +6143,8 @@ static int __init ext4_init_fs(void) out4:ext4_exit_pageio (); out5: -ext4_exit_post_read_processing (); -out6:ext4_exit_pending (); -out7: +out6:ext4_exit_es ();return err;@@ -6167,7 +6161,6 @@ static void __exit ext4_exit_fs(void)ext4_exit_sysfs ();ext4_exit_system_zone ();ext4_exit_pageio (); -ext4_exit_post_read_processing ();ext4_exit_es ();ext4_exit_pending (); }fs/post_read_process.c new file +0
-0
fs/post_read_process.c line 8
Quoted 8 lines
fs/post_read_process.c new file +8
-0@@ -0,0 +1,127 @@ +// SPDX-License-Identifier: GPL-2.0 +#include <linux/module.h> +#include <linux/mm.h> +#include <linux/pagemap.h> +#include <linux/bio.h> +#include <linux/fscrypt.h> +#include <linux/fsverity.h> +#include <linux/post_read_process.h>
To help people who come across this code, please add a comment at the top of this file that briefly describes what it is.
Quoted 161 lines
fs/post_read_process.c new file +119
-0+ +#define NUM_PREALLOC_POST_READ_CTXS 128 + +static struct kmem_cache *bio_post_read_ctx_cache; +static mempool_t *bio_post_read_ctx_pool; + +/* postprocessing steps for read bios */ +enum bio_post_read_step { +STEP_INITIAL =0 , +STEP_DECRYPT , +STEP_VERITY , +}; + +void end_bio_post_read_processing (struct bio *bio) +{ +struct page *page; +struct bio_vec *bv; +int i; + +bio_for_each_segment_all (bv, bio, i) { + page = bv->bv_page; + +/* PG_error was set if any post_read step failed */ +if (bio->bi_status ||PageError (page)) { +ClearPageUptodate (page); +SetPageError (page); + }else { +SetPageUptodate (page); + } +unlock_page (page); + } +if (bio->bi_private) +put_bio_post_read_ctx (bio->bi_private); +bio_put (bio); +} + +void bio_post_read_processing (struct bio_post_read_ctx *ctx) +{ +/* +* We use different work queues for decryption and for verity because +* verity may require reading metadata pages that need decryption, and +* we shouldn't recurse to the same workqueue. +*/ +switch (++ctx->cur_step) { +case STEP_DECRYPT : +if (ctx->enabled_steps & (1 <<STEP_DECRYPT )) { +fscrypt_enqueue_decrypt_work (&ctx->work); +return ; + } + ctx->cur_step++; +/* fall-through */ +case STEP_VERITY : +if (ctx->enabled_steps & (1 <<STEP_VERITY )) { +fsverity_enqueue_verify_work (&ctx->work); +return ; + } + ctx->cur_step++; +/* fall-through */ +default : +end_bio_post_read_processing (ctx->bio); + } +} + +struct bio_post_read_ctx *get_bio_post_read_ctx (struct inode *inode, +struct bio *bio, +pgoff_t index) +{ +unsigned int post_read_steps =0 ; +struct bio_post_read_ctx *ctx =NULL ; + +if (IS_ENCRYPTED (inode) &&S_ISREG (inode->i_mode)) + post_read_steps |=1 <<STEP_DECRYPT ; +#ifdef CONFIG_FS_VERITY +if (inode->i_verity_info !=NULL && + (index < ((i_size_read (inode) +PAGE_SIZE -1 ) >>PAGE_SHIFT ))) + post_read_steps |=1 <<STEP_VERITY ; +#endif +if (post_read_steps) { + ctx =mempool_alloc (bio_post_read_ctx_pool,GFP_NOFS ); +if (!ctx) +return ERR_PTR (-ENOMEM ); + ctx->bio = bio; + ctx->inode = inode; + ctx->enabled_steps = post_read_steps; + ctx->cur_step =STEP_INITIAL ; + bio->bi_private = ctx; + } +return ctx; +} + +void put_bio_post_read_ctx (struct bio_post_read_ctx *ctx) +{ +mempool_free (ctx, bio_post_read_ctx_pool); +} + +bool bio_post_read_required (struct bio *bio) +{ +return bio->bi_private && !bio->bi_status; +} + +static int __init bio_init_post_read_processing (void ) +{ + bio_post_read_ctx_cache =KMEM_CACHE (bio_post_read_ctx,0 ); +if (!bio_post_read_ctx_cache) + goto fail; + bio_post_read_ctx_pool = +mempool_create_slab_pool (NUM_PREALLOC_POST_READ_CTXS , + bio_post_read_ctx_cache); +if (!bio_post_read_ctx_pool) + goto fail_free_cache; +return 0 ; + +fail_free_cache: +kmem_cache_destroy (bio_post_read_ctx_cache); +fail: +return -ENOMEM ; +} + +fs_initcall (bio_init_post_read_processing);fs/verity/verify.c +12
-0@@ -13,6 +13,7 @@#include <linux/pagemap.h> #include <linux/ratelimit.h> #include <linux/scatterlist.h> +#include <linux/post_read_process.h> struct workqueue_struct *fsverity_read_workqueue;@@ -283,6 +284,16 @@ void fsverity_verify_bio(struct bio *bio)EXPORT_SYMBOL_GPL (fsverity_verify_bio);#endif /* CONFIG_BLOCK */ +static void fsverity_verify_work (struct work_struct *work) +{ +struct bio_post_read_ctx *ctx = + container_of(work, struct bio_post_read_ctx, work); + +fsverity_verify_bio (ctx->bio); + +bio_post_read_processing (ctx); +} +/** * fsverity_enqueue_verify_work - enqueue work on the fs-verity workqueue * @@ -290,6 +301,7 @@ EXPORT_SYMBOL_GPL(fsverity_verify_bio);*/ void fsverity_enqueue_verify_work (struct work_struct *work) { +INIT_WORK (work, fsverity_verify_work);queue_work (fsverity_read_workqueue, work); }EXPORT_SYMBOL_GPL (fsverity_enqueue_verify_work);include/linux/fscrypt.h +0
-0
include/linux/fscrypt.h struct fscrypt_ctx { · line 74
Quoted 7 lines
include/linux/fscrypt.h +0
-4@@ -68,10 +68,6 @@ struct fscrypt_ctx {struct page *bounce_page;/* Ciphertext page */ struct page *control_page;/* Original page */ } w; -struct { -struct bio *bio; -struct work_struct work; - } r;
Now that 'struct fscrypt_ctx' is only used for writes, the 'w' part should be changed to an anonymous struct.
Quoted 54 lines
include/linux/fscrypt.h +0
-7struct list_head free_list;/* Free list */ };u8 flags;/* Flags */ @@ -206,8 +202,6 @@ static inline bool fscrypt_match_name(const struct fscrypt_name *fname,/* bio.c */ extern void fscrypt_decrypt_bio (struct bio *); -extern void fscrypt_enqueue_decrypt_bio (struct fscrypt_ctx *ctx, -struct bio *bio);extern void fscrypt_pullback_bio_page (struct page **,bool );extern int fscrypt_zeroout_range (const struct inode *,pgoff_t ,sector_t ,unsigned int );@@ -376,11 +370,6 @@ static inline void fscrypt_decrypt_bio(struct bio *bio) { } -static inline void fscrypt_enqueue_decrypt_bio (struct fscrypt_ctx *ctx, -struct bio *bio) -{ -} -static inline void fscrypt_pullback_bio_page (struct page **page,bool restore) {return ;include/linux/post_read_process.h new file +21
-0@@ -0,0 +1,21 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _POST_READ_PROCESS_H +#define _POST_READ_PROCESS_H + +struct bio_post_read_ctx { +struct bio *bio; +struct inode *inode; +struct work_struct work; +unsigned int cur_step; +unsigned int enabled_steps; +}; + +void end_bio_post_read_processing (struct bio *bio); +void bio_post_read_processing (struct bio_post_read_ctx *ctx); +struct bio_post_read_ctx *get_bio_post_read_ctx (struct inode *inode, +struct bio *bio, +pgoff_t index); +void put_bio_post_read_ctx (struct bio_post_read_ctx *ctx); +bool bio_post_read_required (struct bio *bio); + +#endif /* _POST_READ_PROCESS_H */ Signature · 1 line
2.19.1
- Eric
_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
Re: [RFC PATCH 04/10] Consolidate "post read processing" into a new file
Quoted 29 lines · IST Eric Biggers
Hi Chandan,
Quoted 26 lines · Chandan Rajendra
The post read processing code is used by both Ext4 and F2FS. Hence to remove duplicity, this commit moves the code into
include/linux/post_read_process.handfs/post_read_process.c.The corresponding decrypt and verity "work" functions have been moved inside fscrypt and fsverity sources. With these in place, the post processing code now has to just invoke enqueue functions provided by fscrypt and fsverity.
Signed-off-by Chandan Rajendra <[email protected]>--- fs/Makefile | 3 +- fs/crypto/bio.c | 21 ++-- fs/crypto/crypto.c | 1 + fs/crypto/fscrypt_private.h | 3 + fs/ext4/ext4.h | 2 - fs/ext4/readpage.c | 153 +----------------------------- fs/ext4/super.c | 9 +- fs/post_read_process.c | 127 +++++++++++++++++++++++++ fs/verity/verify.c | 12 +++ include/linux/fscrypt.h | 11 --- include/linux/post_read_process.h | 21 ++++ 11 files changed, 176 insertions(+), 187 deletions(-) create mode 100644 fs/post_read_process.c create mode 100644 include/linux/post_read_process.h
Quoted 16 lines
fs/Makefile obj-y := open.o read_write.o file_table.o super.o \ · line 17
Quoted 12 lines
fs/Makefile +2
-1@@ -12,7 +12,8 @@ obj-y := open.o read_write.o file_table.o super.o \ attr.o bad_inode.o file.o filesystems.o namespace.o \ seq_file.o xattr.o libfs.o fs-writeback.o \ pnode.o splice.o sync.o utimes.o d_path.o \ - stack.o fs_struct.o statfs.o fs_pin.o nsfs.o + stack.o fs_struct.o statfs.o fs_pin.o nsfs.o \ + post_read_process.oTo avoid bloating every Linux kernel in existence,
post_read_process.cshould only be compiled ifCONFIG_FS_ENCRYPTION||CONFIG_FS_VERITY.
Will do.
Quoted 316 lines
Quoted 316 lines
fs/Makefile +0
-0ifeq ($(CONFIG_BLOCK),y) obj-y += buffer.o block_dev.o direct-io.o mpage.ofs/crypto/bio.c +7
-14@@ -24,6 +24,8 @@#include <linux/module.h> #include <linux/bio.h> #include <linux/namei.h> +#include <linux/post_read_process.h> +#include "fscrypt_private.h" static void __fscrypt_decrypt_bio (struct bio *bio,bool done)@@ -53,24 +55,15 @@ void fscrypt_decrypt_bio(struct bio *bio) }EXPORT_SYMBOL (fscrypt_decrypt_bio); -static void completion_pages (struct work_struct *work) +void fscrypt_decrypt_work (struct work_struct *work) { -struct fscrypt_ctx *ctx = - container_of(work, struct fscrypt_ctx, r.work); -struct bio *bio = ctx->r.bio; +struct bio_post_read_ctx *ctx = + container_of(work, struct bio_post_read_ctx, work); -__fscrypt_decrypt_bio (bio, true); -fscrypt_release_ctx (ctx); -bio_put (bio); -} +fscrypt_decrypt_bio (ctx->bio); -void fscrypt_enqueue_decrypt_bio (struct fscrypt_ctx *ctx,struct bio *bio) -{ -INIT_WORK (&ctx->r.work, completion_pages); - ctx->r.bio = bio; -fscrypt_enqueue_decrypt_work (&ctx->r.work); +bio_post_read_processing (ctx); } -EXPORT_SYMBOL (fscrypt_enqueue_decrypt_bio);void fscrypt_pullback_bio_page (struct page **page,bool restore) {fs/crypto/crypto.c +1
-0@@ -53,6 +53,7 @@ struct kmem_cache *fscrypt_info_cachep;void fscrypt_enqueue_decrypt_work (struct work_struct *work) { +INIT_WORK (work, fscrypt_decrypt_work);queue_work (fscrypt_read_workqueue, work); }EXPORT_SYMBOL (fscrypt_enqueue_decrypt_work);fs/crypto/fscrypt_private.h +3
-0@@ -114,6 +114,9 @@ static inline bool fscrypt_valid_enc_modes(u32 contents_mode,return false; } +/* bio.c */ +void fscrypt_decrypt_work (struct work_struct *work); +/* crypto.c */ extern struct kmem_cache *fscrypt_info_cachep;extern int fscrypt_initialize (unsigned int cop_flags);fs/ext4/ext4.h +0
-2@@ -3088,8 +3088,6 @@ static inline void ext4_set_de_type(struct super_block *sb,extern int ext4_mpage_readpages (struct address_space *mapping,struct list_head *pages,struct page *page,unsigned nr_pages,bool is_readahead); -extern int __init ext4_init_post_read_processing (void ); -extern void ext4_exit_post_read_processing (void );/* symlink.c */ extern const struct inode_operations ext4_encrypted_symlink_inode_operations;fs/ext4/readpage.c +2
-151@@ -44,14 +44,10 @@#include <linux/backing-dev.h> #include <linux/pagevec.h> #include <linux/cleancache.h> +#include <linux/post_read_process.h> #include "ext4.h" -#define NUM_PREALLOC_POST_READ_CTXS 128 - -static struct kmem_cache *bio_post_read_ctx_cache; -static mempool_t *bio_post_read_ctx_pool; -static inline bool ext4_bio_encrypted (struct bio *bio) {#ifdef CONFIG_FS_ENCRYPTION @@ -61,124 +57,6 @@ static inline bool ext4_bio_encrypted(struct bio *bio)#endif } -/* postprocessing steps for read bios */ -enum bio_post_read_step { -STEP_INITIAL =0 , -STEP_DECRYPT , -STEP_VERITY , -}; - -struct bio_post_read_ctx { -struct bio *bio; -struct work_struct work; -unsigned int cur_step; -unsigned int enabled_steps; -}; - -static void __read_end_io (struct bio *bio) -{ -struct page *page; -struct bio_vec *bv; -int i; - -bio_for_each_segment_all (bv, bio, i) { - page = bv->bv_page; - -/* PG_error was set if any post_read step failed */ -if (bio->bi_status ||PageError (page)) { -ClearPageUptodate (page); -SetPageError (page); - }else { -SetPageUptodate (page); - } -unlock_page (page); - } -if (bio->bi_private) -mempool_free (bio->bi_private, bio_post_read_ctx_pool); -bio_put (bio); -} - -static void bio_post_read_processing (struct bio_post_read_ctx *ctx); - -static void decrypt_work (struct work_struct *work) -{ -struct bio_post_read_ctx *ctx = - container_of(work, struct bio_post_read_ctx, work); - -fscrypt_decrypt_bio (ctx->bio); - -bio_post_read_processing (ctx); -} - -static void verity_work (struct work_struct *work) -{ -struct bio_post_read_ctx *ctx = - container_of(work, struct bio_post_read_ctx, work); - -fsverity_verify_bio (ctx->bio); - -bio_post_read_processing (ctx); -} - -static void bio_post_read_processing (struct bio_post_read_ctx *ctx) -{ -/* -* We use different work queues for decryption and for verity because -* verity may require reading metadata pages that need decryption, and -* we shouldn't recurse to the same workqueue. -*/ -switch (++ctx->cur_step) { -case STEP_DECRYPT : -if (ctx->enabled_steps & (1 <<STEP_DECRYPT )) { -INIT_WORK (&ctx->work, decrypt_work); -fscrypt_enqueue_decrypt_work (&ctx->work); -return ; - } - ctx->cur_step++; -/* fall-through */ -case STEP_VERITY : -if (ctx->enabled_steps & (1 <<STEP_VERITY )) { -INIT_WORK (&ctx->work, verity_work); -fsverity_enqueue_verify_work (&ctx->work); -return ; - } - ctx->cur_step++; -/* fall-through */ -default : -__read_end_io (ctx->bio); - } -} - -static struct bio_post_read_ctx *get_bio_post_read_ctx (struct inode *inode, -struct bio *bio, -pgoff_t index) -{ -unsigned int post_read_steps =0 ; -struct bio_post_read_ctx *ctx =NULL ; - -if (IS_ENCRYPTED (inode) &&S_ISREG (inode->i_mode)) - post_read_steps |=1 <<STEP_DECRYPT ; -#ifdef CONFIG_FS_VERITY -if (inode->i_verity_info !=NULL && - (index < ((i_size_read (inode) +PAGE_SIZE -1 ) >>PAGE_SHIFT ))) - post_read_steps |=1 <<STEP_VERITY ; -#endif -if (post_read_steps) { - ctx =mempool_alloc (bio_post_read_ctx_pool,GFP_NOFS ); -if (!ctx) -return ERR_PTR (-ENOMEM ); - ctx->bio = bio; - ctx->enabled_steps = post_read_steps; - bio->bi_private = ctx; - } -return ctx; -} - -static bool bio_post_read_required (struct bio *bio) -{ -return bio->bi_private && !bio->bi_status; -} -/* * I/O completion handler for multipage BIOs. * @@ -196,11 +74,10 @@ static void mpage_end_io(struct bio *bio)if (bio_post_read_required (bio)) {struct bio_post_read_ctx *ctx = bio->bi_private; - ctx->cur_step =STEP_INITIAL ;bio_post_read_processing (ctx);return ; } -__read_end_io (bio); +end_bio_post_read_processing (bio); }static inline loff_t ext4_readpage_limit (struct inode *inode)@@ -416,29 +293,3 @@ int ext4_mpage_readpages(struct address_space *mapping,submit_bio (bio);return 0 ; } - -int __init ext4_init_post_read_processing (void ) -{ - bio_post_read_ctx_cache = -kmem_cache_create ("ext4_bio_post_read_ctx" , -sizeof (struct bio_post_read_ctx ),0 ,0 ,NULL ); -if (!bio_post_read_ctx_cache) - goto fail; - bio_post_read_ctx_pool = -mempool_create_slab_pool (NUM_PREALLOC_POST_READ_CTXS , - bio_post_read_ctx_cache); -if (!bio_post_read_ctx_pool) - goto fail_free_cache; -return 0 ; - -fail_free_cache: -kmem_cache_destroy (bio_post_read_ctx_cache); -fail: -return -ENOMEM ; -} - -void ext4_exit_post_read_processing (void ) -{ -mempool_destroy (bio_post_read_ctx_pool); -kmem_cache_destroy (bio_post_read_ctx_cache); -}fs/ext4/super.c +1
-8@@ -6102,10 +6102,6 @@ static int __init ext4_init_fs(void)return err; err =ext4_init_pending (); -if (err) - goto out7; - - err =ext4_init_post_read_processing ();if (err) goto out6;@@ -6147,10 +6143,8 @@ static int __init ext4_init_fs(void) out4:ext4_exit_pageio (); out5: -ext4_exit_post_read_processing (); -out6:ext4_exit_pending (); -out7: +out6:ext4_exit_es ();return err;@@ -6167,7 +6161,6 @@ static void __exit ext4_exit_fs(void)ext4_exit_sysfs ();ext4_exit_system_zone ();ext4_exit_pageio (); -ext4_exit_post_read_processing ();ext4_exit_es ();ext4_exit_pending (); }fs/post_read_process.c new file +3
-0@@ -0,0 +1,127 @@ +// SPDX-License-Identifier: GPL-2.0 +#include <linux/module.h> +#include <linux/mm.h>
Quoted 9 lines
fs/post_read_process.c line 8
Quoted 5 lines
fs/post_read_process.c new file +5
-0+#include <linux/pagemap.h> +#include <linux/bio.h> +#include <linux/fscrypt.h> +#include <linux/fsverity.h> +#include <linux/post_read_process.h> To help people who come across this code, please add a comment at the top of this file that briefly describes what it is.
Sure, I will add a header describing the the code's utility.
Quoted 163 lines
Quoted 163 lines
fs/post_read_process.c new file +119
-0+ +#define NUM_PREALLOC_POST_READ_CTXS 128 + +static struct kmem_cache *bio_post_read_ctx_cache; +static mempool_t *bio_post_read_ctx_pool; + +/* postprocessing steps for read bios */ +enum bio_post_read_step { +STEP_INITIAL =0 , +STEP_DECRYPT , +STEP_VERITY , +}; + +void end_bio_post_read_processing (struct bio *bio) +{ +struct page *page; +struct bio_vec *bv; +int i; + +bio_for_each_segment_all (bv, bio, i) { + page = bv->bv_page; + +/* PG_error was set if any post_read step failed */ +if (bio->bi_status ||PageError (page)) { +ClearPageUptodate (page); +SetPageError (page); + }else { +SetPageUptodate (page); + } +unlock_page (page); + } +if (bio->bi_private) +put_bio_post_read_ctx (bio->bi_private); +bio_put (bio); +} + +void bio_post_read_processing (struct bio_post_read_ctx *ctx) +{ +/* +* We use different work queues for decryption and for verity because +* verity may require reading metadata pages that need decryption, and +* we shouldn't recurse to the same workqueue. +*/ +switch (++ctx->cur_step) { +case STEP_DECRYPT : +if (ctx->enabled_steps & (1 <<STEP_DECRYPT )) { +fscrypt_enqueue_decrypt_work (&ctx->work); +return ; + } + ctx->cur_step++; +/* fall-through */ +case STEP_VERITY : +if (ctx->enabled_steps & (1 <<STEP_VERITY )) { +fsverity_enqueue_verify_work (&ctx->work); +return ; + } + ctx->cur_step++; +/* fall-through */ +default : +end_bio_post_read_processing (ctx->bio); + } +} + +struct bio_post_read_ctx *get_bio_post_read_ctx (struct inode *inode, +struct bio *bio, +pgoff_t index) +{ +unsigned int post_read_steps =0 ; +struct bio_post_read_ctx *ctx =NULL ; + +if (IS_ENCRYPTED (inode) &&S_ISREG (inode->i_mode)) + post_read_steps |=1 <<STEP_DECRYPT ; +#ifdef CONFIG_FS_VERITY +if (inode->i_verity_info !=NULL && + (index < ((i_size_read (inode) +PAGE_SIZE -1 ) >>PAGE_SHIFT ))) + post_read_steps |=1 <<STEP_VERITY ; +#endif +if (post_read_steps) { + ctx =mempool_alloc (bio_post_read_ctx_pool,GFP_NOFS ); +if (!ctx) +return ERR_PTR (-ENOMEM ); + ctx->bio = bio; + ctx->inode = inode; + ctx->enabled_steps = post_read_steps; + ctx->cur_step =STEP_INITIAL ; + bio->bi_private = ctx; + } +return ctx; +} + +void put_bio_post_read_ctx (struct bio_post_read_ctx *ctx) +{ +mempool_free (ctx, bio_post_read_ctx_pool); +} + +bool bio_post_read_required (struct bio *bio) +{ +return bio->bi_private && !bio->bi_status; +} + +static int __init bio_init_post_read_processing (void ) +{ + bio_post_read_ctx_cache =KMEM_CACHE (bio_post_read_ctx,0 ); +if (!bio_post_read_ctx_cache) + goto fail; + bio_post_read_ctx_pool = +mempool_create_slab_pool (NUM_PREALLOC_POST_READ_CTXS , + bio_post_read_ctx_cache); +if (!bio_post_read_ctx_pool) + goto fail_free_cache; +return 0 ; + +fail_free_cache: +kmem_cache_destroy (bio_post_read_ctx_cache); +fail: +return -ENOMEM ; +} + +fs_initcall (bio_init_post_read_processing);fs/verity/verify.c +12
-0@@ -13,6 +13,7 @@#include <linux/pagemap.h> #include <linux/ratelimit.h> #include <linux/scatterlist.h> +#include <linux/post_read_process.h> struct workqueue_struct *fsverity_read_workqueue;@@ -283,6 +284,16 @@ void fsverity_verify_bio(struct bio *bio)EXPORT_SYMBOL_GPL (fsverity_verify_bio);#endif /* CONFIG_BLOCK */ +static void fsverity_verify_work (struct work_struct *work) +{ +struct bio_post_read_ctx *ctx = + container_of(work, struct bio_post_read_ctx, work); + +fsverity_verify_bio (ctx->bio); + +bio_post_read_processing (ctx); +} +/** * fsverity_enqueue_verify_work - enqueue work on the fs-verity workqueue * @@ -290,6 +301,7 @@ EXPORT_SYMBOL_GPL(fsverity_verify_bio);*/ void fsverity_enqueue_verify_work (struct work_struct *work) { +INIT_WORK (work, fsverity_verify_work);queue_work (fsverity_read_workqueue, work); }EXPORT_SYMBOL_GPL (fsverity_enqueue_verify_work);include/linux/fscrypt.h +0
-0@@ -68,10 +68,6 @@ struct fscrypt_ctx {struct page *bounce_page;/* Ciphertext page */ struct page *control_page;/* Original page */
Quoted 8 lines
include/linux/fscrypt.h struct fscrypt_ctx { · line 74
Quoted 5 lines
include/linux/fscrypt.h +0
-4} w; -struct { -struct bio *bio; -struct work_struct work; - } r;Now that 'struct
fscrypt_ctx' is only used for writes, the 'w' part should be changed to an anonymous struct.
Ok. I will change that.
Quoted 56 lines
Quoted 42 lines
include/linux/fscrypt.h +0
-7struct list_head free_list;/* Free list */ };u8 flags;/* Flags */ @@ -206,8 +202,6 @@ static inline bool fscrypt_match_name(const struct fscrypt_name *fname,/* bio.c */ extern void fscrypt_decrypt_bio (struct bio *); -extern void fscrypt_enqueue_decrypt_bio (struct fscrypt_ctx *ctx, -struct bio *bio);extern void fscrypt_pullback_bio_page (struct page **,bool );extern int fscrypt_zeroout_range (const struct inode *,pgoff_t ,sector_t ,unsigned int );@@ -376,11 +370,6 @@ static inline void fscrypt_decrypt_bio(struct bio *bio) { } -static inline void fscrypt_enqueue_decrypt_bio (struct fscrypt_ctx *ctx, -struct bio *bio) -{ -} -static inline void fscrypt_pullback_bio_page (struct page **page,bool restore) {return ;include/linux/post_read_process.h new file +11
-0@@ -0,0 +1,21 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _POST_READ_PROCESS_H +#define _POST_READ_PROCESS_H + +struct bio_post_read_ctx { +struct bio *bio; +struct inode *inode; +struct work_struct work; +unsigned int cur_step; +unsigned int enabled_steps; +};include/linux/post_read_process.h line 21
Quoted 10 lines
include/linux/post_read_process.h new file +10
-0+ +void end_bio_post_read_processing (struct bio *bio); +void bio_post_read_processing (struct bio_post_read_ctx *ctx); +struct bio_post_read_ctx *get_bio_post_read_ctx (struct inode *inode, +struct bio *bio, +pgoff_t index); +void put_bio_post_read_ctx (struct bio_post_read_ctx *ctx); +bool bio_post_read_required (struct bio *bio); + +#endif /* _POST_READ_PROCESS_H */ - Eric
Signature · 1 line
chandan
RFC PATCH 5/10 fsverity: Add call back to decide if verity check has to be performed
In reply to Chandan RajendraExt4 and F2FS store verity metadata in data extents (beyond inode->i_size) associated with a file. But other filesystems might choose alternative means to store verity metadata. Hence this commit adds a callback function pointer to 'struct fsverity_operations' to help in deciding if verity operation needs to performed against a page-cache page holding file data.
--- fs/ext4/super.c | 9 +++++++++ fs/post_read_process.c | 5 +++-- include/linux/fsverity.h | 1 + 3 files changed, 13 insertions(+), 2 deletions(-)
fs/ext4/super.c +9 -0
@@ -1428,10 +1428,19 @@ static struct page *ext4_read_verity_metadata_page(struct inode *inode, return read_mapping_page(inode->i_mapping, index, NULL); } +static bool ext4_verity_required (struct inode *inode,pgoff_t index) +{ +if (index < ((i_size_read (inode) +PAGE_SIZE -1 ) >>PAGE_SHIFT )) +return true; +else +return false; +} +static const struct fsverity_operations ext4_verityops = { .set_verity = ext4_set_verity, .get_metadata_end = ext4_get_verity_metadata_end, .read_metadata_page = ext4_read_verity_metadata_page, + .verity_required = ext4_verity_required, };#endif /* CONFIG_FS_VERITY */
fs/post_read_process.c +3 -2
@@ -79,8 +79,9 @@ struct bio_post_read_ctx *get_bio_post_read_ctx(struct inode *inode,if (IS_ENCRYPTED (inode) &&S_ISREG (inode->i_mode)) post_read_steps |=1 <<STEP_DECRYPT ;#ifdef CONFIG_FS_VERITY -if (inode->i_verity_info !=NULL && - (index < ((i_size_read (inode) +PAGE_SIZE -1 ) >>PAGE_SHIFT ))) +if (inode->i_verity_info !=NULL + && inode->i_sb->s_vop->verity_required + && inode->i_sb->s_vop->verity_required (inode, index)) post_read_steps |=1 <<STEP_VERITY ;#endif if (post_read_steps) {
include/linux/fsverity.h +1 -0
@@ -18,6 +18,7 @@ struct fsverity_operations {int (*set_verity)(struct inode *inode,loff_t data_i_size);int (*get_metadata_end)(struct inode *inode,loff_t *metadata_end_ret);struct page *(*read_metadata_page)(struct inode *inode,pgoff_t index); +bool (*verity_required)(struct inode *inode,pgoff_t index); };#ifdef CONFIG_FS_VERITY
Signature · 8 lines
2.19.1 _______________________________________________ Linux-f2fs-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
Eric Biggers
maintainerRe: [f2fs-dev] [RFC PATCH 05/10] fsverity: Add call back to decide if verity check has to be performed
Hi Chandan,
Quoted 19 lines · Chandan Rajendra
Ext4 and F2FS store verity metadata in data extents (beyond
inode->i_size) associated with a file. But other filesystems might choose alternative means to store verity metadata. Hence this commit adds a callback function pointer to 'structfsverity_operations' to help in deciding if verity operation needs to performed against a page-cache page holding file data.Signed-off-by Chandan Rajendra <[email protected]>--- fs/ext4/super.c | 9 +++++++++ fs/post_read_process.c | 5 +++-- include/linux/fsverity.h | 1 + 3 files changed, 13 insertions(+), 2 deletions(-)fs/ext4/super.c +0
-0
fs/ext4/super.c static struct page *ext4_read_verity_metadata_page(struct inode *inode, · line 1437
Quoted 10 lines
fs/ext4/super.c +7
-0@@ -1428,10 +1428,19 @@ static struct page *ext4_read_verity_metadata_page(struct inode *inode,return read_mapping_page (inode->i_mapping, index,NULL ); } +static bool ext4_verity_required (struct inode *inode,pgoff_t index) +{ +if (index < ((i_size_read (inode) +PAGE_SIZE -1 ) >>PAGE_SHIFT )) +return true; +else +return false; +}
This can be simplified to:
return index < (i_size_read(inode) + PAGE_SIZE - 1) >> PAGE_SHIFT;
fs/ext4/super.c static struct page *ext4_read_verity_metadata_page(struct inode *inode, · line 1445
Quoted 8 lines
fs/ext4/super.c +2
-0+static const struct fsverity_operations ext4_verityops = { .set_verity = ext4_set_verity, .get_metadata_end = ext4_get_verity_metadata_end, .read_metadata_page = ext4_read_verity_metadata_page, + .verity_required = ext4_verity_required, };#endif /* CONFIG_FS_VERITY */
Doesn't f2fs need this too? This patch only changes ext4.
Quoted 6 lines
fs/post_read_process.c +0
-0
fs/post_read_process.c struct bio_post_read_ctx *get_bio_post_read_ctx(struct inode *inode, · line 85
Quoted 9 lines
fs/post_read_process.c +3
-2@@ -79,8 +79,9 @@ struct bio_post_read_ctx *get_bio_post_read_ctx(struct inode *inode,if (IS_ENCRYPTED (inode) &&S_ISREG (inode->i_mode)) post_read_steps |=1 <<STEP_DECRYPT ;#ifdef CONFIG_FS_VERITY -if (inode->i_verity_info !=NULL && - (index < ((i_size_read (inode) +PAGE_SIZE -1 ) >>PAGE_SHIFT ))) +if (inode->i_verity_info !=NULL + && inode->i_sb->s_vop->verity_required + && inode->i_sb->s_vop->verity_required (inode, index)) post_read_steps |=1 <<STEP_VERITY ;
If ->verity_required is NULL, shouldn't that be equivalent to ->verity_required() returning true?
Quoted 17 lines
fs/post_read_process.c +0
-0#endif if (post_read_steps) {include/linux/fsverity.h +1
-0@@ -18,6 +18,7 @@ struct fsverity_operations {int (*set_verity)(struct inode *inode,loff_t data_i_size);int (*get_metadata_end)(struct inode *inode,loff_t *metadata_end_ret);struct page *(*read_metadata_page)(struct inode *inode,pgoff_t index); +bool (*verity_required)(struct inode *inode,pgoff_t index); };#ifdef CONFIG_FS_VERITY Signature · 1 line
2.19.1
- Eric
Re: [f2fs-dev] [RFC PATCH 05/10] fsverity: Add call back to decide if verity check has to be performed
Quoted 35 lines · IST Eric Biggers
Hi Chandan,
Quoted 19 lines · Chandan Rajendra
Ext4 and F2FS store verity metadata in data extents (beyond
inode->i_size) associated with a file. But other filesystems might choose alternative means to store verity metadata. Hence this commit adds a callback function pointer to 'structfsverity_operations' to help in deciding if verity operation needs to performed against a page-cache page holding file data.Signed-off-by Chandan Rajendra <[email protected]>--- fs/ext4/super.c | 9 +++++++++ fs/post_read_process.c | 5 +++-- include/linux/fsverity.h | 1 + 3 files changed, 13 insertions(+), 2 deletions(-)fs/ext4/super.c +0
-0fs/ext4/super.c static struct page *ext4_read_verity_metadata_page(struct inode *inode, · line 1437
Quoted 10 lines
fs/ext4/super.c +7
-0@@ -1428,10 +1428,19 @@ static struct page *ext4_read_verity_metadata_page(struct inode *inode,return read_mapping_page (inode->i_mapping, index,NULL ); } +static bool ext4_verity_required (struct inode *inode,pgoff_t index) +{ +if (index < ((i_size_read (inode) +PAGE_SIZE -1 ) >>PAGE_SHIFT )) +return true; +else +return false; +}This can be simplified to:
Quoted 2 lines
return index < (i_size_read(inode) + PAGE_SIZE - 1) >> PAGE_SHIFT;
You are right.
Quoted 10 lines
fs/ext4/super.c static struct page *ext4_read_verity_metadata_page(struct inode *inode, · line 1445
Quoted 8 lines
fs/ext4/super.c +2
-0+static const struct fsverity_operations ext4_verityops = { .set_verity = ext4_set_verity, .get_metadata_end = ext4_get_verity_metadata_end, .read_metadata_page = ext4_read_verity_metadata_page, + .verity_required = ext4_verity_required, };#endif /* CONFIG_FS_VERITY */ Doesn't f2fs need this too? This patch only changes ext4.
Yes, My plan was to get review comments about the current approach and then make corresponding changes in F2FS.
Quoted 11 lines
Quoted 11 lines
fs/post_read_process.c +0
-1@@ -79,8 +79,9 @@ struct bio_post_read_ctx *get_bio_post_read_ctx(struct inode *inode,if (IS_ENCRYPTED (inode) &&S_ISREG (inode->i_mode)) post_read_steps |=1 <<STEP_DECRYPT ;#ifdef CONFIG_FS_VERITY - if (inode->i_verity_info != NULL &&
Quoted 9 lines
fs/post_read_process.c struct bio_post_read_ctx *get_bio_post_read_ctx(struct inode *inode, · line 85
Quoted 5 lines
fs/post_read_process.c +3
-1- (index < ((i_size_read(inode) + PAGE_SIZE - 1) >> PAGE_SHIFT))) +if (inode->i_verity_info !=NULL + && inode->i_sb->s_vop->verity_required + && inode->i_sb->s_vop->verity_required (inode, index)) post_read_steps |=1 <<STEP_VERITY ;If ->verity_required is NULL, shouldn't that be equivalent to ->verity_required() returning true?
Yes, you are right about that. I will fix it in the next iteration of the patchset.
Quoted 18 lines
Quoted 7 lines
fs/post_read_process.c +0
-0#endif if (post_read_steps) {include/linux/fsverity.h +0
-0include/linux/fsverity.h struct fsverity_operations { · line 24
Quoted 7 lines
include/linux/fsverity.h +1
-0@@ -18,6 +18,7 @@ struct fsverity_operations {int (*set_verity)(struct inode *inode,loff_t data_i_size);int (*get_metadata_end)(struct inode *inode,loff_t *metadata_end_ret);struct page *(*read_metadata_page)(struct inode *inode,pgoff_t index); +bool (*verity_required)(struct inode *inode,pgoff_t index); };#ifdef CONFIG_FS_VERITY - Eric
Signature · 1 line
chandan
RFC PATCH 6/10 Introduce REQ_POST_READ_PROC bio flag
In reply to Chandan RajendraExt4 and F2FS currently use a non-NULL value stored at bio->bi_private to determine if the contents of the bio need to be "post processed" i.e. whether its contents need to be decrypted and/or verified. For block size < page size scenario, bio->bi_private would hold a pointer to buffer_head. Hence, this commit adds the new flag REQ_POST_READ_PROC to be able to decisively check for post process requirement for a bio.
--- fs/ext4/readpage.c | 11 +++++++++-- fs/post_read_process.c | 2 +- include/linux/blk_types.h | 2 ++ 3 files changed, 12 insertions(+), 3 deletions(-)
fs/ext4/readpage.c +9 -2
@@ -245,6 +245,7 @@ int ext4_mpage_readpages(struct address_space *mapping, }if (bio ==NULL ) {struct bio_post_read_ctx *ctx; +unsigned int op_flags =0 ; bio =bio_alloc (GFP_KERNEL ,min_t (int, nr_pages,BIO_MAX_PAGES ));
@@ -259,8 +260,14 @@ int ext4_mpage_readpages(struct address_space *mapping, bio->bi_iter.bi_sector = blocks[0 ] << (blkbits -9 ); bio->bi_end_io = mpage_end_io; bio->bi_private = ctx; -bio_set_op_attrs (bio,REQ_OP_READ , - is_readahead ?REQ_RAHEAD :0 ); + +if (is_readahead) + op_flags |=REQ_RAHEAD ; + +if (ctx) + op_flags |=REQ_POST_READ_PROC ; + +bio_set_op_attrs (bio,REQ_OP_READ , op_flags); } length = first_hole << blkbits;
fs/post_read_process.c +1 -1
@@ -104,7 +104,7 @@ void put_bio_post_read_ctx(struct bio_post_read_ctx *ctx)bool bio_post_read_required (struct bio *bio) { -return bio->bi_private && !bio->bi_status; +return bio->bi_opf &REQ_POST_READ_PROC ; }static int __init bio_init_post_read_processing (void )
include/linux/blk_types.h +2 -0
@@ -320,6 +320,7 @@ enum req_flag_bits { __REQ_RAHEAD,/* read ahead, can fail anytime */ __REQ_BACKGROUND,/* background IO */ __REQ_NOWAIT,/* Don't wait if request will block */ + __REQ_POST_READ_PROC,/* command specific flags for REQ_OP_WRITE_ZEROES: */ __REQ_NOUNMAP, /* do not free blocks when zeroing */
@@ -346,6 +347,7 @@ enum req_flag_bits {#define REQ_RAHEAD (1ULL << __REQ_RAHEAD)#define REQ_BACKGROUND (1ULL << __REQ_BACKGROUND)#define REQ_NOWAIT (1ULL << __REQ_NOWAIT) +#define REQ_POST_READ_PROC (1ULL << __REQ_POST_READ_PROC)#define REQ_NOUNMAP (1ULL << __REQ_NOUNMAP)#define REQ_HIPRI (1ULL << __REQ_HIPRI)
Signature · 8 lines
2.19.1 _______________________________________________ Linux-f2fs-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
Eric Biggers
maintainerRe: [f2fs-dev] [RFC PATCH 06/10] Introduce REQ_POST_READ_PROC bio flag
Hi Chandan,
Quoted 81 lines · Chandan Rajendra
Ext4 and F2FS currently use a non-NULL value stored at
bio->bi_privateto determine if the contents of the bio need to be "post processed" i.e. whether its contents need to be decrypted and/or verified. For block size < page size scenario,bio->bi_privatewould hold a pointer tobuffer_head. Hence, this commit adds the new flagREQ_POST_READ_PROCto be able to decisively check for post process requirement for a bio.Signed-off-by Chandan Rajendra <[email protected]>--- fs/ext4/readpage.c | 11 +++++++++-- fs/post_read_process.c | 2 +- include/linux/blk_types.h | 2 ++ 3 files changed, 12 insertions(+), 3 deletions(-)fs/ext4/readpage.c +9
-2@@ -245,6 +245,7 @@ int ext4_mpage_readpages(struct address_space *mapping, }if (bio ==NULL ) {struct bio_post_read_ctx *ctx; +unsigned int op_flags =0 ; bio =bio_alloc (GFP_KERNEL ,min_t (int, nr_pages,BIO_MAX_PAGES ));@@ -259,8 +260,14 @@ int ext4_mpage_readpages(struct address_space *mapping, bio->bi_iter.bi_sector = blocks[0 ] << (blkbits -9 ); bio->bi_end_io = mpage_end_io; bio->bi_private = ctx; -bio_set_op_attrs (bio,REQ_OP_READ , - is_readahead ?REQ_RAHEAD :0 ); + +if (is_readahead) + op_flags |=REQ_RAHEAD ; + +if (ctx) + op_flags |=REQ_POST_READ_PROC ; + +bio_set_op_attrs (bio,REQ_OP_READ , op_flags); } length = first_hole << blkbits;fs/post_read_process.c +1
-1@@ -104,7 +104,7 @@ void put_bio_post_read_ctx(struct bio_post_read_ctx *ctx)bool bio_post_read_required (struct bio *bio) { -return bio->bi_private && !bio->bi_status; +return bio->bi_opf &REQ_POST_READ_PROC ; }static int __init bio_init_post_read_processing (void )include/linux/blk_types.h +2
-0@@ -320,6 +320,7 @@ enum req_flag_bits { __REQ_RAHEAD,/* read ahead, can fail anytime */ __REQ_BACKGROUND,/* background IO */ __REQ_NOWAIT,/* Don't wait if request will block */ + __REQ_POST_READ_PROC,/* command specific flags for REQ_OP_WRITE_ZEROES: */ __REQ_NOUNMAP, /* do not free blocks when zeroing */@@ -346,6 +347,7 @@ enum req_flag_bits {#define REQ_RAHEAD (1ULL << __REQ_RAHEAD)#define REQ_BACKGROUND (1ULL << __REQ_BACKGROUND)#define REQ_NOWAIT (1ULL << __REQ_NOWAIT) +#define REQ_POST_READ_PROC (1ULL << __REQ_POST_READ_PROC)#define REQ_NOUNMAP (1ULL << __REQ_NOUNMAP)#define REQ_HIPRI (1ULL << __REQ_HIPRI)Signature · 1 line
2.19.1
I don't think this is an appropriate use of a request flag, as request flags are meant for the block layer.
Also doesn't the bio still need a pointer to the bio_post_read_ctx anyway? So I don't see how this would solve the problem, if ->bi_private is already used.
- Eric
Re: [f2fs-dev] [RFC PATCH 06/10] Introduce REQ_POST_READ_PROC bio flag
Quoted 83 lines · IST Eric Biggers
Hi Chandan,
Quoted 69 lines · Chandan Rajendra
Ext4 and F2FS currently use a non-NULL value stored at
bio->bi_privateto determine if the contents of the bio need to be "post processed" i.e. whether its contents need to be decrypted and/or verified. For block size < page size scenario,bio->bi_privatewould hold a pointer tobuffer_head. Hence, this commit adds the new flagREQ_POST_READ_PROCto be able to decisively check for post process requirement for a bio.Signed-off-by Chandan Rajendra <[email protected]>--- fs/ext4/readpage.c | 11 +++++++++-- fs/post_read_process.c | 2 +- include/linux/blk_types.h | 2 ++ 3 files changed, 12 insertions(+), 3 deletions(-)fs/ext4/readpage.c +9
-2@@ -245,6 +245,7 @@ int ext4_mpage_readpages(struct address_space *mapping, }if (bio ==NULL ) {struct bio_post_read_ctx *ctx; +unsigned int op_flags =0 ; bio =bio_alloc (GFP_KERNEL ,min_t (int, nr_pages,BIO_MAX_PAGES ));@@ -259,8 +260,14 @@ int ext4_mpage_readpages(struct address_space *mapping, bio->bi_iter.bi_sector = blocks[0 ] << (blkbits -9 ); bio->bi_end_io = mpage_end_io; bio->bi_private = ctx; -bio_set_op_attrs (bio,REQ_OP_READ , - is_readahead ?REQ_RAHEAD :0 ); + +if (is_readahead) + op_flags |=REQ_RAHEAD ; + +if (ctx) + op_flags |=REQ_POST_READ_PROC ; + +bio_set_op_attrs (bio,REQ_OP_READ , op_flags); } length = first_hole << blkbits;fs/post_read_process.c +1
-1@@ -104,7 +104,7 @@ void put_bio_post_read_ctx(struct bio_post_read_ctx *ctx)bool bio_post_read_required (struct bio *bio) { -return bio->bi_private && !bio->bi_status; +return bio->bi_opf &REQ_POST_READ_PROC ; }static int __init bio_init_post_read_processing (void )include/linux/blk_types.h +1
-0@@ -320,6 +320,7 @@ enum req_flag_bits { __REQ_RAHEAD,/* read ahead, can fail anytime */ __REQ_BACKGROUND,/* background IO */ __REQ_NOWAIT,/* Don't wait if request will block */ + __REQ_POST_READ_PROC,/* command specific flags for REQ_OP_WRITE_ZEROES: */ __REQ_NOUNMAP, /* do not free blocks when zeroing */include/linux/blk_types.h enum req_flag_bits { · line 353
Quoted 7 lines
include/linux/blk_types.h +1
-0@@ -346,6 +347,7 @@ enum req_flag_bits {#define REQ_RAHEAD (1ULL << __REQ_RAHEAD)#define REQ_BACKGROUND (1ULL << __REQ_BACKGROUND)#define REQ_NOWAIT (1ULL << __REQ_NOWAIT) +#define REQ_POST_READ_PROC (1ULL << __REQ_POST_READ_PROC)#define REQ_NOUNMAP (1ULL << __REQ_NOUNMAP)#define REQ_HIPRI (1ULL << __REQ_HIPRI)I don't think this is an appropriate use of a request flag, as request flags are meant for the block layer.
Quoted 2 lines
Also doesn't the bio still need a pointer to the
bio_post_read_ctxanyway? So I don't see how this would solve the problem, if ->bi_private is already used.
I had glanced across block_read_full_page() function which implements reading non-contiguous blocks mapped by the page in block size < page size scenario. Here bio->bi_private would point to the buffer head that represents the block on which read I/O was performed. In such a case, bio_post_read_required() would always return true. Hence I decided to add this request flag.
Now, I believe we can actually save away the ctx pointer in bh->b_private member and later decide on whether the buffer head requires post processing based on bh->bi_private's non-NULL value. I will have to read up the code more thoroughly to confirm this.
Signature · 1 line
chandan
RFC PATCH 7/10 fsverity: Add call back to determine readpage limit
In reply to Chandan RajendraExt4 and F2FS store verity metadata beyond i_size. This commit adds a call back pointer to "struct fsverity_operations" which helps in determining the the real file size limit upto which data can be read from the file.
This call back will be required in order to get do_mpage_readpage() to read files having verity metadata appended beyond i_size.
--- fs/ext4/super.c | 18 ++++++++++++++++++ include/linux/fsverity.h | 1 + 2 files changed, 19 insertions(+)
fs/ext4/super.c +18 -0
@@ -1428,6 +1428,23 @@ static struct page *ext4_read_verity_metadata_page(struct inode *inode,return read_mapping_page (inode->i_mapping, index,NULL ); } +static loff_t ext4_readpage_limit (struct inode *inode) +{ +#ifdef CONFIG_FS_VERITY +if (IS_VERITY (inode)) { +if (inode->i_verity_info) +/* limit to end of metadata region */ +return fsverity_full_i_size (inode); +/* +* fsverity_info is currently being set up and no user reads are +* allowed yet. It's easiest to just not enforce a limit yet. +*/ +return inode->i_sb->s_maxbytes; + } +#endif +return i_size_read (inode); +} +static bool ext4_verity_required (struct inode *inode,pgoff_t index) {if (index < ((i_size_read (inode) +PAGE_SIZE -1 ) >>PAGE_SHIFT ))
@@ -1441,6 +1458,7 @@ static const struct fsverity_operations ext4_verityops = { .get_metadata_end = ext4_get_verity_metadata_end, .read_metadata_page = ext4_read_verity_metadata_page, .verity_required = ext4_verity_required, + .readpage_limit = ext4_readpage_limit, };#endif /* CONFIG_FS_VERITY */
include/linux/fsverity.h +1 -0
@@ -19,6 +19,7 @@ struct fsverity_operations {int (*get_metadata_end)(struct inode *inode,loff_t *metadata_end_ret);struct page *(*read_metadata_page)(struct inode *inode,pgoff_t index);bool (*verity_required)(struct inode *inode,pgoff_t index); +loff_t (*readpage_limit)(struct inode *inode); };#ifdef CONFIG_FS_VERITY
Signature · 1 line
2.19.1
RFC PATCH 8/10 fsverity: Add call back to verify file holes
In reply to Chandan Rajendrareadpage() implmentations zero out part of the page-cache page mapping a file hole. This commit adds a call back to "struct fsverity_operations" which readpage() can invoke to verify the file hole.
--- fs/ext4/super.c | 1 + include/linux/fsverity.h | 1 + 2 files changed, 2 insertions(+)
fs/ext4/super.c +1 -0
@@ -1459,6 +1459,7 @@ static const struct fsverity_operations ext4_verityops = { .read_metadata_page = ext4_read_verity_metadata_page, .verity_required = ext4_verity_required, .readpage_limit = ext4_readpage_limit, + .check_hole = fsverity_check_hole, };#endif /* CONFIG_FS_VERITY */
include/linux/fsverity.h +1 -0
@@ -20,6 +20,7 @@ struct fsverity_operations {struct page *(*read_metadata_page)(struct inode *inode,pgoff_t index);bool (*verity_required)(struct inode *inode,pgoff_t index);loff_t (*readpage_limit)(struct inode *inode); +bool (*check_hole)(struct inode *inode,struct page *page); };#ifdef CONFIG_FS_VERITY
Signature · 1 line
2.19.1
Eric Biggers
maintainerRe: [RFC PATCH 08/10] fsverity: Add call back to verify file holes
Quoted 3 lines · Chandan Rajendra
readpage()implmentations zero out part of the page-cache page mapping a file hole. This commit adds a call back to "structfsverity_operations" whichreadpage()can invoke to verify the file hole.
I don't see why this is needed. Since now CONFIG_FS_VERITY will be a bool, can't you just call fsverity_verify_hole() directly?
Quoted 34 lines
Signed-off-by Chandan Rajendra <[email protected]>--- fs/ext4/super.c | 1 + include/linux/fsverity.h | 1 + 2 files changed, 2 insertions(+)fs/ext4/super.c +1
-0@@ -1459,6 +1459,7 @@ static const struct fsverity_operations ext4_verityops = { .read_metadata_page = ext4_read_verity_metadata_page, .verity_required = ext4_verity_required, .readpage_limit = ext4_readpage_limit, + .check_hole = fsverity_check_hole, };#endif /* CONFIG_FS_VERITY */ include/linux/fsverity.h +1
-0@@ -20,6 +20,7 @@ struct fsverity_operations {struct page *(*read_metadata_page)(struct inode *inode,pgoff_t index);bool (*verity_required)(struct inode *inode,pgoff_t index);loff_t (*readpage_limit)(struct inode *inode); +bool (*check_hole)(struct inode *inode,struct page *page); };#ifdef CONFIG_FS_VERITY Signature · 1 line
2.19.1
Re: [RFC PATCH 08/10] fsverity: Add call back to verify file holes
Quoted 7 lines · IST Eric Biggers
Quoted 3 lines · Chandan Rajendra
readpage()implmentations zero out part of the page-cache page mapping a file hole. This commit adds a call back to "structfsverity_operations" whichreadpage()can invoke to verify the file hole.I don't see why this is needed. Since now
CONFIG_FS_VERITYwill be a bool, can't you just callfsverity_verify_hole()directly?
Yes, I will drop this patch and replace the call back invocation (provided in the next patch) with a call to fsverity_check_hole().
Signature · 1 line
chandan
RFC PATCH 9/10 fs/mpage.c: Integrate post read processing
In reply to Chandan RajendraThis commit adds code to make do_mpage_readpage() to be "post read processing" aware i.e. for files requiring decryption/verification, do_mpage_readpage() now allocates a context structure and marks the bio with a flag to indicate that after read operation is performed, the bio's payload needs to be processed further before handing over the data to user space.
The context structure is used for tracking the state machine associated with post read processing.
--- fs/mpage.c | 77 +++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 59 insertions(+), 18 deletions(-)
fs/mpage.c +59 -18
@@ -30,6 +30,8 @@#include <linux/backing-dev.h> #include <linux/pagevec.h> #include <linux/cleancache.h> +#include <linux/fsverity.h> +#include <linux/post_read_process.h> #include "internal.h" /*
@@ -49,6 +51,13 @@ static void mpage_end_io(struct bio *bio)struct bio_vec *bv;int i; +if (bio_post_read_required (bio)) { +struct bio_post_read_ctx *ctx = bio->bi_private; + +bio_post_read_processing (ctx); +return ; + } +bio_for_each_segment_all (bv, bio, i) {struct page *page = bv->bv_page; page_endio(page, bio_op(bio),
@@ -142,6 +151,7 @@ struct mpage_readpage_args {struct buffer_head map_bh;unsigned long first_logical_block;get_block_t *get_block; +int op_flags; };/*
@@ -170,25 +180,22 @@ static struct bio *do_mpage_readpage(struct mpage_readpage_args *args)struct block_device *bdev =NULL ;int length;int fully_mapped =1 ; -int op_flags;unsigned nblocks;unsigned relative_block;gfp_t gfp; -if (args->is_readahead) { - op_flags =REQ_RAHEAD ; - gfp =readahead_gfp_mask (page->mapping); - }else { - op_flags =0 ; - gfp =mapping_gfp_constraint (page->mapping,GFP_KERNEL ); - } -if (page_has_buffers (page)) goto confused; block_in_file = (sector_t )page->index << (PAGE_SHIFT - blkbits); last_block = block_in_file + args->nr_pages * blocks_per_page; - last_block_in_file = (i_size_read (inode) + blocksize -1 ) >> blkbits; +#ifdef CONFIG_FS_VERITY +if (IS_VERITY (inode) && inode->i_sb->s_vop->readpage_limit) + last_block_in_file = inode->i_sb->s_vop->readpage_limit (inode); + else +#endif + last_block_in_file = (i_size_read (inode) + blocksize -1 ) + >> blkbits;if (last_block > last_block_in_file) last_block = last_block_in_file; page_block =0 ;
@@ -276,6 +283,10 @@ static struct bio *do_mpage_readpage(struct mpage_readpage_args *args)if (first_hole != blocks_per_page) {zero_user_segment (page, first_hole << blkbits,PAGE_SIZE );if (first_hole ==0 ) { +#ifdef CONFIG_FS_VERITY +if (IS_VERITY (inode) && inode->i_sb->s_vop->check_hole) + inode->i_sb->s_vop->check_hole (inode, page); +#endif SetPageUptodate (page);unlock_page (page); goto out;
@@ -294,26 +305,54 @@ static struct bio *do_mpage_readpage(struct mpage_readpage_args *args)* This page will go to BIO. Do we need to send this BIO off first? */ if (args->bio && (args->last_block_in_bio != blocks[0 ] -1 )) - args->bio =mpage_bio_submit (REQ_OP_READ , op_flags, args->bio); + args->bio =mpage_bio_submit (REQ_OP_READ , args->op_flags, + args->bio); alloc_new:if (args->bio ==NULL ) { -if (first_hole == blocks_per_page) { +struct bio_post_read_ctx *ctx; + +if (first_hole == blocks_per_page + && !(IS_ENCRYPTED (inode) ||IS_VERITY (inode))) {if (!bdev_read_page (bdev, blocks[0 ] << (blkbits -9 ), page)) goto out; } + + args->op_flags =0 ; + +if (args->is_readahead) { + args->op_flags =REQ_RAHEAD ; + gfp =readahead_gfp_mask (page->mapping); + }else { + gfp =mapping_gfp_constraint (page->mapping,GFP_KERNEL ); + } + args->bio =mpage_alloc (bdev, blocks[0 ] << (blkbits -9 ),min_t (int, args->nr_pages,BIO_MAX_PAGES ), gfp); -if (args->bio ==NULL ) +if (args->bio ==NULL ) { + args->op_flags =0 ; goto confused; + } + + ctx =get_bio_post_read_ctx (inode, args->bio, page->index); +if (IS_ERR (ctx)) { + args->op_flags =0 ; +bio_put (args->bio); + args->bio =NULL ; + goto confused; + } + +if (ctx) + args->op_flags |=REQ_POST_READ_PROC ; } length = first_hole << blkbits;if (bio_add_page (args->bio, page, length,0 ) < length) { - args->bio =mpage_bio_submit (REQ_OP_READ , op_flags, args->bio); + args->bio =mpage_bio_submit (REQ_OP_READ , args->op_flags, + args->bio); goto alloc_new; }
@@ -321,7 +360,8 @@ static struct bio *do_mpage_readpage(struct mpage_readpage_args *args) nblocks = map_bh->b_size >> blkbits;if ((buffer_boundary (map_bh) && relative_block == nblocks) || (first_hole != blocks_per_page)) - args->bio =mpage_bio_submit (REQ_OP_READ , op_flags, args->bio); + args->bio =mpage_bio_submit (REQ_OP_READ , args->op_flags, + args->bio);else args->last_block_in_bio = blocks[blocks_per_page -1 ]; out:
@@ -329,7 +369,8 @@ static struct bio *do_mpage_readpage(struct mpage_readpage_args *args) confused:if (args->bio) - args->bio =mpage_bio_submit (REQ_OP_READ , op_flags, args->bio); + args->bio =mpage_bio_submit (REQ_OP_READ , args->op_flags, + args->bio);if (!PageUptodate (page))block_read_full_page (page, args->get_block);else
@@ -407,7 +448,7 @@ mpage_readpages(struct address_space *mapping, struct list_head *pages, }BUG_ON (!list_empty (pages));if (args.bio) -mpage_bio_submit (REQ_OP_READ ,REQ_RAHEAD , args.bio); +mpage_bio_submit (REQ_OP_READ , args.op_flags, args.bio);return 0 ; }EXPORT_SYMBOL (mpage_readpages);
@@ -425,7 +466,7 @@ int mpage_readpage(struct page *page, get_block_t get_block) args.bio =do_mpage_readpage (&args);if (args.bio) -mpage_bio_submit (REQ_OP_READ ,0 , args.bio); +mpage_bio_submit (REQ_OP_READ , args.op_flags, args.bio);return 0 ; }EXPORT_SYMBOL (mpage_readpage);
Signature · 1 line
2.19.1
RFC PATCH 10/10 ext4: Wire up ext4_readpage[s] to use mpage_readpage[s]
In reply to Chandan RajendraNow that do_mpage_readpage() is "post read process" aware, this commit gets ext4_readpage[s] to use mpage_readpage[s] and deletes ext4's readpage.c since the associated functionality is not required anymore.
--- fs/ext4/Makefile | 2 +- fs/ext4/inode.c | 5 +- fs/ext4/readpage.c | 302 --------------------------------------------- 3 files changed, 3 insertions(+), 306 deletions(-) delete mode 100644 fs/ext4/readpage.c
fs/ext4/Makefile +1 -1
@@ -8,7 +8,7 @@ obj-$(CONFIG_EXT4_FS) += ext4.o ext4-y := balloc.o bitmap.o block_validity.o dir.o ext4_jbd2.o extents.o \ extents_status.o file.o fsmap.o fsync.o hash.o ialloc.o \ indirect.o inline.o inode.o ioctl.o mballoc.o migrate.o \ - mmp.o move_extent.o namei.o page-io.o readpage.o resize.o \ + mmp.o move_extent.o namei.o page-io.o resize.o \ super.o symlink.o sysfs.o xattr.o xattr_trusted.o xattr_user.o ext4-$(CONFIG_EXT4_FS_POSIX_ACL) += acl.o
fs/ext4/inode.c +2 -3
@@ -3355,8 +3355,7 @@ static int ext4_readpage(struct file *file, struct page *page) ret =ext4_readpage_inline (inode, page);if (ret == -EAGAIN ) -return ext4_mpage_readpages (page->mapping,NULL , page,1 , - false); +return mpage_readpage (page, ext4_get_block);return ret; }
@@ -3371,7 +3370,7 @@ ext4_readpages(struct file *file, struct address_space *mapping,if (ext4_has_inline_data (inode))return 0 ; -return ext4_mpage_readpages (mapping, pages,NULL , nr_pages, true); +return mpage_readpages (mapping, pages, nr_pages, ext4_get_block); } static void ext4_invalidatepage(struct page *page, unsigned int offset,
fs/ext4/readpage.c deleted +0 -302
302 lines not on this page · raw message
Signature · 1 line
2.19.1
Quoted 9 lines · IST Chandan Rajendra
This patchset moves the "post read processing" code into a file of its own and gets the generic
do_mpage_readpge()to make use of the functionality provided. With these changes in place, the patchset changes Ext4 to use mpage_readpage[s] instead of its own customext4_readpages()function. This is done to reduce duplicity of code across filesystems. Based on the reviews provided for this patchset, I will change F2FS to use mpage_readpage[s] and post the next version of this patchset to linux-fsdevel mailing list.
Quoted 4 lines
The patchset also includes patches from previous postings i.e. patches to replace per-filesystem encryption config options with a single config option that affects all filesystems making use of fscrypt code.
The patchset is based on fsverity_2019-01-30 branch of Eric's git tree. It can also be obtained from "https://github.com/chandanr/linux.git use-mpage-readpage-rfc".
Quoted 71 lines
Chandan Rajendra (10):
ext4: useIS_ENCRYPTED()to check encryption status
f2fs: useIS_ENCRYPTED()to check encryption status
fscrypt: remove filesystem specific build config option Consolidate "post read processing" into a new file
fsverity: Add call back to decide if verity check has to be performed IntroduceREQ_POST_READ_PROCbio flag
fsverity: Add call back to determine readpage limit
fsverity: Add call back to verify file holes
fs/mpage.c: Integrate post read processing
ext4: Wire up ext4_readpage[s] to use mpage_readpage[s]Documentation/filesystems/fscrypt.rst | 4 +- arch/mips/configs/generic_defconfig | 2 +- arch/nds32/configs/defconfig | 2 +- arch/s390/configs/debug_defconfig | 2 +- arch/s390/configs/performance_defconfig | 2 +- fs/Makefile | 3 +- fs/crypto/Kconfig | 5 +- fs/crypto/bio.c | 21 +- fs/crypto/crypto.c | 1 + fs/crypto/fscrypt_private.h | 4 +- fs/ext4/Kconfig | 15 - fs/ext4/Makefile | 2 +- fs/ext4/dir.c | 10 +- fs/ext4/ext4.h | 14 +- fs/ext4/ext4_jbd2.h | 2 +- fs/ext4/extents.c | 4 +- fs/ext4/ialloc.c | 2 +- fs/ext4/inode.c | 29 +- fs/ext4/ioctl.c | 4 +- fs/ext4/move_extent.c | 3 +- fs/ext4/namei.c | 18 +- fs/ext4/page-io.c | 9 +- fs/ext4/readpage.c | 444 ------------------------ fs/ext4/super.c | 43 ++- fs/ext4/sysfs.c | 4 +- fs/f2fs/Kconfig | 12 +- fs/f2fs/data.c | 4 +- fs/f2fs/dir.c | 10 +- fs/f2fs/f2fs.h | 14 +- fs/f2fs/file.c | 10 +- fs/f2fs/inode.c | 4 +- fs/f2fs/namei.c | 6 +- fs/f2fs/super.c | 8 +- fs/f2fs/sysfs.c | 4 +- fs/mpage.c | 77 +++- fs/post_read_process.c | 128 +++++++ fs/ubifs/Kconfig | 12 +- fs/ubifs/Makefile | 2 +- fs/ubifs/ioctl.c | 4 +- fs/ubifs/sb.c | 2 +- fs/ubifs/super.c | 2 +- fs/ubifs/ubifs.h | 5 +- fs/verity/verify.c | 12 + include/linux/blk_types.h | 2 + include/linux/fs.h | 4 +- include/linux/fscrypt.h | 405 ++++++++++++++++++++- include/linux/fscrypt_notsupp.h | 231 ------------ include/linux/fscrypt_supp.h | 204 ----------- include/linux/fsverity.h | 3 + include/linux/post_read_process.h | 21 ++ 50 files changed, 757 insertions(+), 1078 deletions(-) delete mode 100644 fs/ext4/readpage.c create mode 100644 fs/post_read_process.c delete mode 100644 include/linux/fscrypt_notsupp.h delete mode 100644 include/linux/fscrypt_supp.h create mode 100644 include/linux/post_read_process.h
Signature · 1 line
chandan
Eric Biggers
maintainerHi Chandan,
Quoted 14 lines · Chandan Rajendra
This patchset moves the "post read processing" code into a file of its own and gets the generic
do_mpage_readpge()to make use of the functionality provided. With these changes in place, the patchset changes Ext4 to use mpage_readpage[s] instead of its own customext4_readpages()function. This is done to reduce duplicity of code across filesystems. Based on the reviews provided for this patchset, I will change F2FS to use mpage_readpage[s] and post the next version of this patchset to linux-fsdevel mailing list.The patchset also includes patches from previous postings i.e. patches to replace per-filesystem encryption config options with a single config option that affects all filesystems making use of fscrypt code.
Quoted 12 lines
Chandan Rajendra (10):
ext4: useIS_ENCRYPTED()to check encryption status
f2fs: useIS_ENCRYPTED()to check encryption status
fscrypt: remove filesystem specific build config option Consolidate "post read processing" into a new file
fsverity: Add call back to decide if verity check has to be performed IntroduceREQ_POST_READ_PROCbio flag
fsverity: Add call back to determine readpage limit
fsverity: Add call back to verify file holes
fs/mpage.c: Integrate post read processing
ext4: Wire up ext4_readpage[s] to use mpage_readpage[s]
Thanks for working on this! This will also make it much easier to support block_size != PAGE_SIZE in ext4 encryption, right? I think this is the best path forward, but I'll take a closer look at your new patches.
FYI regarding practical matters, merging fs-verity was delayed due to disagreement about the API. See https://lwn.net/Articles/775872/.
We don't have to wait for fs-verity for your initial fscrypt changes, though:
ext4: use IS_ENCRYPTED() to check encryption status
f2fs: use IS_ENCRYPTED() to check encryption status
fscrypt: remove filesystem specific build config option
So, a couple weeks ago Ted and I already queued those three patches in fscrypt.git (https://git.kernel.org/pub/scm/linux/kernel/git/tytso/fscrypt.git
branch "master", though we plan to change the repo soon) for the upcoming merge window, based on upstream rather than fs-verity. Are you fine with that?
I also suggest adding linux-fsdevel to the Cc given the fs/*.c changes.
Thanks!
- Eric
_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
Quoted 39 lines · IST Eric Biggers
Hi Chandan,
Quoted 14 lines · Chandan Rajendra
This patchset moves the "post read processing" code into a file of its own and gets the generic
do_mpage_readpge()to make use of the functionality provided. With these changes in place, the patchset changes Ext4 to use mpage_readpage[s] instead of its own customext4_readpages()function. This is done to reduce duplicity of code across filesystems. Based on the reviews provided for this patchset, I will change F2FS to use mpage_readpage[s] and post the next version of this patchset to linux-fsdevel mailing list.The patchset also includes patches from previous postings i.e. patches to replace per-filesystem encryption config options with a single config option that affects all filesystems making use of fscrypt code.
Quoted 12 lines
Chandan Rajendra (10):
ext4: useIS_ENCRYPTED()to check encryption status
f2fs: useIS_ENCRYPTED()to check encryption status
fscrypt: remove filesystem specific build config option Consolidate "post read processing" into a new file
fsverity: Add call back to decide if verity check has to be performed IntroduceREQ_POST_READ_PROCbio flag
fsverity: Add call back to determine readpage limit
fsverity: Add call back to verify file holes
fs/mpage.c: Integrate post read processing
ext4: Wire up ext4_readpage[s] to use mpage_readpage[s]Thanks for working on this! This will also make it much easier to support
block_size!=PAGE_SIZEin ext4 encryption, right? I think this is the best path forward, but I'll take a closer look at your new patches.FYI regarding practical matters, merging fs-verity was delayed due to disagreement about the API. See https://lwn.net/Articles/775872/.
We don't have to wait for fs-verity for your initial fscrypt changes, though:
Quoted 8 lines
ext4: use
IS_ENCRYPTED()to check encryption status
f2fs: useIS_ENCRYPTED()to check encryption status
fscrypt: remove filesystem specific build config optionSo, a couple weeks ago Ted and I already queued those three patches in fscrypt.git (https://git.kernel.org/pub/scm/linux/kernel/git/tytso/fscrypt.git
branch "master", though we plan to change the repo soon) for the upcoming merge window, based on upstream rather than fs-verity. Are you fine with that?
Yes, the changes looks good. Thanks for queueing them up.
Quoted 2 lines
I also suggest adding linux-fsdevel to the Cc given the
fs/*.cchanges.
Yes, I will do that.
Quoted 6 lines
Thanks!
- Eric
Signature · 1 line
chandan
Eric Biggers
maintainerQuoted 3 lines · Chandan Rajendra
Based on the reviews provided for this patchset, I
will change F2FS to use mpage_readpage[s] and post the next version of this patchset to linux-fsdevel mailing list.
Is that really possible? F2FS has other functionality in its ->readpages(), such as support for filesystems that use multiple block devices.
- Eric
Quoted 8 lines · IST Eric Biggers
Quoted 3 lines · Chandan Rajendra
Based on the reviews provided for this patchset, I
will change F2FS to use mpage_readpage[s] and post the next version of this patchset to linux-fsdevel mailing list.Is that really possible? F2FS has other functionality in its ->readpages(), such as support for filesystems that use multiple block devices.
Hmm. I didn't know that. Thanks for pointing that out. I will read up that code and if it isn't really possible to get F2FS to use mpage_readpage[s](), then I would limit the patchset to Ext4.
Signature · 1 line
chandan
Eric Biggers
maintainerQuoted 6 lines · Chandan Rajendra
Quoted 5 lines · IST Eric Biggers
Quoted 3 lines · Chandan Rajendra
Based on the reviews provided for this patchset, I
will change F2FS to use mpage_readpage[s] and post the next version of this patchset to linux-fsdevel mailing list.
Quoted 8 lines
Quoted 3 lines
Is that really possible? F2FS has other functionality in its ->readpages(), such as support for filesystems that use multiple block devices.
Hmm. I didn't know that. Thanks for pointing that out. I will read up that code and if it isn't really possible to get F2FS to use mpage_readpage[s](), then I would limit the patchset to Ext4.
But we can make F2FS use the shared bio_post_read functions even if it can't use mpage_readpage[s](), right?
- Eric
Quoted 11 lines · IST Eric Biggers
Quoted 10 lines · Chandan Rajendra
Quoted 8 lines · IST Eric Biggers
Quoted 3 lines · Chandan Rajendra
Based on the reviews provided for this patchset, I
will change F2FS to use mpage_readpage[s] and post the next version of this patchset to linux-fsdevel mailing list.Is that really possible? F2FS has other functionality in its ->readpages(), such as support for filesystems that use multiple block devices.
Quoted 8 lines
Quoted 4 lines
Hmm. I didn't know that. Thanks for pointing that out. I will read up that code and if it isn't really possible to get F2FS to use mpage_readpage[s](), then I would limit the patchset to Ext4.
But we can make F2FS use the shared
bio_post_readfunctions even if it can't use mpage_readpage[s](), right?
Yes, that should be possible. I will include those changes in the next version of the patchset.
Signature · 1 line
chandan