* [PATCH 0/7] Fix fallout from changes to FUA and PREFLUSH definitions
@ 2017-05-02 15:03 Jan Kara
  2017-05-02 15:03 ` [PATCH 3/7] f2fs: Make flush bios explicitely sync Jan Kara
  0 siblings, 1 reply; 7+ messages in thread
From: Jan Kara @ 2017-05-02 15:03 UTC (permalink / raw)
  To: linux-fsdevel
  Cc: cluster-devel, Theodore Ts'o, Mike Snitzer, linux-raid,
	reiserfs-devel, linux-f2fs-devel, Christoph Hellwig, dm-devel,
	Jaegeuk Kim, David Sterba, Jan Kara, linux-ext4, Shaohua Li,
	Steven Whitehouse, linux-btrfs
Hello,
this series addresses a performance issue caused by commit b685d3d65ac7 "block:
treat REQ_FUA and REQ_PREFLUSH as synchronous". We know for certain this
problem significanly regresses (over 10%, in some cases up to 100%) ext4 and
btrfs for dbench4 and reaim benchmarks.  Based on this I have fixed up also
other places which suffer from the same problem however those changes are
untested so maintainers please have a look whether the change makes sense to
you and also whether I possibly didn't miss some cases where REQ_SYNC should be
also added. Patches in this series are completely independent so if maintainers
agree with the change, feel free to take it through your tree.
The core of the problem is that above mentioned commit removed REQ_SYNC flag
from WRITE_{FUA|PREFLUSH|...} definitions.  generic_make_request_checks()
however strips REQ_FUA and REQ_PREFLUSH flags from a bio when the storage
doesn't report volatile write cache and thus write effectively becomes
asynchronous which can lead to performance regressions.
A side note for ext4: The two patches for ext4 & jbd2 are on top of the change
that got merged in the ext4 tree already.
								Honza
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
^ permalink raw reply	[flat|nested] 7+ messages in thread
* [PATCH 3/7] f2fs: Make flush bios explicitely sync
  2017-05-02 15:03 [PATCH 0/7] Fix fallout from changes to FUA and PREFLUSH definitions Jan Kara
@ 2017-05-02 15:03 ` Jan Kara
  2017-05-03 16:20   ` [f2fs-dev] " Chao Yu
  2017-05-03 21:22   ` Jaegeuk Kim
  0 siblings, 2 replies; 7+ messages in thread
From: Jan Kara @ 2017-05-02 15:03 UTC (permalink / raw)
  To: linux-fsdevel; +Cc: Christoph Hellwig, Jan Kara, Jaegeuk Kim, linux-f2fs-devel
Commit b685d3d65ac7 "block: treat REQ_FUA and REQ_PREFLUSH as
synchronous" removed REQ_SYNC flag from WRITE_{FUA|PREFLUSH|...}
definitions.  generic_make_request_checks() however strips REQ_FUA and
REQ_PREFLUSH flags from a bio when the storage doesn't report volatile
write cache and thus write effectively becomes asynchronous which can
lead to performance regressions.
Fix the problem by making sure all bios which are synchronous are
properly marked with REQ_SYNC.
Fixes: b685d3d65ac791406e0dfd8779cc9b3707fea5a3
CC: Jaegeuk Kim <jaegeuk@kernel.org>
CC: linux-f2fs-devel@lists.sourceforge.net
Signed-off-by: Jan Kara <jack@suse.cz>
---
 fs/f2fs/data.c    | 2 +-
 fs/f2fs/segment.c | 2 +-
 fs/f2fs/super.c   | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
index 1602b4bccae6..dd24476e8d2c 100644
--- a/fs/f2fs/data.c
+++ b/fs/f2fs/data.c
@@ -309,7 +309,7 @@ static void __f2fs_submit_merged_bio(struct f2fs_sb_info *sbi,
 	if (type >= META_FLUSH) {
 		io->fio.type = META_FLUSH;
 		io->fio.op = REQ_OP_WRITE;
-		io->fio.op_flags = REQ_META | REQ_PRIO;
+		io->fio.op_flags = REQ_META | REQ_PRIO | REQ_SYNC;
 		if (!test_opt(sbi, NOBARRIER))
 			io->fio.op_flags |= REQ_PREFLUSH | REQ_FUA;
 	}
diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c
index 29ef7088c558..0c24cec55dc9 100644
--- a/fs/f2fs/segment.c
+++ b/fs/f2fs/segment.c
@@ -416,7 +416,7 @@ static int __submit_flush_wait(struct block_device *bdev)
 	struct bio *bio = f2fs_bio_alloc(0);
 	int ret;
 
-	bio->bi_opf = REQ_OP_WRITE | REQ_PREFLUSH;
+	bio->bi_opf = REQ_OP_WRITE | REQ_SYNC | REQ_PREFLUSH;
 	bio->bi_bdev = bdev;
 	ret = submit_bio_wait(bio);
 	bio_put(bio);
diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
index 96fe8ed73100..fa5af1f04798 100644
--- a/fs/f2fs/super.c
+++ b/fs/f2fs/super.c
@@ -1307,7 +1307,7 @@ static int __f2fs_commit_super(struct buffer_head *bh,
 	unlock_buffer(bh);
 
 	/* it's rare case, we can do fua all the time */
-	return __sync_dirty_buffer(bh, REQ_PREFLUSH | REQ_FUA);
+	return __sync_dirty_buffer(bh, REQ_SYNC | REQ_PREFLUSH | REQ_FUA);
 }
 
 static inline bool sanity_check_area_boundary(struct f2fs_sb_info *sbi,
-- 
2.12.0
^ permalink raw reply related	[flat|nested] 7+ messages in thread
* Re: [f2fs-dev] [PATCH 3/7] f2fs: Make flush bios explicitely sync
  2017-05-02 15:03 ` [PATCH 3/7] f2fs: Make flush bios explicitely sync Jan Kara
@ 2017-05-03 16:20   ` Chao Yu
  2017-05-03 21:22   ` Jaegeuk Kim
  1 sibling, 0 replies; 7+ messages in thread
From: Chao Yu @ 2017-05-03 16:20 UTC (permalink / raw)
  To: Jan Kara, linux-fsdevel; +Cc: Christoph Hellwig, Jaegeuk Kim, linux-f2fs-devel
On 2017/5/2 23:03, Jan Kara wrote:
> Commit b685d3d65ac7 "block: treat REQ_FUA and REQ_PREFLUSH as
> synchronous" removed REQ_SYNC flag from WRITE_{FUA|PREFLUSH|...}
> definitions.  generic_make_request_checks() however strips REQ_FUA and
> REQ_PREFLUSH flags from a bio when the storage doesn't report volatile
> write cache and thus write effectively becomes asynchronous which can
> lead to performance regressions.
> 
> Fix the problem by making sure all bios which are synchronous are
> properly marked with REQ_SYNC.
> 
> Fixes: b685d3d65ac791406e0dfd8779cc9b3707fea5a3
> CC: Jaegeuk Kim <jaegeuk@kernel.org>
> CC: linux-f2fs-devel@lists.sourceforge.net
> Signed-off-by: Jan Kara <jack@suse.cz>
Looks good to me. :)
Acked-by: Chao Yu <yuchao0@huawei.com>
Thanks,
> ---
>  fs/f2fs/data.c    | 2 +-
>  fs/f2fs/segment.c | 2 +-
>  fs/f2fs/super.c   | 2 +-
>  3 files changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
> index 1602b4bccae6..dd24476e8d2c 100644
> --- a/fs/f2fs/data.c
> +++ b/fs/f2fs/data.c
> @@ -309,7 +309,7 @@ static void __f2fs_submit_merged_bio(struct f2fs_sb_info *sbi,
>  	if (type >= META_FLUSH) {
>  		io->fio.type = META_FLUSH;
>  		io->fio.op = REQ_OP_WRITE;
> -		io->fio.op_flags = REQ_META | REQ_PRIO;
> +		io->fio.op_flags = REQ_META | REQ_PRIO | REQ_SYNC;
>  		if (!test_opt(sbi, NOBARRIER))
>  			io->fio.op_flags |= REQ_PREFLUSH | REQ_FUA;
>  	}
> diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c
> index 29ef7088c558..0c24cec55dc9 100644
> --- a/fs/f2fs/segment.c
> +++ b/fs/f2fs/segment.c
> @@ -416,7 +416,7 @@ static int __submit_flush_wait(struct block_device *bdev)
>  	struct bio *bio = f2fs_bio_alloc(0);
>  	int ret;
>  
> -	bio->bi_opf = REQ_OP_WRITE | REQ_PREFLUSH;
> +	bio->bi_opf = REQ_OP_WRITE | REQ_SYNC | REQ_PREFLUSH;
>  	bio->bi_bdev = bdev;
>  	ret = submit_bio_wait(bio);
>  	bio_put(bio);
> diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
> index 96fe8ed73100..fa5af1f04798 100644
> --- a/fs/f2fs/super.c
> +++ b/fs/f2fs/super.c
> @@ -1307,7 +1307,7 @@ static int __f2fs_commit_super(struct buffer_head *bh,
>  	unlock_buffer(bh);
>  
>  	/* it's rare case, we can do fua all the time */
> -	return __sync_dirty_buffer(bh, REQ_PREFLUSH | REQ_FUA);
> +	return __sync_dirty_buffer(bh, REQ_SYNC | REQ_PREFLUSH | REQ_FUA);
>  }
>  
>  static inline bool sanity_check_area_boundary(struct f2fs_sb_info *sbi,
> 
^ permalink raw reply	[flat|nested] 7+ messages in thread
* Re: [PATCH 3/7] f2fs: Make flush bios explicitely sync
  2017-05-02 15:03 ` [PATCH 3/7] f2fs: Make flush bios explicitely sync Jan Kara
  2017-05-03 16:20   ` [f2fs-dev] " Chao Yu
@ 2017-05-03 21:22   ` Jaegeuk Kim
  2017-05-04  7:32     ` Jan Kara
  1 sibling, 1 reply; 7+ messages in thread
From: Jaegeuk Kim @ 2017-05-03 21:22 UTC (permalink / raw)
  To: Jan Kara; +Cc: linux-fsdevel, Christoph Hellwig, linux-f2fs-devel
Hi Jan,
On 05/02, Jan Kara wrote:
> Commit b685d3d65ac7 "block: treat REQ_FUA and REQ_PREFLUSH as
> synchronous" removed REQ_SYNC flag from WRITE_{FUA|PREFLUSH|...}
> definitions.  generic_make_request_checks() however strips REQ_FUA and
> REQ_PREFLUSH flags from a bio when the storage doesn't report volatile
> write cache and thus write effectively becomes asynchronous which can
> lead to performance regressions.
> 
> Fix the problem by making sure all bios which are synchronous are
> properly marked with REQ_SYNC.
> 
> Fixes: b685d3d65ac791406e0dfd8779cc9b3707fea5a3
Looks good to me. Thank you for the patch.
BTW, does this need cc to stable?
Cc: stable@vger.kernel.org # 4.9+
Thanks,
> CC: Jaegeuk Kim <jaegeuk@kernel.org>
> CC: linux-f2fs-devel@lists.sourceforge.net
> Signed-off-by: Jan Kara <jack@suse.cz>
> ---
>  fs/f2fs/data.c    | 2 +-
>  fs/f2fs/segment.c | 2 +-
>  fs/f2fs/super.c   | 2 +-
>  3 files changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
> index 1602b4bccae6..dd24476e8d2c 100644
> --- a/fs/f2fs/data.c
> +++ b/fs/f2fs/data.c
> @@ -309,7 +309,7 @@ static void __f2fs_submit_merged_bio(struct f2fs_sb_info *sbi,
>  	if (type >= META_FLUSH) {
>  		io->fio.type = META_FLUSH;
>  		io->fio.op = REQ_OP_WRITE;
> -		io->fio.op_flags = REQ_META | REQ_PRIO;
> +		io->fio.op_flags = REQ_META | REQ_PRIO | REQ_SYNC;
>  		if (!test_opt(sbi, NOBARRIER))
>  			io->fio.op_flags |= REQ_PREFLUSH | REQ_FUA;
>  	}
> diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c
> index 29ef7088c558..0c24cec55dc9 100644
> --- a/fs/f2fs/segment.c
> +++ b/fs/f2fs/segment.c
> @@ -416,7 +416,7 @@ static int __submit_flush_wait(struct block_device *bdev)
>  	struct bio *bio = f2fs_bio_alloc(0);
>  	int ret;
>  
> -	bio->bi_opf = REQ_OP_WRITE | REQ_PREFLUSH;
> +	bio->bi_opf = REQ_OP_WRITE | REQ_SYNC | REQ_PREFLUSH;
>  	bio->bi_bdev = bdev;
>  	ret = submit_bio_wait(bio);
>  	bio_put(bio);
> diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
> index 96fe8ed73100..fa5af1f04798 100644
> --- a/fs/f2fs/super.c
> +++ b/fs/f2fs/super.c
> @@ -1307,7 +1307,7 @@ static int __f2fs_commit_super(struct buffer_head *bh,
>  	unlock_buffer(bh);
>  
>  	/* it's rare case, we can do fua all the time */
> -	return __sync_dirty_buffer(bh, REQ_PREFLUSH | REQ_FUA);
> +	return __sync_dirty_buffer(bh, REQ_SYNC | REQ_PREFLUSH | REQ_FUA);
>  }
>  
>  static inline bool sanity_check_area_boundary(struct f2fs_sb_info *sbi,
> -- 
> 2.12.0
^ permalink raw reply	[flat|nested] 7+ messages in thread
* Re: [PATCH 3/7] f2fs: Make flush bios explicitely sync
  2017-05-03 21:22   ` Jaegeuk Kim
@ 2017-05-04  7:32     ` Jan Kara
  2017-05-04  7:34       ` Jan Kara
  0 siblings, 1 reply; 7+ messages in thread
From: Jan Kara @ 2017-05-04  7:32 UTC (permalink / raw)
  To: Jaegeuk Kim; +Cc: Jan Kara, linux-fsdevel, Christoph Hellwig, linux-f2fs-devel
On Wed 03-05-17 14:22:46, Jaegeuk Kim wrote:
> Hi Jan,
> 
> On 05/02, Jan Kara wrote:
> > Commit b685d3d65ac7 "block: treat REQ_FUA and REQ_PREFLUSH as
> > synchronous" removed REQ_SYNC flag from WRITE_{FUA|PREFLUSH|...}
> > definitions.  generic_make_request_checks() however strips REQ_FUA and
> > REQ_PREFLUSH flags from a bio when the storage doesn't report volatile
> > write cache and thus write effectively becomes asynchronous which can
> > lead to performance regressions.
> > 
> > Fix the problem by making sure all bios which are synchronous are
> > properly marked with REQ_SYNC.
> > 
> > Fixes: b685d3d65ac791406e0dfd8779cc9b3707fea5a3
> 
> Looks good to me. Thank you for the patch.
> BTW, does this need cc to stable?
> 
> Cc: stable@vger.kernel.org # 4.9+
Yeah, good point. Added.
								Honza
> 
> Thanks,
> 
> > CC: Jaegeuk Kim <jaegeuk@kernel.org>
> > CC: linux-f2fs-devel@lists.sourceforge.net
> > Signed-off-by: Jan Kara <jack@suse.cz>
> > ---
> >  fs/f2fs/data.c    | 2 +-
> >  fs/f2fs/segment.c | 2 +-
> >  fs/f2fs/super.c   | 2 +-
> >  3 files changed, 3 insertions(+), 3 deletions(-)
> > 
> > diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
> > index 1602b4bccae6..dd24476e8d2c 100644
> > --- a/fs/f2fs/data.c
> > +++ b/fs/f2fs/data.c
> > @@ -309,7 +309,7 @@ static void __f2fs_submit_merged_bio(struct f2fs_sb_info *sbi,
> >  	if (type >= META_FLUSH) {
> >  		io->fio.type = META_FLUSH;
> >  		io->fio.op = REQ_OP_WRITE;
> > -		io->fio.op_flags = REQ_META | REQ_PRIO;
> > +		io->fio.op_flags = REQ_META | REQ_PRIO | REQ_SYNC;
> >  		if (!test_opt(sbi, NOBARRIER))
> >  			io->fio.op_flags |= REQ_PREFLUSH | REQ_FUA;
> >  	}
> > diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c
> > index 29ef7088c558..0c24cec55dc9 100644
> > --- a/fs/f2fs/segment.c
> > +++ b/fs/f2fs/segment.c
> > @@ -416,7 +416,7 @@ static int __submit_flush_wait(struct block_device *bdev)
> >  	struct bio *bio = f2fs_bio_alloc(0);
> >  	int ret;
> >  
> > -	bio->bi_opf = REQ_OP_WRITE | REQ_PREFLUSH;
> > +	bio->bi_opf = REQ_OP_WRITE | REQ_SYNC | REQ_PREFLUSH;
> >  	bio->bi_bdev = bdev;
> >  	ret = submit_bio_wait(bio);
> >  	bio_put(bio);
> > diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
> > index 96fe8ed73100..fa5af1f04798 100644
> > --- a/fs/f2fs/super.c
> > +++ b/fs/f2fs/super.c
> > @@ -1307,7 +1307,7 @@ static int __f2fs_commit_super(struct buffer_head *bh,
> >  	unlock_buffer(bh);
> >  
> >  	/* it's rare case, we can do fua all the time */
> > -	return __sync_dirty_buffer(bh, REQ_PREFLUSH | REQ_FUA);
> > +	return __sync_dirty_buffer(bh, REQ_SYNC | REQ_PREFLUSH | REQ_FUA);
> >  }
> >  
> >  static inline bool sanity_check_area_boundary(struct f2fs_sb_info *sbi,
> > -- 
> > 2.12.0
-- 
Jan Kara <jack@suse.com>
SUSE Labs, CR
^ permalink raw reply	[flat|nested] 7+ messages in thread
* Re: [PATCH 3/7] f2fs: Make flush bios explicitely sync
  2017-05-04  7:32     ` Jan Kara
@ 2017-05-04  7:34       ` Jan Kara
  2017-05-04  7:36         ` Jaegeuk Kim
  0 siblings, 1 reply; 7+ messages in thread
From: Jan Kara @ 2017-05-04  7:34 UTC (permalink / raw)
  To: Jaegeuk Kim; +Cc: Jan Kara, linux-fsdevel, Christoph Hellwig, linux-f2fs-devel
On Thu 04-05-17 09:32:11, Jan Kara wrote:
> On Wed 03-05-17 14:22:46, Jaegeuk Kim wrote:
> > Hi Jan,
> > 
> > On 05/02, Jan Kara wrote:
> > > Commit b685d3d65ac7 "block: treat REQ_FUA and REQ_PREFLUSH as
> > > synchronous" removed REQ_SYNC flag from WRITE_{FUA|PREFLUSH|...}
> > > definitions.  generic_make_request_checks() however strips REQ_FUA and
> > > REQ_PREFLUSH flags from a bio when the storage doesn't report volatile
> > > write cache and thus write effectively becomes asynchronous which can
> > > lead to performance regressions.
> > > 
> > > Fix the problem by making sure all bios which are synchronous are
> > > properly marked with REQ_SYNC.
> > > 
> > > Fixes: b685d3d65ac791406e0dfd8779cc9b3707fea5a3
> > 
> > Looks good to me. Thank you for the patch.
> > BTW, does this need cc to stable?
> > 
> > Cc: stable@vger.kernel.org # 4.9+
> 
> Yeah, good point. Added.
BTW: Will you take the patch through your tree or should I take care of
merging it?
								Honza
> > > CC: Jaegeuk Kim <jaegeuk@kernel.org>
> > > CC: linux-f2fs-devel@lists.sourceforge.net
> > > Signed-off-by: Jan Kara <jack@suse.cz>
> > > ---
> > >  fs/f2fs/data.c    | 2 +-
> > >  fs/f2fs/segment.c | 2 +-
> > >  fs/f2fs/super.c   | 2 +-
> > >  3 files changed, 3 insertions(+), 3 deletions(-)
> > > 
> > > diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
> > > index 1602b4bccae6..dd24476e8d2c 100644
> > > --- a/fs/f2fs/data.c
> > > +++ b/fs/f2fs/data.c
> > > @@ -309,7 +309,7 @@ static void __f2fs_submit_merged_bio(struct f2fs_sb_info *sbi,
> > >  	if (type >= META_FLUSH) {
> > >  		io->fio.type = META_FLUSH;
> > >  		io->fio.op = REQ_OP_WRITE;
> > > -		io->fio.op_flags = REQ_META | REQ_PRIO;
> > > +		io->fio.op_flags = REQ_META | REQ_PRIO | REQ_SYNC;
> > >  		if (!test_opt(sbi, NOBARRIER))
> > >  			io->fio.op_flags |= REQ_PREFLUSH | REQ_FUA;
> > >  	}
> > > diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c
> > > index 29ef7088c558..0c24cec55dc9 100644
> > > --- a/fs/f2fs/segment.c
> > > +++ b/fs/f2fs/segment.c
> > > @@ -416,7 +416,7 @@ static int __submit_flush_wait(struct block_device *bdev)
> > >  	struct bio *bio = f2fs_bio_alloc(0);
> > >  	int ret;
> > >  
> > > -	bio->bi_opf = REQ_OP_WRITE | REQ_PREFLUSH;
> > > +	bio->bi_opf = REQ_OP_WRITE | REQ_SYNC | REQ_PREFLUSH;
> > >  	bio->bi_bdev = bdev;
> > >  	ret = submit_bio_wait(bio);
> > >  	bio_put(bio);
> > > diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
> > > index 96fe8ed73100..fa5af1f04798 100644
> > > --- a/fs/f2fs/super.c
> > > +++ b/fs/f2fs/super.c
> > > @@ -1307,7 +1307,7 @@ static int __f2fs_commit_super(struct buffer_head *bh,
> > >  	unlock_buffer(bh);
> > >  
> > >  	/* it's rare case, we can do fua all the time */
> > > -	return __sync_dirty_buffer(bh, REQ_PREFLUSH | REQ_FUA);
> > > +	return __sync_dirty_buffer(bh, REQ_SYNC | REQ_PREFLUSH | REQ_FUA);
> > >  }
> > >  
> > >  static inline bool sanity_check_area_boundary(struct f2fs_sb_info *sbi,
> > > -- 
> > > 2.12.0
> -- 
> Jan Kara <jack@suse.com>
> SUSE Labs, CR
-- 
Jan Kara <jack@suse.com>
SUSE Labs, CR
^ permalink raw reply	[flat|nested] 7+ messages in thread
* Re: [PATCH 3/7] f2fs: Make flush bios explicitely sync
  2017-05-04  7:34       ` Jan Kara
@ 2017-05-04  7:36         ` Jaegeuk Kim
  0 siblings, 0 replies; 7+ messages in thread
From: Jaegeuk Kim @ 2017-05-04  7:36 UTC (permalink / raw)
  To: Jan Kara; +Cc: linux-fsdevel, Christoph Hellwig, linux-f2fs-devel
On 05/04, Jan Kara wrote:
> On Thu 04-05-17 09:32:11, Jan Kara wrote:
> > On Wed 03-05-17 14:22:46, Jaegeuk Kim wrote:
> > > Hi Jan,
> > > 
> > > On 05/02, Jan Kara wrote:
> > > > Commit b685d3d65ac7 "block: treat REQ_FUA and REQ_PREFLUSH as
> > > > synchronous" removed REQ_SYNC flag from WRITE_{FUA|PREFLUSH|...}
> > > > definitions.  generic_make_request_checks() however strips REQ_FUA and
> > > > REQ_PREFLUSH flags from a bio when the storage doesn't report volatile
> > > > write cache and thus write effectively becomes asynchronous which can
> > > > lead to performance regressions.
> > > > 
> > > > Fix the problem by making sure all bios which are synchronous are
> > > > properly marked with REQ_SYNC.
> > > > 
> > > > Fixes: b685d3d65ac791406e0dfd8779cc9b3707fea5a3
> > > 
> > > Looks good to me. Thank you for the patch.
> > > BTW, does this need cc to stable?
> > > 
> > > Cc: stable@vger.kernel.org # 4.9+
> > 
> > Yeah, good point. Added.
> 
> BTW: Will you take the patch through your tree or should I take care of
> merging it?
Let me merge this patch with cc, if you don't mind.
Thanks,
> 
> 								Honza
> 
> > > > CC: Jaegeuk Kim <jaegeuk@kernel.org>
> > > > CC: linux-f2fs-devel@lists.sourceforge.net
> > > > Signed-off-by: Jan Kara <jack@suse.cz>
> > > > ---
> > > >  fs/f2fs/data.c    | 2 +-
> > > >  fs/f2fs/segment.c | 2 +-
> > > >  fs/f2fs/super.c   | 2 +-
> > > >  3 files changed, 3 insertions(+), 3 deletions(-)
> > > > 
> > > > diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
> > > > index 1602b4bccae6..dd24476e8d2c 100644
> > > > --- a/fs/f2fs/data.c
> > > > +++ b/fs/f2fs/data.c
> > > > @@ -309,7 +309,7 @@ static void __f2fs_submit_merged_bio(struct f2fs_sb_info *sbi,
> > > >  	if (type >= META_FLUSH) {
> > > >  		io->fio.type = META_FLUSH;
> > > >  		io->fio.op = REQ_OP_WRITE;
> > > > -		io->fio.op_flags = REQ_META | REQ_PRIO;
> > > > +		io->fio.op_flags = REQ_META | REQ_PRIO | REQ_SYNC;
> > > >  		if (!test_opt(sbi, NOBARRIER))
> > > >  			io->fio.op_flags |= REQ_PREFLUSH | REQ_FUA;
> > > >  	}
> > > > diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c
> > > > index 29ef7088c558..0c24cec55dc9 100644
> > > > --- a/fs/f2fs/segment.c
> > > > +++ b/fs/f2fs/segment.c
> > > > @@ -416,7 +416,7 @@ static int __submit_flush_wait(struct block_device *bdev)
> > > >  	struct bio *bio = f2fs_bio_alloc(0);
> > > >  	int ret;
> > > >  
> > > > -	bio->bi_opf = REQ_OP_WRITE | REQ_PREFLUSH;
> > > > +	bio->bi_opf = REQ_OP_WRITE | REQ_SYNC | REQ_PREFLUSH;
> > > >  	bio->bi_bdev = bdev;
> > > >  	ret = submit_bio_wait(bio);
> > > >  	bio_put(bio);
> > > > diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
> > > > index 96fe8ed73100..fa5af1f04798 100644
> > > > --- a/fs/f2fs/super.c
> > > > +++ b/fs/f2fs/super.c
> > > > @@ -1307,7 +1307,7 @@ static int __f2fs_commit_super(struct buffer_head *bh,
> > > >  	unlock_buffer(bh);
> > > >  
> > > >  	/* it's rare case, we can do fua all the time */
> > > > -	return __sync_dirty_buffer(bh, REQ_PREFLUSH | REQ_FUA);
> > > > +	return __sync_dirty_buffer(bh, REQ_SYNC | REQ_PREFLUSH | REQ_FUA);
> > > >  }
> > > >  
> > > >  static inline bool sanity_check_area_boundary(struct f2fs_sb_info *sbi,
> > > > -- 
> > > > 2.12.0
> > -- 
> > Jan Kara <jack@suse.com>
> > SUSE Labs, CR
> -- 
> Jan Kara <jack@suse.com>
> SUSE Labs, CR
^ permalink raw reply	[flat|nested] 7+ messages in thread
end of thread, other threads:[~2017-05-04  7:36 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-05-02 15:03 [PATCH 0/7] Fix fallout from changes to FUA and PREFLUSH definitions Jan Kara
2017-05-02 15:03 ` [PATCH 3/7] f2fs: Make flush bios explicitely sync Jan Kara
2017-05-03 16:20   ` [f2fs-dev] " Chao Yu
2017-05-03 21:22   ` Jaegeuk Kim
2017-05-04  7:32     ` Jan Kara
2017-05-04  7:34       ` Jan Kara
2017-05-04  7:36         ` Jaegeuk Kim
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).