summaryrefslogtreecommitdiff
path: root/fs/btrfs/compression.c
diff options
context:
space:
mode:
authorMiao Xie <miaox@cn.fujitsu.com>2012-02-16 15:01:24 +0800
committerDavid Sterba <dsterba@suse.cz>2012-02-16 17:23:16 +0100
commit600a45e1d5e376f679ff9ecc4ce9452710a6d27c (patch)
treec4bf84eee1db132b5ff18700b95da8426a909f2f /fs/btrfs/compression.c
parent013bd4c336ad0d30e9e41f9cff0dbc1858934e75 (diff)
downloadlinux-3.10-600a45e1d5e376f679ff9ecc4ce9452710a6d27c.tar.gz
linux-3.10-600a45e1d5e376f679ff9ecc4ce9452710a6d27c.tar.bz2
linux-3.10-600a45e1d5e376f679ff9ecc4ce9452710a6d27c.zip
Btrfs: fix deadlock on page lock when doing auto-defragment
When I ran xfstests circularly on a auto-defragment btrfs, the deadlock happened. Steps to reproduce: [tty0] # export MOUNT_OPTIONS="-o autodefrag" # export TEST_DEV=<partition1> # export TEST_DIR=<mountpoint1> # export SCRATCH_DEV=<partition2> # export SCRATCH_MNT=<mountpoint2> # while [ 1 ] > do > ./check 091 127 263 > sleep 1 > done [tty1] # while [ 1 ] > do > echo 3 > /proc/sys/vm/drop_caches > done Several hours later, the test processes will hang on, and the deadlock will happen on page lock. The reason is that: Auto defrag task Flush thread Test task btrfs_writepages() add ordered extent (including page 1, 2) set page 1 writeback set page 2 writeback endio_fn() end page 2 writeback release page 2 lock page 1 alloc and lock page 2 page 2 is not uptodate btrfs_readpage() start ordered extent() btrfs_writepages() try to lock page 1 so deadlock happens. Fix this bug by unlocking the page which is in writeback, and re-locking it after the writeback end. Signed-off-by: Miao Xie <miax@cn.fujitsu.com>
Diffstat (limited to 'fs/btrfs/compression.c')
0 files changed, 0 insertions, 0 deletions