• Chris Mason's avatar
    btrfs: fix races on root_log_ctx lists · 570dd450
    Chris Mason authored
    btrfs_remove_all_log_ctxs takes a shortcut where it avoids walking the
    list because it knows all of the waiters are patiently waiting for the
    commit to finish.
    
    But, there's a small race where btrfs_sync_log can remove itself from
    the list if it finds a log commit is already done.  Also, it uses
    list_del_init() to remove itself from the list, but there's no way to
    know if btrfs_remove_all_log_ctxs has already run, so we don't know for
    sure if it is safe to call list_del_init().
    
    This gets rid of all the shortcuts for btrfs_remove_all_log_ctxs(), and
    just calls it with the proper locking.
    
    This is part two of the corruption fixed by cbd60aa7.  I should have
    done this in the first place, but convinced myself the optimizations were
    safe.  A 12 hour run of dbench 2048 will eventually trigger a list debug
    WARN_ON for the list_del_init() in btrfs_sync_log().
    
    Fixes: d1433debReported-by: default avatarDave Jones <davej@codemonkey.org.uk>
    cc: stable@vger.kernel.org # 3.15+
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    570dd450
tree-log.c 154 KB