Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp274496imm; Wed, 29 Aug 2018 21:08:49 -0700 (PDT) X-Google-Smtp-Source: ANB0VdbOJXOgg5PFgzuEys7v+zy559zl93npvTnZrNXEo/6xpYzpdOSGaHkQ8AC91p9b9BU/pCd0 X-Received: by 2002:a17:902:ab94:: with SMTP id f20-v6mr8608749plr.231.1535602129112; Wed, 29 Aug 2018 21:08:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1535602129; cv=none; d=google.com; s=arc-20160816; b=aDLWtzD1o4QwEWZHTBJkqwpqcyXllnm8JESD+r9fwTxefwym93pbN/aWBRZV5AGkqU N5AJgYwZ3b1qMaiztlEn6KDe4xQHmi9xkSiD9Ikdunzr/4cZK3Hj9IuKtoN83DCmRqeb yLbPaKikntsiATE5O13Am8iGkqv4NhcYrbkeDh/0gVQB36KDvpow0bcMS/MgOrxH8YmX z3PhcV/44jUEsWXqbIBcVq8FBvcFLm9yHeMW32l/+Vyn6UwHCOzyzG6BI2jg1z7Stt5v 7U7XWYQCSzNPBp9+fUw3cLbULuqXiWBRhW+Pw/+ZEHkax8f4CZ8zehEP0a59NQGI1rwd X7Dg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:to :from:date:dkim-signature:arc-authentication-results; bh=Mn4C3hLN4qp9PE/rkbqnNRSrz6eOavpwfkymzPjzJE8=; b=cp4CCfMHsfU2LrI1s/yVU39R/ZOtFfiiw/w7bQyg1gkRAd1vnlVs7DgGWxUe0KTWkN DAnSelnvcyceEHUKEBv31djVzQgOFe7jn386j3IZLxRbjeFRY4nKQb4rkoC9GDba3382 dsp4TAaocTMkC4Pp69EiA1PuWrpIiP+gcOTW+/MsDQ9mHSaNusC+Rptxud9CCDZBwWby wsKc2DXJDetwV8hkKf3vle5uaRHtDkJMIfS/ChFE/cs59XBqJsaXBbyN5VNzkd7CuAcm rE47s2yFci5k0zOwdFrC8xOFI/co0S0dNOylAuF2zRiGPE4I3kwNYy3FKlzI6T9R5ZCw mVJQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=cUI1Q4eT; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u11-v6si5585106pgg.683.2018.08.29.21.08.07; Wed, 29 Aug 2018 21:08:49 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=cUI1Q4eT; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727598AbeH3IFJ (ORCPT + 99 others); Thu, 30 Aug 2018 04:05:09 -0400 Received: from mail.kernel.org ([198.145.29.99]:49350 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727574AbeH3IFJ (ORCPT ); Thu, 30 Aug 2018 04:05:09 -0400 Received: from localhost (unknown [104.132.1.88]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 03BEE20645; Thu, 30 Aug 2018 04:04:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1535601900; bh=8jQp5On0iF/ZlX0vmmNtZ7Ulajg0X5u2qBxYhUAu6ak=; h=Date:From:To:Subject:References:In-Reply-To:From; b=cUI1Q4eTgoG/CHhIjlnid3cqiHv8OVcV+eKU3p9Clak9pHMc30P/ytOQpw2x0395C AOqOHd81nwWK6pGJZZfyeihpKgJ9gEaofbTg7AfBWpBkYd0eZDz56wdKrUeobUygIv ugJLdzbAFwTiB7bfQG697BzHDmUvl6Lut/cNvPqI= Date: Wed, 29 Aug 2018 21:04:58 -0700 From: Jaegeuk Kim To: linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net Subject: Re: [f2fs-dev] [PATCH v3] f2fs: avoid wrong decrypted data from disk Message-ID: <20180830040458.GB97850@jaegeuk-macbookpro.roam.corp.google.com> References: <20180827225226.14272-1-jaegeuk@kernel.org> <20180830014858.GA91444@jaegeuk-macbookpro.roam.corp.google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20180830014858.GA91444@jaegeuk-macbookpro.roam.corp.google.com> User-Agent: Mutt/1.8.2 (2017-04-18) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 1. Create a file in an encrypted directory 2. Do GC & drop caches 3. Read stale data before its bio for metapage was not issued yet Signed-off-by: Jaegeuk Kim --- Change log from v2: - make it globally consistent - should use f2fs_post_read_required() fs/f2fs/data.c | 18 ++++++++++-------- fs/f2fs/f2fs.h | 2 +- fs/f2fs/file.c | 3 +-- fs/f2fs/segment.c | 6 +++++- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 382c1ef9a9e4..8c204f896c22 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -565,9 +565,6 @@ static struct bio *f2fs_grab_read_bio(struct inode *inode, block_t blkaddr, ctx->bio = bio; ctx->enabled_steps = post_read_steps; bio->bi_private = ctx; - - /* wait the page to be moved by cleaning */ - f2fs_wait_on_block_writeback(sbi, blkaddr); } return bio; @@ -582,6 +579,9 @@ static int f2fs_submit_page_read(struct inode *inode, struct page *page, if (IS_ERR(bio)) return PTR_ERR(bio); + /* wait for GCed page writeback via META_MAPPING */ + f2fs_wait_on_block_writeback(inode, blkaddr); + if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE) { bio_put(bio); return -EFAULT; @@ -1558,6 +1558,12 @@ static int f2fs_mpage_readpages(struct address_space *mapping, } } + /* + * If the page is under writeback, we need to wait for + * its completion to see the correct decrypted data. + */ + f2fs_wait_on_block_writeback(inode, block_nr); + if (bio_add_page(bio, page, blocksize, 0) < blocksize) goto submit_and_realloc; @@ -1625,7 +1631,7 @@ static int encrypt_one_page(struct f2fs_io_info *fio) return 0; /* wait for GCed page writeback via META_MAPPING */ - f2fs_wait_on_block_writeback(fio->sbi, fio->old_blkaddr); + f2fs_wait_on_block_writeback(inode, fio->old_blkaddr); retry_encrypt: fio->encrypted_page = fscrypt_encrypt_page(inode, fio->page, @@ -2382,10 +2388,6 @@ static int f2fs_write_begin(struct file *file, struct address_space *mapping, f2fs_wait_on_page_writeback(page, DATA, false); - /* wait for GCed page writeback via META_MAPPING */ - if (f2fs_post_read_required(inode)) - f2fs_wait_on_block_writeback(sbi, blkaddr); - if (len == PAGE_SIZE || PageUptodate(page)) return 0; diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 4e1120f20041..42950d87e91d 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -2942,7 +2942,7 @@ void f2fs_allocate_data_block(struct f2fs_sb_info *sbi, struct page *page, struct f2fs_io_info *fio, bool add_list); void f2fs_wait_on_page_writeback(struct page *page, enum page_type type, bool ordered); -void f2fs_wait_on_block_writeback(struct f2fs_sb_info *sbi, block_t blkaddr); +void f2fs_wait_on_block_writeback(struct inode *inode, block_t blkaddr); void f2fs_write_data_summaries(struct f2fs_sb_info *sbi, block_t start_blk); void f2fs_write_node_summaries(struct f2fs_sb_info *sbi, block_t start_blk); int f2fs_lookup_journal_in_cursum(struct f2fs_journal *journal, int type, diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 5474aaa274b9..98bb26be3f6f 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -112,8 +112,7 @@ static vm_fault_t f2fs_vm_page_mkwrite(struct vm_fault *vmf) f2fs_wait_on_page_writeback(page, DATA, false); /* wait for GCed page writeback via META_MAPPING */ - if (f2fs_post_read_required(inode)) - f2fs_wait_on_block_writeback(sbi, dn.data_blkaddr); + f2fs_wait_on_block_writeback(inode, dn.data_blkaddr); out_sem: up_read(&F2FS_I(inode)->i_mmap_sem); diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 29a1ee21f396..056ac120305a 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -3191,10 +3191,14 @@ void f2fs_wait_on_page_writeback(struct page *page, } } -void f2fs_wait_on_block_writeback(struct f2fs_sb_info *sbi, block_t blkaddr) +void f2fs_wait_on_block_writeback(struct inode *inode, block_t blkaddr) { + struct f2fs_sb_info *sbi = F2FS_I_SB(inode); struct page *cpage; + if (!f2fs_post_read_required(inode)) + return; + if (!is_valid_data_blkaddr(sbi, blkaddr)) return; -- 2.17.0.441.gb46fe60e1d-goog