]> git.baikalelectronics.ru Git - kernel.git/commit
btrfs: fix races on root_log_ctx lists
authorChris Mason <clm@fb.com>
Thu, 27 Oct 2016 17:42:20 +0000 (10:42 -0700)
committerChris Mason <clm@fb.com>
Thu, 27 Oct 2016 17:42:20 +0000 (10:42 -0700)
commitdb3e20ec88a5d42627526f5e34a6e2f4dc44a311
tree8eef62c0d0b1481a4b70df1bc6b1c2e6fdbe5c2a
parent795ae8dbf1e5d1b74f72dac564dacc3488c6154a
btrfs: fix races on root_log_ctx lists

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 647016f4803.  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: c19c4760727f0d54266308cb81ff9ec3b38b5476
Reported-by: Dave Jones <davej@codemonkey.org.uk>
cc: stable@vger.kernel.org # 3.15+
Signed-off-by: Chris Mason <clm@fb.com>
fs/btrfs/tree-log.c