diff options
Diffstat (limited to 'fs/btrfs/disk-io.c')
| -rw-r--r-- | fs/btrfs/disk-io.c | 19 | 
1 files changed, 11 insertions, 8 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 2b59201b955c..11d0ad30e203 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c  | |||
| @@ -263,13 +263,15 @@ static int csum_tree_block(struct btrfs_root *root, struct extent_buffer *buf, | |||
| 263 | static int verify_parent_transid(struct extent_io_tree *io_tree, | 263 | static int verify_parent_transid(struct extent_io_tree *io_tree, | 
| 264 | struct extent_buffer *eb, u64 parent_transid) | 264 | struct extent_buffer *eb, u64 parent_transid) | 
| 265 | { | 265 | { | 
| 266 | struct extent_state *cached_state = NULL; | ||
| 266 | int ret; | 267 | int ret; | 
| 267 | 268 | ||
| 268 | if (!parent_transid || btrfs_header_generation(eb) == parent_transid) | 269 | if (!parent_transid || btrfs_header_generation(eb) == parent_transid) | 
| 269 | return 0; | 270 | return 0; | 
| 270 | 271 | ||
| 271 | lock_extent(io_tree, eb->start, eb->start + eb->len - 1, GFP_NOFS); | 272 | lock_extent_bits(io_tree, eb->start, eb->start + eb->len - 1, | 
| 272 | if (extent_buffer_uptodate(io_tree, eb) && | 273 | 0, &cached_state, GFP_NOFS); | 
| 274 | if (extent_buffer_uptodate(io_tree, eb, cached_state) && | ||
| 273 | btrfs_header_generation(eb) == parent_transid) { | 275 | btrfs_header_generation(eb) == parent_transid) { | 
| 274 | ret = 0; | 276 | ret = 0; | 
| 275 | goto out; | 277 | goto out; | 
| @@ -282,10 +284,10 @@ static int verify_parent_transid(struct extent_io_tree *io_tree, | |||
| 282 | (unsigned long long)btrfs_header_generation(eb)); | 284 | (unsigned long long)btrfs_header_generation(eb)); | 
| 283 | } | 285 | } | 
| 284 | ret = 1; | 286 | ret = 1; | 
| 285 | clear_extent_buffer_uptodate(io_tree, eb); | 287 | clear_extent_buffer_uptodate(io_tree, eb, &cached_state); | 
| 286 | out: | 288 | out: | 
| 287 | unlock_extent(io_tree, eb->start, eb->start + eb->len - 1, | 289 | unlock_extent_cached(io_tree, eb->start, eb->start + eb->len - 1, | 
| 288 | GFP_NOFS); | 290 | &cached_state, GFP_NOFS); | 
| 289 | return ret; | 291 | return ret; | 
| 290 | } | 292 | } | 
| 291 | 293 | ||
| @@ -901,7 +903,7 @@ static int __setup_root(u32 nodesize, u32 leafsize, u32 sectorsize, | |||
| 901 | root->highest_objectid = 0; | 903 | root->highest_objectid = 0; | 
| 902 | root->name = NULL; | 904 | root->name = NULL; | 
| 903 | root->in_sysfs = 0; | 905 | root->in_sysfs = 0; | 
| 904 | root->inode_tree.rb_node = NULL; | 906 | root->inode_tree = RB_ROOT; | 
| 905 | 907 | ||
| 906 | INIT_LIST_HEAD(&root->dirty_list); | 908 | INIT_LIST_HEAD(&root->dirty_list); | 
| 907 | INIT_LIST_HEAD(&root->orphan_list); | 909 | INIT_LIST_HEAD(&root->orphan_list); | 
| @@ -1673,7 +1675,7 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
| 1673 | insert_inode_hash(fs_info->btree_inode); | 1675 | insert_inode_hash(fs_info->btree_inode); | 
| 1674 | 1676 | ||
| 1675 | spin_lock_init(&fs_info->block_group_cache_lock); | 1677 | spin_lock_init(&fs_info->block_group_cache_lock); | 
| 1676 | fs_info->block_group_cache_tree.rb_node = NULL; | 1678 | fs_info->block_group_cache_tree = RB_ROOT; | 
| 1677 | 1679 | ||
| 1678 | extent_io_tree_init(&fs_info->freed_extents[0], | 1680 | extent_io_tree_init(&fs_info->freed_extents[0], | 
| 1679 | fs_info->btree_inode->i_mapping, GFP_NOFS); | 1681 | fs_info->btree_inode->i_mapping, GFP_NOFS); | 
| @@ -2497,7 +2499,8 @@ int btrfs_buffer_uptodate(struct extent_buffer *buf, u64 parent_transid) | |||
| 2497 | int ret; | 2499 | int ret; | 
| 2498 | struct inode *btree_inode = buf->first_page->mapping->host; | 2500 | struct inode *btree_inode = buf->first_page->mapping->host; | 
| 2499 | 2501 | ||
| 2500 | ret = extent_buffer_uptodate(&BTRFS_I(btree_inode)->io_tree, buf); | 2502 | ret = extent_buffer_uptodate(&BTRFS_I(btree_inode)->io_tree, buf, | 
| 2503 | NULL); | ||
| 2501 | if (!ret) | 2504 | if (!ret) | 
| 2502 | return ret; | 2505 | return ret; | 
| 2503 | 2506 | ||
