summaryrefslogtreecommitdiff
path: root/fs/btrfs/file.c
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2008-07-18 12:01:11 -0400
committerChris Mason <chris.mason@oracle.com>2008-09-25 11:04:05 -0400
commit7f3c74fb831fa19bafe087e817c0a5ff3883f1ea (patch)
tree416e95db10e408240916d5061caf1e5d1182b330 /fs/btrfs/file.c
parent211f90e68b679d27fe23c5505f86d6ce62c98bae (diff)
downloadlinux-stable-7f3c74fb831fa19bafe087e817c0a5ff3883f1ea.tar.gz
linux-stable-7f3c74fb831fa19bafe087e817c0a5ff3883f1ea.tar.bz2
linux-stable-7f3c74fb831fa19bafe087e817c0a5ff3883f1ea.zip
Btrfs: Keep extent mappings in ram until pending ordered extents are done
It was possible for stale mappings from disk to be used instead of the new pending ordered extent. This adds a flag to the extent map struct to keep it pinned until the pending ordered extent is actually on disk. Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/file.c')
-rw-r--r--fs/btrfs/file.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index 40ad1b2958cb..eccdb9562ba8 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -358,9 +358,7 @@ int btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end)
struct extent_map *split = NULL;
struct extent_map *split2 = NULL;
struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree;
- struct extent_map *tmp;
u64 len = end - start + 1;
- u64 next_start;
int ret;
int testend = 1;
@@ -381,8 +379,16 @@ int btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end)
spin_unlock(&em_tree->lock);
break;
}
- tmp = rb_entry(&em->rb_node, struct extent_map, rb_node);
- next_start = tmp->start;
+ if (test_bit(EXTENT_FLAG_PINNED, &em->flags)) {
+ start = em->start + em->len;
+ free_extent_map(em);
+ spin_unlock(&em_tree->lock);
+ if (start < end) {
+ len = end - start + 1;
+ continue;
+ }
+ break;
+ }
remove_extent_mapping(em_tree, em);
if (em->block_start < EXTENT_MAP_LAST_BYTE &&