Btrfs: don't clean dirty pages during buffered writes
commit7703bdd8d23e6ef057af3253958a793ec6066b28
authorChris Mason <clm@fb.com>
Wed, 20 Jun 2018 14:56:11 +0000 (20 07:56 -0700)
committerDavid Sterba <dsterba@suse.com>
Mon, 15 Oct 2018 15:23:35 +0000 (15 17:23 +0200)
tree7adb511b8dbb2180961ea78d64d1bf79cce8ada3
parent818255feece6e2a432328020d78c8a81a153ce65
Btrfs: don't clean dirty pages during buffered writes

During buffered writes, we follow this basic series of steps:

again:
lock all the pages
wait for writeback on all the pages
Take the extent range lock
wait for ordered extents on the whole range
clean all the pages

if (copy_from_user_in_atomic() hits a fault) {
drop our locks
goto again;
}

dirty all the pages
release all the locks

The extra waiting, cleaning and locking are there to make sure we don't
modify pages in flight to the drive, after they've been crc'd.

If some of the pages in the range were already dirty when the write
began, and we need to goto again, we create a window where a dirty page
has been cleaned and unlocked.  It may be reclaimed before we're able to
lock it again, which means we'll read the old contents off the drive and
lose any modifications that had been pending writeback.

We don't actually need to clean the pages.  All of the other locking in
place makes sure we don't start IO on the pages, so we can just leave
them dirty for the duration of the write.

Fixes: 73d59314e6ed (the original btrfs merge)
CC: stable@vger.kernel.org # v4.4+
Signed-off-by: Chris Mason <clm@fb.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/file.c