• Liu Bo's avatar
    Btrfs: fix abnormal long waiting in fsync · 98ce2ded
    Liu Bo authored
    xfstests generic/127 detected this problem.
    
    With commit 7fc34a62, now fsync will only flush
    data within the passed range.  This is the cause of the above problem,
    -- btrfs's fsync has a stage called 'sync log' which will wait for all the
    ordered extents it've recorded to finish.
    
    In xfstests/generic/127, with mixed operations such as truncate, fallocate,
    punch hole, and mapwrite, we get some pre-allocated extents, and mapwrite will
    mmap, and then msync.  And I find that msync will wait for quite a long time
    (about 20s in my case), thanks to ftrace, it turns out that the previous
    fallocate calls 'btrfs_wait_ordered_range()' to flush dirty pages, but as the
    range of dirty pages may be larger than 'btrfs_wait_ordered_range()' wants,
    there can be some ordered extents created but not getting corresponding pages
    flushed, then they're left in memory until we fsync which runs into the
    stage 'sync log', and fsync will just wait for the system writeback thread
    to flush those pages and get ordered extents finished, so the latency is
    inevitable.
    
    This adds a flush similar to btrfs_start_ordered_extent() in
    btrfs_wait_logged_extents() to fix that.
    Reviewed-by: default avatarMiao Xie <miaox@cn.fujitsu.com>
    Signed-off-by: default avatarLiu Bo <bo.li.liu@oracle.com>
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    98ce2ded
ordered-data.c 32.6 KB