• Chris Mason's avatar
    Btrfs: don't clean dirty pages during buffered writes · 8f2ecee5
    Chris Mason authored
    commit 7703bdd8 upstream.
    
    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: 73d59314 (the original btrfs merge)
    CC: stable@vger.kernel.org # v4.4+
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    8f2ecee5
file.c 86.9 KB