• Filipe Manana's avatar
    Btrfs: check for the full sync flag while holding the inode lock during fsync · ba0b084a
    Filipe Manana authored
    We were checking for the full fsync flag in the inode before locking the
    inode, which is racy, since at that that time it might not be set but
    after we acquire the inode lock some other task set it. One case where
    this can happen is on a system low on memory and some concurrent task
    failed to allocate an extent map and therefore set the full sync flag on
    the inode, to force the next fsync to work in full mode.
    
    A consequence of missing the full fsync flag set is hitting the problems
    fixed by commit 0c713cba ("Btrfs: fix race between ranged fsync and
    writeback of adjacent ranges"), BUG_ON() when dropping extents from a log
    tree, hitting assertion failures at tree-log.c:copy_items() or all sorts
    of weird inconsistencies after replaying a log due to file extents items
    representing ranges that overlap.
    
    So just move the check such that it's done after locking the inode and
    before starting writeback again.
    
    Fixes: 0c713cba ("Btrfs: fix race between ranged fsync and writeback of adjacent ranges")
    CC: stable@vger.kernel.org # 5.2+
    Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    ba0b084a
file.c 92.4 KB