Loading block/bio.c +4 −1 Original line number Diff line number Diff line Loading @@ -568,8 +568,11 @@ EXPORT_SYMBOL(bio_phys_segments); static inline void bio_clone_crypt_key(struct bio *dst, const struct bio *src) { #ifdef CONFIG_PFK dst->bi_crypt_key = src->bi_crypt_key; dst->bi_iter.bi_dun = src->bi_iter.bi_dun; #ifdef CONFIG_DM_DEFAULT_KEY dst->bi_crypt_key = src->bi_crypt_key; dst->bi_crypt_skip = src->bi_crypt_skip; #endif dst->bi_dio_inode = src->bi_dio_inode; #endif } Loading fs/crypto/fscrypt_ice.c +14 −1 Original line number Diff line number Diff line Loading @@ -126,16 +126,29 @@ void fscrypt_set_ice_dun(const struct inode *inode, struct bio *bio, u64 dun) } EXPORT_SYMBOL(fscrypt_set_ice_dun); void fscrypt_set_ice_skip(struct bio *bio, int bi_crypt_skip) { #ifdef CONFIG_DM_DEFAULT_KEY bio->bi_crypt_skip = bi_crypt_skip; #endif } EXPORT_SYMBOL(fscrypt_set_ice_skip); /* * This function will be used for filesystem when deciding to merge bios. * Basic assumption is, if inline_encryption is set, single bio has to * guarantee consecutive LBAs as well as ino|pg->index. */ bool fscrypt_mergeable_bio(struct bio *bio, u64 dun, bool bio_encrypted) bool fscrypt_mergeable_bio(struct bio *bio, u64 dun, bool bio_encrypted, int bi_crypt_skip) { if (!bio) return true; #ifdef CONFIG_DM_DEFAULT_KEY if (bi_crypt_skip != bio->bi_crypt_skip) return false; #endif /* if both of them are not encrypted, no further check is needed */ if (!bio_dun(bio) && !bio_encrypted) return true; Loading fs/f2fs/data.c +7 −4 Original line number Diff line number Diff line Loading @@ -449,6 +449,7 @@ int f2fs_submit_page_bio(struct f2fs_io_info *fio) if (f2fs_may_encrypt_bio(inode, fio)) fscrypt_set_ice_dun(inode, bio, PG_DUN(inode, fio->page)); fscrypt_set_ice_skip(bio, fio->encrypted_page ? 1 : 0); if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE) { bio_put(bio); Loading @@ -471,6 +472,7 @@ int f2fs_submit_page_write(struct f2fs_io_info *fio) struct page *bio_page; struct inode *inode; bool bio_encrypted; int bi_crypt_skip; u64 dun; int err = 0; Loading @@ -497,6 +499,7 @@ int f2fs_submit_page_write(struct f2fs_io_info *fio) bio_page = fio->encrypted_page ? fio->encrypted_page : fio->page; inode = fio->page->mapping->host; dun = PG_DUN(inode, fio->page); bi_crypt_skip = fio->encrypted_page ? 1 : 0; bio_encrypted = f2fs_may_encrypt_bio(inode, fio); /* set submitted = true as a return value */ Loading @@ -510,7 +513,7 @@ int f2fs_submit_page_write(struct f2fs_io_info *fio) __submit_merged_bio(io); /* ICE support */ if (!fscrypt_mergeable_bio(io->bio, dun, bio_encrypted)) if (!fscrypt_mergeable_bio(io->bio, dun, bio_encrypted, bi_crypt_skip)) __submit_merged_bio(io); alloc_new: Loading @@ -526,7 +529,7 @@ int f2fs_submit_page_write(struct f2fs_io_info *fio) fio->type, fio->temp); if (bio_encrypted) fscrypt_set_ice_dun(inode, io->bio, dun); fscrypt_set_ice_skip(io->bio, bi_crypt_skip); io->fio = *fio; } Loading Loading @@ -1538,7 +1541,7 @@ static int f2fs_mpage_readpages(struct address_space *mapping, dun = PG_DUN(inode, page); bio_encrypted = f2fs_may_encrypt_bio(inode, NULL); if (!fscrypt_mergeable_bio(bio, dun, bio_encrypted)) { if (!fscrypt_mergeable_bio(bio, dun, bio_encrypted, 0)) { __submit_bio(F2FS_I_SB(inode), bio, DATA); bio = NULL; } Loading include/linux/blk_types.h +3 −0 Original line number Diff line number Diff line Loading @@ -78,6 +78,9 @@ struct bio { */ struct inode *bi_dio_inode; #endif #ifdef CONFIG_DM_DEFAULT_KEY int bi_crypt_skip; #endif unsigned short bi_vcnt; /* how many bio_vec's */ Loading include/linux/fscrypt.h +8 −2 Original line number Diff line number Diff line Loading @@ -257,7 +257,9 @@ static inline int fscrypt_encrypt_symlink(struct inode *inode, extern int fscrypt_using_hardware_encryption(const struct inode *inode); extern void fscrypt_set_ice_dun(const struct inode *inode, struct bio *bio, u64 dun); extern bool fscrypt_mergeable_bio(struct bio *bio, u64 dun, bool bio_encrypted); extern bool fscrypt_mergeable_bio(struct bio *bio, u64 dun, bool bio_encrypted, int bi_crypt_skip); extern void fscrypt_set_ice_skip(struct bio *bio, int bi_crypt_skip); #else static inline int fscrypt_using_hardware_encryption(const struct inode *inode) { Loading @@ -270,8 +272,12 @@ static inline void fscrypt_set_ice_dun(const struct inode *inode, return; } static inline void fscrypt_set_ice_skip(struct bio *bio, int bi_crypt_skip) { } static inline bool fscrypt_mergeable_bio(struct bio *bio, u64 dun, bool bio_encrypted) u64 dun, bool bio_encrypted, int bi_crypt_skip) { return true; } Loading Loading
block/bio.c +4 −1 Original line number Diff line number Diff line Loading @@ -568,8 +568,11 @@ EXPORT_SYMBOL(bio_phys_segments); static inline void bio_clone_crypt_key(struct bio *dst, const struct bio *src) { #ifdef CONFIG_PFK dst->bi_crypt_key = src->bi_crypt_key; dst->bi_iter.bi_dun = src->bi_iter.bi_dun; #ifdef CONFIG_DM_DEFAULT_KEY dst->bi_crypt_key = src->bi_crypt_key; dst->bi_crypt_skip = src->bi_crypt_skip; #endif dst->bi_dio_inode = src->bi_dio_inode; #endif } Loading
fs/crypto/fscrypt_ice.c +14 −1 Original line number Diff line number Diff line Loading @@ -126,16 +126,29 @@ void fscrypt_set_ice_dun(const struct inode *inode, struct bio *bio, u64 dun) } EXPORT_SYMBOL(fscrypt_set_ice_dun); void fscrypt_set_ice_skip(struct bio *bio, int bi_crypt_skip) { #ifdef CONFIG_DM_DEFAULT_KEY bio->bi_crypt_skip = bi_crypt_skip; #endif } EXPORT_SYMBOL(fscrypt_set_ice_skip); /* * This function will be used for filesystem when deciding to merge bios. * Basic assumption is, if inline_encryption is set, single bio has to * guarantee consecutive LBAs as well as ino|pg->index. */ bool fscrypt_mergeable_bio(struct bio *bio, u64 dun, bool bio_encrypted) bool fscrypt_mergeable_bio(struct bio *bio, u64 dun, bool bio_encrypted, int bi_crypt_skip) { if (!bio) return true; #ifdef CONFIG_DM_DEFAULT_KEY if (bi_crypt_skip != bio->bi_crypt_skip) return false; #endif /* if both of them are not encrypted, no further check is needed */ if (!bio_dun(bio) && !bio_encrypted) return true; Loading
fs/f2fs/data.c +7 −4 Original line number Diff line number Diff line Loading @@ -449,6 +449,7 @@ int f2fs_submit_page_bio(struct f2fs_io_info *fio) if (f2fs_may_encrypt_bio(inode, fio)) fscrypt_set_ice_dun(inode, bio, PG_DUN(inode, fio->page)); fscrypt_set_ice_skip(bio, fio->encrypted_page ? 1 : 0); if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE) { bio_put(bio); Loading @@ -471,6 +472,7 @@ int f2fs_submit_page_write(struct f2fs_io_info *fio) struct page *bio_page; struct inode *inode; bool bio_encrypted; int bi_crypt_skip; u64 dun; int err = 0; Loading @@ -497,6 +499,7 @@ int f2fs_submit_page_write(struct f2fs_io_info *fio) bio_page = fio->encrypted_page ? fio->encrypted_page : fio->page; inode = fio->page->mapping->host; dun = PG_DUN(inode, fio->page); bi_crypt_skip = fio->encrypted_page ? 1 : 0; bio_encrypted = f2fs_may_encrypt_bio(inode, fio); /* set submitted = true as a return value */ Loading @@ -510,7 +513,7 @@ int f2fs_submit_page_write(struct f2fs_io_info *fio) __submit_merged_bio(io); /* ICE support */ if (!fscrypt_mergeable_bio(io->bio, dun, bio_encrypted)) if (!fscrypt_mergeable_bio(io->bio, dun, bio_encrypted, bi_crypt_skip)) __submit_merged_bio(io); alloc_new: Loading @@ -526,7 +529,7 @@ int f2fs_submit_page_write(struct f2fs_io_info *fio) fio->type, fio->temp); if (bio_encrypted) fscrypt_set_ice_dun(inode, io->bio, dun); fscrypt_set_ice_skip(io->bio, bi_crypt_skip); io->fio = *fio; } Loading Loading @@ -1538,7 +1541,7 @@ static int f2fs_mpage_readpages(struct address_space *mapping, dun = PG_DUN(inode, page); bio_encrypted = f2fs_may_encrypt_bio(inode, NULL); if (!fscrypt_mergeable_bio(bio, dun, bio_encrypted)) { if (!fscrypt_mergeable_bio(bio, dun, bio_encrypted, 0)) { __submit_bio(F2FS_I_SB(inode), bio, DATA); bio = NULL; } Loading
include/linux/blk_types.h +3 −0 Original line number Diff line number Diff line Loading @@ -78,6 +78,9 @@ struct bio { */ struct inode *bi_dio_inode; #endif #ifdef CONFIG_DM_DEFAULT_KEY int bi_crypt_skip; #endif unsigned short bi_vcnt; /* how many bio_vec's */ Loading
include/linux/fscrypt.h +8 −2 Original line number Diff line number Diff line Loading @@ -257,7 +257,9 @@ static inline int fscrypt_encrypt_symlink(struct inode *inode, extern int fscrypt_using_hardware_encryption(const struct inode *inode); extern void fscrypt_set_ice_dun(const struct inode *inode, struct bio *bio, u64 dun); extern bool fscrypt_mergeable_bio(struct bio *bio, u64 dun, bool bio_encrypted); extern bool fscrypt_mergeable_bio(struct bio *bio, u64 dun, bool bio_encrypted, int bi_crypt_skip); extern void fscrypt_set_ice_skip(struct bio *bio, int bi_crypt_skip); #else static inline int fscrypt_using_hardware_encryption(const struct inode *inode) { Loading @@ -270,8 +272,12 @@ static inline void fscrypt_set_ice_dun(const struct inode *inode, return; } static inline void fscrypt_set_ice_skip(struct bio *bio, int bi_crypt_skip) { } static inline bool fscrypt_mergeable_bio(struct bio *bio, u64 dun, bool bio_encrypted) u64 dun, bool bio_encrypted, int bi_crypt_skip) { return true; } Loading