Loading fs/crypto/bio.c +1 −1 Original line number Original line Diff line number Diff line Loading @@ -131,7 +131,7 @@ int fscrypt_zeroout_range(const struct inode *inode, pgoff_t lblk, bio_set_dev(bio, inode->i_sb->s_bdev); bio_set_dev(bio, inode->i_sb->s_bdev); bio->bi_iter.bi_sector = bio->bi_iter.bi_sector = pblk << (inode->i_sb->s_blocksize_bits - 9); pblk << (inode->i_sb->s_blocksize_bits - 9); bio_set_op_attrs(bio, REQ_OP_WRITE, 0); bio_set_op_attrs(bio, REQ_OP_WRITE, REQ_NOENCRYPT); ret = bio_add_page(bio, ciphertext_page, ret = bio_add_page(bio, ciphertext_page, inode->i_sb->s_blocksize, 0); inode->i_sb->s_blocksize, 0); if (ret != inode->i_sb->s_blocksize) { if (ret != inode->i_sb->s_blocksize) { Loading fs/ext4/ext4.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -216,7 +216,10 @@ typedef struct ext4_io_end { ssize_t size; /* size of the extent */ ssize_t size; /* size of the extent */ } ext4_io_end_t; } ext4_io_end_t; #define EXT4_IO_ENCRYPTED 1 struct ext4_io_submit { struct ext4_io_submit { unsigned int io_flags; struct writeback_control *io_wbc; struct writeback_control *io_wbc; struct bio *io_bio; struct bio *io_bio; ext4_io_end_t *io_end; ext4_io_end_t *io_end; Loading fs/ext4/inode.c +9 −6 Original line number Original line Diff line number Diff line Loading @@ -1216,11 +1216,12 @@ static int ext4_block_write_begin(struct page *page, loff_t pos, unsigned len, if (!buffer_uptodate(bh) && !buffer_delay(bh) && if (!buffer_uptodate(bh) && !buffer_delay(bh) && !buffer_unwritten(bh) && !buffer_unwritten(bh) && (block_start < from || block_end > to)) { (block_start < from || block_end > to)) { ll_rw_block(REQ_OP_READ, 0, 1, &bh); *wait_bh++ = bh; decrypt = ext4_encrypted_inode(inode) && decrypt = ext4_encrypted_inode(inode) && S_ISREG(inode->i_mode) && S_ISREG(inode->i_mode) && !fscrypt_using_hardware_encryption(inode); !fscrypt_using_hardware_encryption(inode); ll_rw_block(REQ_OP_READ, (decrypt ? REQ_NOENCRYPT : 0), 1, &bh); *wait_bh++ = bh; } } } } /* /* Loading Loading @@ -4049,6 +4050,7 @@ static int __ext4_block_zero_page_range(handle_t *handle, struct inode *inode = mapping->host; struct inode *inode = mapping->host; struct buffer_head *bh; struct buffer_head *bh; struct page *page; struct page *page; bool decrypt; int err = 0; int err = 0; page = find_or_create_page(mapping, from >> PAGE_SHIFT, page = find_or_create_page(mapping, from >> PAGE_SHIFT, Loading Loading @@ -4091,14 +4093,15 @@ static int __ext4_block_zero_page_range(handle_t *handle, if (!buffer_uptodate(bh)) { if (!buffer_uptodate(bh)) { err = -EIO; err = -EIO; ll_rw_block(REQ_OP_READ, 0, 1, &bh); decrypt = S_ISREG(inode->i_mode) && ext4_encrypted_inode(inode) && !fscrypt_using_hardware_encryption(inode); ll_rw_block(REQ_OP_READ, (decrypt ? REQ_NOENCRYPT : 0), 1, &bh); wait_on_buffer(bh); wait_on_buffer(bh); /* Uhhuh. Read error. Complain and punt. */ /* Uhhuh. Read error. Complain and punt. */ if (!buffer_uptodate(bh)) if (!buffer_uptodate(bh)) goto unlock; goto unlock; if (S_ISREG(inode->i_mode) && if (decrypt) { ext4_encrypted_inode(inode) && !fscrypt_using_hardware_encryption(inode)) { /* We expect the key to be set. */ /* We expect the key to be set. */ BUG_ON(!fscrypt_has_encryption_key(inode)); BUG_ON(!fscrypt_has_encryption_key(inode)); BUG_ON(blocksize != PAGE_SIZE); BUG_ON(blocksize != PAGE_SIZE); Loading fs/ext4/page-io.c +5 −0 Original line number Original line Diff line number Diff line Loading @@ -352,6 +352,8 @@ void ext4_io_submit(struct ext4_io_submit *io) int io_op_flags = io->io_wbc->sync_mode == WB_SYNC_ALL ? int io_op_flags = io->io_wbc->sync_mode == WB_SYNC_ALL ? REQ_SYNC : 0; REQ_SYNC : 0; io->io_bio->bi_write_hint = io->io_end->inode->i_write_hint; io->io_bio->bi_write_hint = io->io_end->inode->i_write_hint; if (io->io_flags & EXT4_IO_ENCRYPTED) io_op_flags |= REQ_NOENCRYPT; bio_set_op_attrs(io->io_bio, REQ_OP_WRITE, io_op_flags); bio_set_op_attrs(io->io_bio, REQ_OP_WRITE, io_op_flags); submit_bio(io->io_bio); submit_bio(io->io_bio); } } Loading @@ -361,6 +363,7 @@ void ext4_io_submit(struct ext4_io_submit *io) void ext4_io_submit_init(struct ext4_io_submit *io, void ext4_io_submit_init(struct ext4_io_submit *io, struct writeback_control *wbc) struct writeback_control *wbc) { { io->io_flags = 0; io->io_wbc = wbc; io->io_wbc = wbc; io->io_bio = NULL; io->io_bio = NULL; io->io_end = NULL; io->io_end = NULL; Loading Loading @@ -505,6 +508,8 @@ int ext4_bio_write_page(struct ext4_io_submit *io, do { do { if (!buffer_async_write(bh)) if (!buffer_async_write(bh)) continue; continue; if (data_page) io->io_flags |= EXT4_IO_ENCRYPTED; ret = io_submit_add_bh(io, inode, ret = io_submit_add_bh(io, inode, data_page ? data_page : page, bh); data_page ? data_page : page, bh); if (ret) { if (ret) { Loading fs/ext4/readpage.c +1 −0 Original line number Original line Diff line number Diff line Loading @@ -301,6 +301,7 @@ int ext4_mpage_readpages(struct address_space *mapping, bio->bi_private = ctx; bio->bi_private = ctx; if (is_readahead) if (is_readahead) flags = flags | REQ_RAHEAD; flags = flags | REQ_RAHEAD; flags = flags | (ctx ? REQ_NOENCRYPT : 0); bio_set_op_attrs(bio, REQ_OP_READ, flags); bio_set_op_attrs(bio, REQ_OP_READ, flags); } } Loading Loading
fs/crypto/bio.c +1 −1 Original line number Original line Diff line number Diff line Loading @@ -131,7 +131,7 @@ int fscrypt_zeroout_range(const struct inode *inode, pgoff_t lblk, bio_set_dev(bio, inode->i_sb->s_bdev); bio_set_dev(bio, inode->i_sb->s_bdev); bio->bi_iter.bi_sector = bio->bi_iter.bi_sector = pblk << (inode->i_sb->s_blocksize_bits - 9); pblk << (inode->i_sb->s_blocksize_bits - 9); bio_set_op_attrs(bio, REQ_OP_WRITE, 0); bio_set_op_attrs(bio, REQ_OP_WRITE, REQ_NOENCRYPT); ret = bio_add_page(bio, ciphertext_page, ret = bio_add_page(bio, ciphertext_page, inode->i_sb->s_blocksize, 0); inode->i_sb->s_blocksize, 0); if (ret != inode->i_sb->s_blocksize) { if (ret != inode->i_sb->s_blocksize) { Loading
fs/ext4/ext4.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -216,7 +216,10 @@ typedef struct ext4_io_end { ssize_t size; /* size of the extent */ ssize_t size; /* size of the extent */ } ext4_io_end_t; } ext4_io_end_t; #define EXT4_IO_ENCRYPTED 1 struct ext4_io_submit { struct ext4_io_submit { unsigned int io_flags; struct writeback_control *io_wbc; struct writeback_control *io_wbc; struct bio *io_bio; struct bio *io_bio; ext4_io_end_t *io_end; ext4_io_end_t *io_end; Loading
fs/ext4/inode.c +9 −6 Original line number Original line Diff line number Diff line Loading @@ -1216,11 +1216,12 @@ static int ext4_block_write_begin(struct page *page, loff_t pos, unsigned len, if (!buffer_uptodate(bh) && !buffer_delay(bh) && if (!buffer_uptodate(bh) && !buffer_delay(bh) && !buffer_unwritten(bh) && !buffer_unwritten(bh) && (block_start < from || block_end > to)) { (block_start < from || block_end > to)) { ll_rw_block(REQ_OP_READ, 0, 1, &bh); *wait_bh++ = bh; decrypt = ext4_encrypted_inode(inode) && decrypt = ext4_encrypted_inode(inode) && S_ISREG(inode->i_mode) && S_ISREG(inode->i_mode) && !fscrypt_using_hardware_encryption(inode); !fscrypt_using_hardware_encryption(inode); ll_rw_block(REQ_OP_READ, (decrypt ? REQ_NOENCRYPT : 0), 1, &bh); *wait_bh++ = bh; } } } } /* /* Loading Loading @@ -4049,6 +4050,7 @@ static int __ext4_block_zero_page_range(handle_t *handle, struct inode *inode = mapping->host; struct inode *inode = mapping->host; struct buffer_head *bh; struct buffer_head *bh; struct page *page; struct page *page; bool decrypt; int err = 0; int err = 0; page = find_or_create_page(mapping, from >> PAGE_SHIFT, page = find_or_create_page(mapping, from >> PAGE_SHIFT, Loading Loading @@ -4091,14 +4093,15 @@ static int __ext4_block_zero_page_range(handle_t *handle, if (!buffer_uptodate(bh)) { if (!buffer_uptodate(bh)) { err = -EIO; err = -EIO; ll_rw_block(REQ_OP_READ, 0, 1, &bh); decrypt = S_ISREG(inode->i_mode) && ext4_encrypted_inode(inode) && !fscrypt_using_hardware_encryption(inode); ll_rw_block(REQ_OP_READ, (decrypt ? REQ_NOENCRYPT : 0), 1, &bh); wait_on_buffer(bh); wait_on_buffer(bh); /* Uhhuh. Read error. Complain and punt. */ /* Uhhuh. Read error. Complain and punt. */ if (!buffer_uptodate(bh)) if (!buffer_uptodate(bh)) goto unlock; goto unlock; if (S_ISREG(inode->i_mode) && if (decrypt) { ext4_encrypted_inode(inode) && !fscrypt_using_hardware_encryption(inode)) { /* We expect the key to be set. */ /* We expect the key to be set. */ BUG_ON(!fscrypt_has_encryption_key(inode)); BUG_ON(!fscrypt_has_encryption_key(inode)); BUG_ON(blocksize != PAGE_SIZE); BUG_ON(blocksize != PAGE_SIZE); Loading
fs/ext4/page-io.c +5 −0 Original line number Original line Diff line number Diff line Loading @@ -352,6 +352,8 @@ void ext4_io_submit(struct ext4_io_submit *io) int io_op_flags = io->io_wbc->sync_mode == WB_SYNC_ALL ? int io_op_flags = io->io_wbc->sync_mode == WB_SYNC_ALL ? REQ_SYNC : 0; REQ_SYNC : 0; io->io_bio->bi_write_hint = io->io_end->inode->i_write_hint; io->io_bio->bi_write_hint = io->io_end->inode->i_write_hint; if (io->io_flags & EXT4_IO_ENCRYPTED) io_op_flags |= REQ_NOENCRYPT; bio_set_op_attrs(io->io_bio, REQ_OP_WRITE, io_op_flags); bio_set_op_attrs(io->io_bio, REQ_OP_WRITE, io_op_flags); submit_bio(io->io_bio); submit_bio(io->io_bio); } } Loading @@ -361,6 +363,7 @@ void ext4_io_submit(struct ext4_io_submit *io) void ext4_io_submit_init(struct ext4_io_submit *io, void ext4_io_submit_init(struct ext4_io_submit *io, struct writeback_control *wbc) struct writeback_control *wbc) { { io->io_flags = 0; io->io_wbc = wbc; io->io_wbc = wbc; io->io_bio = NULL; io->io_bio = NULL; io->io_end = NULL; io->io_end = NULL; Loading Loading @@ -505,6 +508,8 @@ int ext4_bio_write_page(struct ext4_io_submit *io, do { do { if (!buffer_async_write(bh)) if (!buffer_async_write(bh)) continue; continue; if (data_page) io->io_flags |= EXT4_IO_ENCRYPTED; ret = io_submit_add_bh(io, inode, ret = io_submit_add_bh(io, inode, data_page ? data_page : page, bh); data_page ? data_page : page, bh); if (ret) { if (ret) { Loading
fs/ext4/readpage.c +1 −0 Original line number Original line Diff line number Diff line Loading @@ -301,6 +301,7 @@ int ext4_mpage_readpages(struct address_space *mapping, bio->bi_private = ctx; bio->bi_private = ctx; if (is_readahead) if (is_readahead) flags = flags | REQ_RAHEAD; flags = flags | REQ_RAHEAD; flags = flags | (ctx ? REQ_NOENCRYPT : 0); bio_set_op_attrs(bio, REQ_OP_READ, flags); bio_set_op_attrs(bio, REQ_OP_READ, flags); } } Loading