• Chris Mason's avatar
    btrfs: fix races on root_log_ctx lists · b8820e1a
    Chris Mason authored
    BugLink: http://bugs.launchpad.net/bugs/1642572
    
    commit 570dd450 upstream.
    
    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>
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: default avatarLuis Henriques <luis.henriques@canonical.com>
    b8820e1a
tree-log.c 149 KB