From: Sage Weil Date: Fri, 29 Oct 2010 19:37:34 +0000 (-0400) Subject: Btrfs: fix deadlock in btrfs_commit_transaction X-Git-Tag: v2.6.37-rc1~19^2~6 X-Git-Url: http://git.openpandora.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=99d16cbcaf694c803a1b6bf7e851694ffe1d255d;p=pandora-kernel.git Btrfs: fix deadlock in btrfs_commit_transaction 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: Sage Weil Signed-off-by: Chris Mason --- Reading git-diff-tree failed