Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp2247017imm; Mon, 28 May 2018 04:42:56 -0700 (PDT) X-Google-Smtp-Source: AB8JxZpLGIrJWGMErneieZWHJxew9dfAoIz9tNjoQjjca7I7pYVM9aFwcPeJnCRdjcgUsRdaXQmr X-Received: by 2002:a62:449c:: with SMTP id m28-v6mr13123797pfi.145.1527507776549; Mon, 28 May 2018 04:42:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527507776; cv=none; d=google.com; s=arc-20160816; b=BwUgNDSlJAAuplmSo6qZgnsGQscGHi7Gq5yWqxlXy5F5JJrV9E6GXiwo4cxnvIK3XC 7AsAVMIHPaUjlb001eWR/k/Pl6KbPw28E596f57Man/WGzWWffp5iNISNc/Tn6n2GYe8 Dx30o4uIdMySka7EziEf9M3KcbJclEhF/Tw64EhiLyFtAtZoV8U5+enKfxVYUSvBN2e3 38OhZPtXkzzZ7QWgz6GHGO2fI1uE4M492JPHHcJcuTZY2rmwo2oX5bUaLxhEBc+giclE ntqT9lpmm/GaMM7hpxpTNX+kOydDhw/ANoc4N8/HOL0E+w5EORypFvJ+uF590uzB+P7L 1soQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :in-reply-to:message-id:date:subject:cc:to:from:dkim-signature :arc-authentication-results; bh=w6+0YsL8cEQHp6SBMIFyJPiE74/oejtG7vQAuZSIeHU=; b=Gt716UpKqkwByhh4ejEyYSo3ZIKOFtTJvwWnveF7tnQfmPiT5UcrY42R6CJoBwTSh9 ZTVdG5vHUw3o4DimHwHI1URGP81AXu0y8/Tgv5k7ZKRNFEfDg1KJyEL/YZIsU3yA2dzv S99F+drPYPyefDPRYzH8oCbU7EsHU/YN1ZMeZz8uuwaCRcv1M64BcG1ZQ9E2WwOB8L0i jcHA437ZivhfZt7v8lFVsFUDHze/4eSFTpqDAWc0iR5ZhgPLBFvZ3YL7jCmOm5QnmtT5 O4nZZhjl0MvIO6ZKgF7c3zSgT18+G4HuagF5BPBKyl78STQsvmzwE4OfXvX3l++WR+uI wuew== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=yHxg6k0g; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g22-v6si23214328pgv.468.2018.05.28.04.42.41; Mon, 28 May 2018 04:42:56 -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=yHxg6k0g; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S938349AbeE1Lk5 (ORCPT + 99 others); Mon, 28 May 2018 07:40:57 -0400 Received: from mail.kernel.org ([198.145.29.99]:59952 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S938092AbeE1LMG (ORCPT ); Mon, 28 May 2018 07:12:06 -0400 Received: from localhost (LFbn-1-12247-202.w90-92.abo.wanadoo.fr [90.92.61.202]) (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 C3F3820845; Mon, 28 May 2018 11:12:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1527505926; bh=jlIAv6PDz8rj8l8lEDPdM0Ghbtq/7yixnOotLhq3wIk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=yHxg6k0gdnzmjmrYWzuEQxiqeQbcJMyecgJS1aBfwVG5KHu8MVP7qE7ISijn8pYyh sT3t9iAiP5h6eS5wJPJmLJ7GpNPE98AJA9RIIoJFsI1VkKVErqogv1OjYlplV6inGv AUMLRAQyTS7bZGwVxBVclFuVkrD3jDT1rz3p6Feo= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Gao Xiang , Chao Yu , Jaegeuk Kim , Sasha Levin Subject: [PATCH 4.16 178/272] f2fs: flush cp pack except cp pack 2 page at first Date: Mon, 28 May 2018 12:03:31 +0200 Message-Id: <20180528100255.684743517@linuxfoundation.org> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180528100240.256525891@linuxfoundation.org> References: <20180528100240.256525891@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.16-stable review patch. If anyone has any objections, please let me know. ------------------ From: Gao Xiang [ Upstream commit 46706d5917f4457a6befe7a39a15c89dbb1ce9ca ] Previously, we attempt to flush the whole cp pack in a single bio, however, when suddenly powering off at this time, we could get into an extreme scenario that cp pack 1 page and cp pack 2 page are updated and latest, but payload or current summaries are still partially outdated. (see reliable write in the UFS specification) This patch submits the whole cp pack except cp pack 2 page at first, and then writes the cp pack 2 page with an extra independent bio with pre-io barrier. Signed-off-by: Gao Xiang Reviewed-by: Chao Yu Signed-off-by: Jaegeuk Kim Signed-off-by: Sasha Levin Signed-off-by: Greg Kroah-Hartman --- fs/f2fs/checkpoint.c | 69 ++++++++++++++++++++++++++++++++++----------------- 1 file changed, 46 insertions(+), 23 deletions(-) --- a/fs/f2fs/checkpoint.c +++ b/fs/f2fs/checkpoint.c @@ -1162,6 +1162,39 @@ static void update_ckpt_flags(struct f2f spin_unlock_irqrestore(&sbi->cp_lock, flags); } +static void commit_checkpoint(struct f2fs_sb_info *sbi, + void *src, block_t blk_addr) +{ + struct writeback_control wbc = { + .for_reclaim = 0, + }; + + /* + * pagevec_lookup_tag and lock_page again will take + * some extra time. Therefore, update_meta_pages and + * sync_meta_pages are combined in this function. + */ + struct page *page = grab_meta_page(sbi, blk_addr); + int err; + + memcpy(page_address(page), src, PAGE_SIZE); + set_page_dirty(page); + + f2fs_wait_on_page_writeback(page, META, true); + f2fs_bug_on(sbi, PageWriteback(page)); + if (unlikely(!clear_page_dirty_for_io(page))) + f2fs_bug_on(sbi, 1); + + /* writeout cp pack 2 page */ + err = __f2fs_write_meta_page(page, &wbc, FS_CP_META_IO); + f2fs_bug_on(sbi, err); + + f2fs_put_page(page, 0); + + /* submit checkpoint (with barrier if NOBARRIER is not set) */ + f2fs_submit_merged_write(sbi, META_FLUSH); +} + static int do_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc) { struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi); @@ -1264,16 +1297,6 @@ static int do_checkpoint(struct f2fs_sb_ } } - /* need to wait for end_io results */ - wait_on_all_pages_writeback(sbi); - if (unlikely(f2fs_cp_error(sbi))) - return -EIO; - - /* flush all device cache */ - err = f2fs_flush_device_cache(sbi); - if (err) - return err; - /* write out checkpoint buffer at block 0 */ update_meta_page(sbi, ckpt, start_blk++); @@ -1301,26 +1324,26 @@ static int do_checkpoint(struct f2fs_sb_ start_blk += NR_CURSEG_NODE_TYPE; } - /* writeout checkpoint block */ - update_meta_page(sbi, ckpt, start_blk); + /* update user_block_counts */ + sbi->last_valid_block_count = sbi->total_valid_block_count; + percpu_counter_set(&sbi->alloc_valid_block_count, 0); - /* wait for previous submitted node/meta pages writeback */ + /* Here, we have one bio having CP pack except cp pack 2 page */ + sync_meta_pages(sbi, META, LONG_MAX, FS_CP_META_IO); + + /* wait for previous submitted meta pages writeback */ wait_on_all_pages_writeback(sbi); if (unlikely(f2fs_cp_error(sbi))) return -EIO; - filemap_fdatawait_range(NODE_MAPPING(sbi), 0, LLONG_MAX); - filemap_fdatawait_range(META_MAPPING(sbi), 0, LLONG_MAX); - - /* update user_block_counts */ - sbi->last_valid_block_count = sbi->total_valid_block_count; - percpu_counter_set(&sbi->alloc_valid_block_count, 0); - - /* Here, we only have one bio having CP pack */ - sync_meta_pages(sbi, META_FLUSH, LONG_MAX, FS_CP_META_IO); + /* flush all device cache */ + err = f2fs_flush_device_cache(sbi); + if (err) + return err; - /* wait for previous submitted meta pages writeback */ + /* barrier and flush checkpoint cp pack 2 page if it can */ + commit_checkpoint(sbi, ckpt, start_blk); wait_on_all_pages_writeback(sbi); release_ino_entry(sbi, false);