diff options
author | Arne Jansen <sensille@gmx.net> | 2012-02-25 09:09:30 +0100 |
---|---|---|
committer | David Sterba <dsterba@suse.cz> | 2012-04-18 19:12:44 +0200 |
commit | 8c9c2bf7a3c4f7e9d158c0be9c49f372fb943ad2 (patch) | |
tree | 6c17b4db9b39cb8eb950c21377f453df18f467c3 /fs/btrfs/inode.c | |
parent | 848cce0d4102b5b4b26b0987b43e1919d462afe2 (diff) |
btrfs: fix race in reada
When inserting into the radix tree returns EEXIST, get the existing
entry without giving up the spinlock in between.
There was a race for both the zones trees and the extent tree.
Signed-off-by: Arne Jansen <sensille@gmx.net>
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r-- | fs/btrfs/inode.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index a682c267576..98ee5a51aa2 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -4332,7 +4332,13 @@ static int btrfs_real_readdir(struct file *filp, void *dirent, } no_dentry: /* is this a reference to our own snapshot? If so - * skip it + * skip it. + * + * In contrast to old kernels, we insert the snapshot's + * dir item and dir index after it has been created, so + * we won't find a reference to our own snapshot. We + * still keep the following code for backward + * compatibility. */ if (location.type == BTRFS_ROOT_ITEM_KEY && location.objectid == root->root_key.objectid) { |