f2fs: add F2FS_GOING_DOWN_METAFLUSH to test power-failure
Subsystems (2)
Jaegeuk Kim
maintainerPATCH 1/2 f2fs: add F2FS_GOING_DOWN_METAFLUSH to test power-failure
This patch introduces F2FS_GOING_DOWN_METAFLUSH which flushes meta pages like SSA blocks and then blocks all the writes.
This can be used by power-failure tests.
--- fs/f2fs/f2fs.h | 1 + fs/f2fs/file.c | 4 ++++ 2 files changed, 5 insertions(+)
fs/f2fs/f2fs.h +1 -0
@@ -250,6 +250,7 @@ static inline bool __has_cursum_space(struct f2fs_summary_block *sum, int size,#define F2FS_GOING_DOWN_FULLSYNC 0x0/* going down with full sync */ #define F2FS_GOING_DOWN_METASYNC 0x1/* going down with metadata */ #define F2FS_GOING_DOWN_NOSYNC 0x2/* going down */ +#define F2FS_GOING_DOWN_METAFLUSH 0x3/* going down with meta flush */ #if defined(__KERNEL__) && defined(CONFIG_COMPAT )/*
fs/f2fs/file.c +4 -0
@@ -1498,6 +1498,10 @@ static int f2fs_ioc_shutdown(struct file *filp, unsigned long arg)case F2FS_GOING_DOWN_NOSYNC :f2fs_stop_checkpoint (sbi);break ; +case F2FS_GOING_DOWN_METAFLUSH : +sync_meta_pages (sbi,META ,LONG_MAX ); +f2fs_stop_checkpoint (sbi); +break ;default :return -EINVAL ; }
Signature · 1 line
2.1.1
Jaegeuk Kim
maintainerPATCH 2/2 Revert "f2fs: do not skip dentry block writes"
The periodic checkpoint can resolve the previous issue.
So, now we can use this again to improve the reported performance regression:
https://lkml.org/lkml/2015/10/8/20
This reverts commit 15bec0ff5a9ba6d203178fa8772259df6207942a.
--- fs/f2fs/data.c | 5 +++++ fs/f2fs/node.c | 5 +++++ fs/f2fs/node.h | 1 + fs/f2fs/segment.h | 4 +++- 4 files changed, 14 insertions(+), 1 deletion(-)
fs/f2fs/data.c +5 -0
@@ -1340,6 +1340,11 @@ static int f2fs_write_data_pages(struct address_space *mapping,if (!get_dirty_pages (inode) && wbc->sync_mode ==WB_SYNC_NONE )return 0 ; +if (S_ISDIR (inode->i_mode) && wbc->sync_mode ==WB_SYNC_NONE && +get_dirty_pages (inode) <nr_pages_to_skip (sbi,DATA ) && +available_free_memory (sbi,DIRTY_DENTS )) + goto skip_write; +/* during POR, we don't need to trigger writepage at all. */ if (unlikely (is_sbi_flag_set (sbi,SBI_POR_DOING ))) goto skip_write;
fs/f2fs/node.c +5 -0
@@ -52,6 +52,11 @@ bool available_free_memory(struct f2fs_sb_info *sbi, int type) mem_size = (nm_i->nat_cnt *sizeof (struct nat_entry )) >>PAGE_CACHE_SHIFT ; res = mem_size < ((avail_ram * nm_i->ram_thresh /100 ) >>2 ); + }else if (type ==DIRTY_DENTS ) { +if (sbi->sb->s_bdi->wb.dirty_exceeded) +return false; + mem_size =get_pages (sbi,F2FS_DIRTY_DENTS ); + res = mem_size < ((avail_ram * nm_i->ram_thresh /100 ) >>1 ); }else if (type ==INO_ENTRIES ) {int i;
fs/f2fs/node.h +1 -0
@@ -118,6 +118,7 @@ static inline void raw_nat_from_node_info(struct f2fs_nat_entry *raw_ne,enum mem_type {FREE_NIDS ,/* indicates the free nid list */ NAT_ENTRIES ,/* indicates the cached nat entry */ +DIRTY_DENTS ,/* indicates dirty dentry pages */ INO_ENTRIES ,/* indicates inode entries */ EXTENT_CACHE ,/* indicates extent cache */ BASE_CHECK ,/* check kernel status */
fs/f2fs/segment.h +3 -1
@@ -699,7 +699,9 @@ static inline int nr_pages_to_skip(struct f2fs_sb_info *sbi, int type)if (sbi->sb->s_bdi->wb.dirty_exceeded)return 0 ; -if (type ==NODE ) +if (type ==DATA ) +return sbi->blocks_per_seg; +else if (type ==NODE )return 3 * sbi->blocks_per_seg;else if (type ==META )return MAX_BIO_BLOCKS (sbi);
Signature · 1 line
2.1.1
Quoted 8 lines
-----Original Message-----
From: Jaegeuk Kim [mailto:[email protected]]
Sent: Friday, October 09, 2015 8:29 AM
To: [email protected]; [email protected]; [email protected]
Cc: Jaegeuk Kim
Subject: [f2fs-dev] [PATCH 1/2] f2fs: addF2FS_GOING_DOWN_METAFLUSHto test power-failure
Quoted 5 lines
This patch introduces
F2FS_GOING_DOWN_METAFLUSHwhich flushes meta pages like SSA blocks and then blocks all the writes.
This can be used by power-failure tests.Signed-off-by Jaegeuk Kim <[email protected]>
Good idea! I test power-failure case by changing src/godown to use new macro, until now, I didn't catch any consistent problem. :)
Thanks,
Quoted 37 lines
--- fs/f2fs/f2fs.h | 1 + fs/f2fs/file.c | 4 ++++ 2 files changed, 5 insertions(+)fs/f2fs/f2fs.h +1
-0@@ -250,6 +250,7 @@ static inline bool __has_cursum_space(struct f2fs_summary_block *sum, int size,#define F2FS_GOING_DOWN_FULLSYNC 0x0/* going down with full sync */ #define F2FS_GOING_DOWN_METASYNC 0x1/* going down with metadata */ #define F2FS_GOING_DOWN_NOSYNC 0x2/* going down */ +#define F2FS_GOING_DOWN_METAFLUSH 0x3/* going down with meta flush */ #if defined(__KERNEL__) && defined(CONFIG_COMPAT )/*
fs/f2fs/file.c +4
-1@@ -1498,6 +1498,10 @@ static int f2fs_ioc_shutdown(struct file *filp, unsigned long arg)case F2FS_GOING_DOWN_NOSYNC :f2fs_stop_checkpoint (sbi);break ; +case F2FS_GOING_DOWN_METAFLUSH : +sync_meta_pages (sbi,META ,LONG_MAX ); +f2fs_stop_checkpoint (sbi); +break ;default :return -EINVAL ; } --2.1.1
Quoted 5 lines
------------------------------------------------------------------------------
_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
------------------------------------------------------------------------------
Jaegeuk Kim
maintainerQuoted 12 lines · Chao Yu
Quoted 12 lines
-----Original Message-----
From: Jaegeuk Kim [mailto:[email protected]]
Sent: Friday, October 09, 2015 8:29 AM
To: [email protected]; [email protected]; [email protected]
Cc: Jaegeuk Kim
Subject: [f2fs-dev] [PATCH 1/2] f2fs: addF2FS_GOING_DOWN_METAFLUSHto test power-failureThis patch introduces
F2FS_GOING_DOWN_METAFLUSHwhich flushes meta pages like SSA blocks and then blocks all the writes.
This can be used by power-failure tests.
Quoted 6 lines
Quoted 1 line
Signed-off-by Jaegeuk Kim <[email protected]>Good idea! I test power-failure case by changing src/godown to use new macro, until now, I didn't catch any consistent problem. :)
Reviewed-by Chao Yu <[email protected]>
Yeah, I could reproduce the original issue with xfstests like below too. (Added "-n" to issue METAFLUSH in godown.)
--- tests/f2fs/002 | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/f2fs/002.out | 5 ++++ tests/f2fs/group | 1 + 3 files changed, 91 insertions(+) create mode 100755 tests/f2fs/002 create mode 100644 tests/f2fs/002.out
tests/f2fs/002 new file +85 -0
@@ -0,0 +1,85 @@ +#! /bin/bash +# FS QA Test No. f2fs/002 +# +# This test detects a f2fs-specific issue which is resolved by: +# f2fs: fix SSA updates resulting in corruption +# The purpose is to check whether filesystem metadata becomes inconsistent +# after fcollapse was called. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Jaegeuk Kim. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/log +. ./common/punch + +# real QA test starts here +_supported_fs f2fs +_supported_os Linux + +rm -f $seqres.full +rm -f $tmp.log + +_require_scratch +_require_scratch_shutdown +_require_xfs_io_command "fcollapse" + +_scratch_mkfs > /dev/null 2>&1 + +# collapse without sync +_run_test() +{ + testfile=$SCRATCH_MNT/$1.$seq.$$ + + _scratch_mount + + $XFS_IO_PROG -f -c "pwrite 0 5m" -c fsync $testfile > /dev/null + [ $1 -eq 1 ] && sync + $XFS_IO_PROG -c "fcollapse 64k 2m" $testfile > /dev/null + + echo "godown" + src/godown -v -n $SCRATCH_MNT >> $seqres.full + + echo "unmount" + umount $SCRATCH_MNT + + # curious if FS consistent at start + _check_scratch_fs $SCRATCH_DEV + [ $? -ne 0 ] && _fatal "fsck failed" +} + +# run without sync +_run_test 0 + +# run with sync +_run_test 1 + +status=0 +exit
tests/f2fs/002.out new file +5 -0
@@ -0,0 +1,5 @@ +QA output created by 002 +godown +unmount +godown +unmount
tests/f2fs/group +1 -0
@@ -4,3 +4,4 @@ # - comment line before each group is "new" description # 001 auto quick rw +002 auto quick rw
Signature · 1 line
2.1.1
Quoted 23 lines
-----Original Message-----
From: Jaegeuk Kim [mailto:[email protected]]
Sent: Tuesday, October 13, 2015 4:37 AM
To: Chao Yu
Cc: [email protected]; [email protected]; [email protected]
Subject: Re: [f2fs-dev] [PATCH 1/2] f2fs: addF2FS_GOING_DOWN_METAFLUSHto test power-failureQuoted 14 lines · Chao Yu
Quoted 13 lines
-----Original Message-----
From: Jaegeuk Kim [mailto:[email protected]]
Sent: Friday, October 09, 2015 8:29 AM
To: [email protected]; [email protected]; [email protected]
Cc: Jaegeuk Kim
Subject: [f2fs-dev] [PATCH 1/2] f2fs: addF2FS_GOING_DOWN_METAFLUSHto test power-failureThis patch introduces
F2FS_GOING_DOWN_METAFLUSHwhich flushes meta pages like SSA blocks and then blocks all the writes.
This can be used by power-failure tests.Signed-off-by Jaegeuk Kim <[email protected]>
Quoted 7 lines
Quoted 4 lines
Good idea! I test power-failure case by changing src/godown to use new macro, until now, I didn't catch any consistent problem. :)
Reviewed-by Chao Yu <[email protected]>Yeah, I could reproduce the original issue with xfstests like below too. (Added "-n" to issue METAFLUSH in godown.)
Ah, looks good! Thanks for sharing me this test. :)
Thanks,
Quoted 121 lines
--- tests/f2fs/002 | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/f2fs/002.out | 5 ++++ tests/f2fs/group | 1 + 3 files changed, 91 insertions(+) create mode 100755 tests/f2fs/002 create mode 100644 tests/f2fs/002.outtests/f2fs/002 new file +85
-0@@ -0,0 +1,85 @@ +#! /bin/bash +# FS QA Test No. f2fs/002 +# +# This test detects a f2fs-specific issue which is resolved by: +# f2fs: fix SSA updates resulting in corruption +# The purpose is to check whether filesystem metadata becomes inconsistent +# after fcollapse was called. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Jaegeuk Kim. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/log +. ./common/punch + +# real QA test starts here +_supported_fs f2fs +_supported_os Linux + +rm -f $seqres.full +rm -f $tmp.log + +_require_scratch +_require_scratch_shutdown +_require_xfs_io_command "fcollapse" + +_scratch_mkfs > /dev/null 2>&1 + +# collapse without sync +_run_test() +{ + testfile=$SCRATCH_MNT/$1.$seq.$$ + + _scratch_mount + + $XFS_IO_PROG -f -c "pwrite 0 5m" -c fsync $testfile > /dev/null + [ $1 -eq 1 ] && sync + $XFS_IO_PROG -c "fcollapse 64k 2m" $testfile > /dev/null + + echo "godown" + src/godown -v -n $SCRATCH_MNT >> $seqres.full + + echo "unmount" + umount $SCRATCH_MNT + + # curious if FS consistent at start + _check_scratch_fs $SCRATCH_DEV + [ $? -ne 0 ] && _fatal "fsck failed" +} + +# run without sync +_run_test 0 + +# run with sync +_run_test 1 + +status=0 +exittests/f2fs/002.out new file +5
-0@@ -0,0 +1,5 @@ +QA output created by 002 +godown +unmount +godown +unmounttests/f2fs/group +1
-1@@ -4,3 +4,4 @@ # - comment line before each group is "new" description # 001 auto quick rw +002 auto quick rw --
Quoted 1 line
2.1.1
------------------------------------------------------------------------------