]> git.baikalelectronics.ru Git - kernel.git/commit
Btrfs: fix two use-after-free bugs with transaction cleanup
authorJosef Bacik <jbacik@fusionio.com>
Mon, 30 Sep 2013 15:36:38 +0000 (11:36 -0400)
committerChris Mason <chris.mason@fusionio.com>
Tue, 12 Nov 2013 02:54:03 +0000 (21:54 -0500)
commitab191a8825cfeef19a52dd4c412c1a3e7348b1e6
tree0a1af5a08bfd4312ad169ed4c1ac9a8e804b3419
parente53ad8228f51c496bdfc511200ff0d443b05e1d1
Btrfs: fix two use-after-free bugs with transaction cleanup

I was noticing the slab redzone stuff going off every once and a while during
transaction aborts.  This was caused by two things

1) We would walk the pending snapshots and set their error to -ECANCELED.  We
don't need to do this, the snapshot stuff waits for a transaction commit and if
there is a problem we just free our pending snapshot object and exit.  Doing
this was causing us to touch the pending snapshot object after the thing had
already been freed.

2) We were freeing the transaction manually with wanton disregard for it's
use_count reference counter.  To fix this I cleaned up the transaction freeing
loop to either wait for the transaction commit to finish if it was in the middle
of that (since it will be cleaned and freed up there) or to do the cleanup
oursevles.

I also moved the global "kill all things dirty everywhere" stuff outside of the
transaction cleanup loop since that only needs to be done once.  With this patch
I'm no longer seeing slab corruption because of use after frees.  Thanks,

Signed-off-by: Josef Bacik <jbacik@fusionio.com>
Signed-off-by: Chris Mason <chris.mason@fusionio.com>
fs/btrfs/disk-io.c
fs/btrfs/transaction.c
fs/btrfs/transaction.h