diff options
author | Miao Xie <miaox@cn.fujitsu.com> | 2014-04-23 13:33:36 +0200 |
---|---|---|
committer | Chris Mason <clm@fb.com> | 2014-04-25 01:43:33 +0200 |
commit | 1c70d8fb4dfa95bee491816b2a6767b5ca1080e7 (patch) | |
tree | c866788e0d25fb2f2d1621b1e2e651319a8114b9 /fs/btrfs/extent-tree.c | |
parent | Btrfs: fix possible memory leaks in open_ctree() (diff) | |
download | linux-1c70d8fb4dfa95bee491816b2a6767b5ca1080e7.tar.xz linux-1c70d8fb4dfa95bee491816b2a6767b5ca1080e7.zip |
Btrfs: fix inode caching vs tree log
Currently, with inode cache enabled, we will reuse its inode id immediately
after unlinking file, we may hit something like following:
|->iput inode
|->return inode id into inode cache
|->create dir,fsync
|->power off
An easy way to reproduce this problem is:
mkfs.btrfs -f /dev/sdb
mount /dev/sdb /mnt -o inode_cache,commit=100
dd if=/dev/zero of=/mnt/data bs=1M count=10 oflag=sync
inode_id=`ls -i /mnt/data | awk '{print $1}'`
rm -f /mnt/data
i=1
while [ 1 ]
do
mkdir /mnt/dir_$i
test1=`stat /mnt/dir_$i | grep Inode: | awk '{print $4}'`
if [ $test1 -eq $inode_id ]
then
dd if=/dev/zero of=/mnt/dir_$i/data bs=1M count=1 oflag=sync
echo b > /proc/sysrq-trigger
fi
sleep 1
i=$(($i+1))
done
mount /dev/sdb /mnt
umount /dev/sdb
btrfs check /dev/sdb
We fix this problem by adding unlinked inode's id into pinned tree,
and we can not reuse them until committing transaction.
Cc: stable@vger.kernel.org
Signed-off-by: Miao Xie <miaox@cn.fujitsu.com>
Signed-off-by: Wang Shilong <wangsl.fnst@cn.fujitsu.com>
Signed-off-by: Chris Mason <clm@fb.com>
Diffstat (limited to 'fs/btrfs/extent-tree.c')
0 files changed, 0 insertions, 0 deletions