From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:38032 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933975AbeALOKh (ORCPT ); Fri, 12 Jan 2018 09:10:37 -0500 Received: from pps.filterd (m0098394.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w0CEAFtV099541 for ; Fri, 12 Jan 2018 09:10:36 -0500 Received: from e34.co.us.ibm.com (e34.co.us.ibm.com [32.97.110.152]) by mx0a-001b2d01.pphosted.com with ESMTP id 2fexbd0y7b-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Fri, 12 Jan 2018 09:10:36 -0500 Received: from localhost by e34.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 12 Jan 2018 07:10:35 -0700 From: Chandan Rajendra To: linux-ext4@vger.kernel.org Cc: Chandan Rajendra , linux-fsdevel@vger.kernel.org, tytso@mit.edu Subject: [RFC PATCH 3/8] ext4: decrypt all contiguous blocks in a page Date: Fri, 12 Jan 2018 19:41:24 +0530 In-Reply-To: <20180112141129.27507-1-chandan@linux.vnet.ibm.com> References: <20180112141129.27507-1-chandan@linux.vnet.ibm.com> Message-Id: <20180112141129.27507-4-chandan@linux.vnet.ibm.com> Sender: linux-fsdevel-owner@vger.kernel.org List-ID: With blocksize < pagesize, a page can contain more than one block. Hence this commit changes completion_pages() to invoke fscrypt_decrypt_page() in order to decrypt all the contiguous blocks mapped by the page. Signed-off-by: Chandan Rajendra --- fs/crypto/bio.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/fs/crypto/bio.c b/fs/crypto/bio.c index 0d5e6a5..eb6e06a 100644 --- a/fs/crypto/bio.c +++ b/fs/crypto/bio.c @@ -40,8 +40,23 @@ static void completion_pages(struct work_struct *work) bio_for_each_segment_all(bv, bio, i) { struct page *page = bv->bv_page; - int ret = fscrypt_decrypt_page(page->mapping->host, page, - PAGE_SIZE, 0, page->index); + struct inode *inode = page->mapping->host; + const unsigned long blocksize = inode->i_sb->s_blocksize; + const unsigned blkbits = inode->i_blkbits; + int page_blk = page->index << (PAGE_SHIFT - blkbits); + int blk = page_blk + (bv->bv_offset >> blkbits); + int nr_blks = bv->bv_len >> blkbits; + int ret = 0; + int j; + + for (j = 0; j < nr_blks; j++, blk++) { + ret = fscrypt_decrypt_page(page->mapping->host, + page, blocksize, + bv->bv_offset + (j << blkbits), + blk); + if (ret) + break; + } if (ret) { WARN_ON_ONCE(1); -- 2.9.5