• Sage Weil's avatar
    Btrfs: fix deadlock in btrfs_commit_transaction · 99d16cbc
    Sage Weil authored
    We calculate timeout (either 1 or MAX_SCHEDULE_TIMEOUT) based on whether
    num_writers > 1 or should_grow at the top of the loop.  Then, much much
    later, we wait for that timeout if either num_writers or should_grow is
    true.  However, it's possible for a racing process (calling
    btrfs_end_transaction()) to decrement num_writers such that we wait
    forever instead of for 1.
    
    Fix this by deciding how long to wait when we wait.  Include a smp_mb()
    before checking if the waitqueue is active to ensure the num_writers
    is visible.
    Signed-off-by: default avatarSage Weil <sage@newdream.net>
    Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
    99d16cbc
transaction.c 32.1 KB