diff options
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r-- | fs/btrfs/inode.c | 164 |
1 files changed, 150 insertions, 14 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 160b55b3e132..0efdb65953c5 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -416,7 +416,7 @@ again: | |||
416 | } | 416 | } |
417 | if (start == 0) { | 417 | if (start == 0) { |
418 | trans = btrfs_join_transaction(root, 1); | 418 | trans = btrfs_join_transaction(root, 1); |
419 | BUG_ON(!trans); | 419 | BUG_ON(IS_ERR(trans)); |
420 | btrfs_set_trans_block_group(trans, inode); | 420 | btrfs_set_trans_block_group(trans, inode); |
421 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 421 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
422 | 422 | ||
@@ -612,6 +612,7 @@ retry: | |||
612 | GFP_NOFS); | 612 | GFP_NOFS); |
613 | 613 | ||
614 | trans = btrfs_join_transaction(root, 1); | 614 | trans = btrfs_join_transaction(root, 1); |
615 | BUG_ON(IS_ERR(trans)); | ||
615 | ret = btrfs_reserve_extent(trans, root, | 616 | ret = btrfs_reserve_extent(trans, root, |
616 | async_extent->compressed_size, | 617 | async_extent->compressed_size, |
617 | async_extent->compressed_size, | 618 | async_extent->compressed_size, |
@@ -643,6 +644,7 @@ retry: | |||
643 | async_extent->ram_size - 1, 0); | 644 | async_extent->ram_size - 1, 0); |
644 | 645 | ||
645 | em = alloc_extent_map(GFP_NOFS); | 646 | em = alloc_extent_map(GFP_NOFS); |
647 | BUG_ON(!em); | ||
646 | em->start = async_extent->start; | 648 | em->start = async_extent->start; |
647 | em->len = async_extent->ram_size; | 649 | em->len = async_extent->ram_size; |
648 | em->orig_start = em->start; | 650 | em->orig_start = em->start; |
@@ -771,7 +773,7 @@ static noinline int cow_file_range(struct inode *inode, | |||
771 | 773 | ||
772 | BUG_ON(root == root->fs_info->tree_root); | 774 | BUG_ON(root == root->fs_info->tree_root); |
773 | trans = btrfs_join_transaction(root, 1); | 775 | trans = btrfs_join_transaction(root, 1); |
774 | BUG_ON(!trans); | 776 | BUG_ON(IS_ERR(trans)); |
775 | btrfs_set_trans_block_group(trans, inode); | 777 | btrfs_set_trans_block_group(trans, inode); |
776 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 778 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
777 | 779 | ||
@@ -819,6 +821,7 @@ static noinline int cow_file_range(struct inode *inode, | |||
819 | BUG_ON(ret); | 821 | BUG_ON(ret); |
820 | 822 | ||
821 | em = alloc_extent_map(GFP_NOFS); | 823 | em = alloc_extent_map(GFP_NOFS); |
824 | BUG_ON(!em); | ||
822 | em->start = start; | 825 | em->start = start; |
823 | em->orig_start = em->start; | 826 | em->orig_start = em->start; |
824 | ram_size = ins.offset; | 827 | ram_size = ins.offset; |
@@ -1049,7 +1052,7 @@ static noinline int run_delalloc_nocow(struct inode *inode, | |||
1049 | } else { | 1052 | } else { |
1050 | trans = btrfs_join_transaction(root, 1); | 1053 | trans = btrfs_join_transaction(root, 1); |
1051 | } | 1054 | } |
1052 | BUG_ON(!trans); | 1055 | BUG_ON(IS_ERR(trans)); |
1053 | 1056 | ||
1054 | cow_start = (u64)-1; | 1057 | cow_start = (u64)-1; |
1055 | cur_offset = start; | 1058 | cur_offset = start; |
@@ -1168,6 +1171,7 @@ out_check: | |||
1168 | struct extent_map_tree *em_tree; | 1171 | struct extent_map_tree *em_tree; |
1169 | em_tree = &BTRFS_I(inode)->extent_tree; | 1172 | em_tree = &BTRFS_I(inode)->extent_tree; |
1170 | em = alloc_extent_map(GFP_NOFS); | 1173 | em = alloc_extent_map(GFP_NOFS); |
1174 | BUG_ON(!em); | ||
1171 | em->start = cur_offset; | 1175 | em->start = cur_offset; |
1172 | em->orig_start = em->start; | 1176 | em->orig_start = em->start; |
1173 | em->len = num_bytes; | 1177 | em->len = num_bytes; |
@@ -1557,6 +1561,7 @@ out: | |||
1557 | out_page: | 1561 | out_page: |
1558 | unlock_page(page); | 1562 | unlock_page(page); |
1559 | page_cache_release(page); | 1563 | page_cache_release(page); |
1564 | kfree(fixup); | ||
1560 | } | 1565 | } |
1561 | 1566 | ||
1562 | /* | 1567 | /* |
@@ -1703,7 +1708,7 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
1703 | trans = btrfs_join_transaction_nolock(root, 1); | 1708 | trans = btrfs_join_transaction_nolock(root, 1); |
1704 | else | 1709 | else |
1705 | trans = btrfs_join_transaction(root, 1); | 1710 | trans = btrfs_join_transaction(root, 1); |
1706 | BUG_ON(!trans); | 1711 | BUG_ON(IS_ERR(trans)); |
1707 | btrfs_set_trans_block_group(trans, inode); | 1712 | btrfs_set_trans_block_group(trans, inode); |
1708 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 1713 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
1709 | ret = btrfs_update_inode(trans, root, inode); | 1714 | ret = btrfs_update_inode(trans, root, inode); |
@@ -1720,6 +1725,7 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
1720 | trans = btrfs_join_transaction_nolock(root, 1); | 1725 | trans = btrfs_join_transaction_nolock(root, 1); |
1721 | else | 1726 | else |
1722 | trans = btrfs_join_transaction(root, 1); | 1727 | trans = btrfs_join_transaction(root, 1); |
1728 | BUG_ON(IS_ERR(trans)); | ||
1723 | btrfs_set_trans_block_group(trans, inode); | 1729 | btrfs_set_trans_block_group(trans, inode); |
1724 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 1730 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
1725 | 1731 | ||
@@ -1907,7 +1913,7 @@ static int btrfs_clean_io_failures(struct inode *inode, u64 start) | |||
1907 | 1913 | ||
1908 | private = 0; | 1914 | private = 0; |
1909 | if (count_range_bits(&BTRFS_I(inode)->io_failure_tree, &private, | 1915 | if (count_range_bits(&BTRFS_I(inode)->io_failure_tree, &private, |
1910 | (u64)-1, 1, EXTENT_DIRTY)) { | 1916 | (u64)-1, 1, EXTENT_DIRTY, 0)) { |
1911 | ret = get_state_private(&BTRFS_I(inode)->io_failure_tree, | 1917 | ret = get_state_private(&BTRFS_I(inode)->io_failure_tree, |
1912 | start, &private_failure); | 1918 | start, &private_failure); |
1913 | if (ret == 0) { | 1919 | if (ret == 0) { |
@@ -2354,6 +2360,7 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2354 | */ | 2360 | */ |
2355 | if (is_bad_inode(inode)) { | 2361 | if (is_bad_inode(inode)) { |
2356 | trans = btrfs_start_transaction(root, 0); | 2362 | trans = btrfs_start_transaction(root, 0); |
2363 | BUG_ON(IS_ERR(trans)); | ||
2357 | btrfs_orphan_del(trans, inode); | 2364 | btrfs_orphan_del(trans, inode); |
2358 | btrfs_end_transaction(trans, root); | 2365 | btrfs_end_transaction(trans, root); |
2359 | iput(inode); | 2366 | iput(inode); |
@@ -2381,6 +2388,7 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2381 | 2388 | ||
2382 | if (root->orphan_block_rsv || root->orphan_item_inserted) { | 2389 | if (root->orphan_block_rsv || root->orphan_item_inserted) { |
2383 | trans = btrfs_join_transaction(root, 1); | 2390 | trans = btrfs_join_transaction(root, 1); |
2391 | BUG_ON(IS_ERR(trans)); | ||
2384 | btrfs_end_transaction(trans, root); | 2392 | btrfs_end_transaction(trans, root); |
2385 | } | 2393 | } |
2386 | 2394 | ||
@@ -2641,7 +2649,7 @@ int btrfs_unlink_inode(struct btrfs_trans_handle *trans, | |||
2641 | path = btrfs_alloc_path(); | 2649 | path = btrfs_alloc_path(); |
2642 | if (!path) { | 2650 | if (!path) { |
2643 | ret = -ENOMEM; | 2651 | ret = -ENOMEM; |
2644 | goto err; | 2652 | goto out; |
2645 | } | 2653 | } |
2646 | 2654 | ||
2647 | path->leave_spinning = 1; | 2655 | path->leave_spinning = 1; |
@@ -2714,9 +2722,10 @@ static int check_path_shared(struct btrfs_root *root, | |||
2714 | struct extent_buffer *eb; | 2722 | struct extent_buffer *eb; |
2715 | int level; | 2723 | int level; |
2716 | u64 refs = 1; | 2724 | u64 refs = 1; |
2717 | int uninitialized_var(ret); | ||
2718 | 2725 | ||
2719 | for (level = 0; level < BTRFS_MAX_LEVEL; level++) { | 2726 | for (level = 0; level < BTRFS_MAX_LEVEL; level++) { |
2727 | int ret; | ||
2728 | |||
2720 | if (!path->nodes[level]) | 2729 | if (!path->nodes[level]) |
2721 | break; | 2730 | break; |
2722 | eb = path->nodes[level]; | 2731 | eb = path->nodes[level]; |
@@ -2727,7 +2736,7 @@ static int check_path_shared(struct btrfs_root *root, | |||
2727 | if (refs > 1) | 2736 | if (refs > 1) |
2728 | return 1; | 2737 | return 1; |
2729 | } | 2738 | } |
2730 | return ret; /* XXX callers? */ | 2739 | return 0; |
2731 | } | 2740 | } |
2732 | 2741 | ||
2733 | /* | 2742 | /* |
@@ -4134,7 +4143,7 @@ struct inode *btrfs_lookup_dentry(struct inode *dir, struct dentry *dentry) | |||
4134 | } | 4143 | } |
4135 | srcu_read_unlock(&root->fs_info->subvol_srcu, index); | 4144 | srcu_read_unlock(&root->fs_info->subvol_srcu, index); |
4136 | 4145 | ||
4137 | if (root != sub_root) { | 4146 | if (!IS_ERR(inode) && root != sub_root) { |
4138 | down_read(&root->fs_info->cleanup_work_sem); | 4147 | down_read(&root->fs_info->cleanup_work_sem); |
4139 | if (!(inode->i_sb->s_flags & MS_RDONLY)) | 4148 | if (!(inode->i_sb->s_flags & MS_RDONLY)) |
4140 | btrfs_orphan_cleanup(sub_root); | 4149 | btrfs_orphan_cleanup(sub_root); |
@@ -4347,6 +4356,8 @@ int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc) | |||
4347 | trans = btrfs_join_transaction_nolock(root, 1); | 4356 | trans = btrfs_join_transaction_nolock(root, 1); |
4348 | else | 4357 | else |
4349 | trans = btrfs_join_transaction(root, 1); | 4358 | trans = btrfs_join_transaction(root, 1); |
4359 | if (IS_ERR(trans)) | ||
4360 | return PTR_ERR(trans); | ||
4350 | btrfs_set_trans_block_group(trans, inode); | 4361 | btrfs_set_trans_block_group(trans, inode); |
4351 | if (nolock) | 4362 | if (nolock) |
4352 | ret = btrfs_end_transaction_nolock(trans, root); | 4363 | ret = btrfs_end_transaction_nolock(trans, root); |
@@ -4372,6 +4383,7 @@ void btrfs_dirty_inode(struct inode *inode) | |||
4372 | return; | 4383 | return; |
4373 | 4384 | ||
4374 | trans = btrfs_join_transaction(root, 1); | 4385 | trans = btrfs_join_transaction(root, 1); |
4386 | BUG_ON(IS_ERR(trans)); | ||
4375 | btrfs_set_trans_block_group(trans, inode); | 4387 | btrfs_set_trans_block_group(trans, inode); |
4376 | 4388 | ||
4377 | ret = btrfs_update_inode(trans, root, inode); | 4389 | ret = btrfs_update_inode(trans, root, inode); |
@@ -5176,6 +5188,8 @@ again: | |||
5176 | em = NULL; | 5188 | em = NULL; |
5177 | btrfs_release_path(root, path); | 5189 | btrfs_release_path(root, path); |
5178 | trans = btrfs_join_transaction(root, 1); | 5190 | trans = btrfs_join_transaction(root, 1); |
5191 | if (IS_ERR(trans)) | ||
5192 | return ERR_CAST(trans); | ||
5179 | goto again; | 5193 | goto again; |
5180 | } | 5194 | } |
5181 | map = kmap(page); | 5195 | map = kmap(page); |
@@ -5266,6 +5280,128 @@ out: | |||
5266 | return em; | 5280 | return em; |
5267 | } | 5281 | } |
5268 | 5282 | ||
5283 | struct extent_map *btrfs_get_extent_fiemap(struct inode *inode, struct page *page, | ||
5284 | size_t pg_offset, u64 start, u64 len, | ||
5285 | int create) | ||
5286 | { | ||
5287 | struct extent_map *em; | ||
5288 | struct extent_map *hole_em = NULL; | ||
5289 | u64 range_start = start; | ||
5290 | u64 end; | ||
5291 | u64 found; | ||
5292 | u64 found_end; | ||
5293 | int err = 0; | ||
5294 | |||
5295 | em = btrfs_get_extent(inode, page, pg_offset, start, len, create); | ||
5296 | if (IS_ERR(em)) | ||
5297 | return em; | ||
5298 | if (em) { | ||
5299 | /* | ||
5300 | * if our em maps to a hole, there might | ||
5301 | * actually be delalloc bytes behind it | ||
5302 | */ | ||
5303 | if (em->block_start != EXTENT_MAP_HOLE) | ||
5304 | return em; | ||
5305 | else | ||
5306 | hole_em = em; | ||
5307 | } | ||
5308 | |||
5309 | /* check to see if we've wrapped (len == -1 or similar) */ | ||
5310 | end = start + len; | ||
5311 | if (end < start) | ||
5312 | end = (u64)-1; | ||
5313 | else | ||
5314 | end -= 1; | ||
5315 | |||
5316 | em = NULL; | ||
5317 | |||
5318 | /* ok, we didn't find anything, lets look for delalloc */ | ||
5319 | found = count_range_bits(&BTRFS_I(inode)->io_tree, &range_start, | ||
5320 | end, len, EXTENT_DELALLOC, 1); | ||
5321 | found_end = range_start + found; | ||
5322 | if (found_end < range_start) | ||
5323 | found_end = (u64)-1; | ||
5324 | |||
5325 | /* | ||
5326 | * we didn't find anything useful, return | ||
5327 | * the original results from get_extent() | ||
5328 | */ | ||
5329 | if (range_start > end || found_end <= start) { | ||
5330 | em = hole_em; | ||
5331 | hole_em = NULL; | ||
5332 | goto out; | ||
5333 | } | ||
5334 | |||
5335 | /* adjust the range_start to make sure it doesn't | ||
5336 | * go backwards from the start they passed in | ||
5337 | */ | ||
5338 | range_start = max(start,range_start); | ||
5339 | found = found_end - range_start; | ||
5340 | |||
5341 | if (found > 0) { | ||
5342 | u64 hole_start = start; | ||
5343 | u64 hole_len = len; | ||
5344 | |||
5345 | em = alloc_extent_map(GFP_NOFS); | ||
5346 | if (!em) { | ||
5347 | err = -ENOMEM; | ||
5348 | goto out; | ||
5349 | } | ||
5350 | /* | ||
5351 | * when btrfs_get_extent can't find anything it | ||
5352 | * returns one huge hole | ||
5353 | * | ||
5354 | * make sure what it found really fits our range, and | ||
5355 | * adjust to make sure it is based on the start from | ||
5356 | * the caller | ||
5357 | */ | ||
5358 | if (hole_em) { | ||
5359 | u64 calc_end = extent_map_end(hole_em); | ||
5360 | |||
5361 | if (calc_end <= start || (hole_em->start > end)) { | ||
5362 | free_extent_map(hole_em); | ||
5363 | hole_em = NULL; | ||
5364 | } else { | ||
5365 | hole_start = max(hole_em->start, start); | ||
5366 | hole_len = calc_end - hole_start; | ||
5367 | } | ||
5368 | } | ||
5369 | em->bdev = NULL; | ||
5370 | if (hole_em && range_start > hole_start) { | ||
5371 | /* our hole starts before our delalloc, so we | ||
5372 | * have to return just the parts of the hole | ||
5373 | * that go until the delalloc starts | ||
5374 | */ | ||
5375 | em->len = min(hole_len, | ||
5376 | range_start - hole_start); | ||
5377 | em->start = hole_start; | ||
5378 | em->orig_start = hole_start; | ||
5379 | /* | ||
5380 | * don't adjust block start at all, | ||
5381 | * it is fixed at EXTENT_MAP_HOLE | ||
5382 | */ | ||
5383 | em->block_start = hole_em->block_start; | ||
5384 | em->block_len = hole_len; | ||
5385 | } else { | ||
5386 | em->start = range_start; | ||
5387 | em->len = found; | ||
5388 | em->orig_start = range_start; | ||
5389 | em->block_start = EXTENT_MAP_DELALLOC; | ||
5390 | em->block_len = found; | ||
5391 | } | ||
5392 | } else if (hole_em) { | ||
5393 | return hole_em; | ||
5394 | } | ||
5395 | out: | ||
5396 | |||
5397 | free_extent_map(hole_em); | ||
5398 | if (err) { | ||
5399 | free_extent_map(em); | ||
5400 | return ERR_PTR(err); | ||
5401 | } | ||
5402 | return em; | ||
5403 | } | ||
5404 | |||
5269 | static struct extent_map *btrfs_new_extent_direct(struct inode *inode, | 5405 | static struct extent_map *btrfs_new_extent_direct(struct inode *inode, |
5270 | u64 start, u64 len) | 5406 | u64 start, u64 len) |
5271 | { | 5407 | { |
@@ -5280,8 +5416,8 @@ static struct extent_map *btrfs_new_extent_direct(struct inode *inode, | |||
5280 | btrfs_drop_extent_cache(inode, start, start + len - 1, 0); | 5416 | btrfs_drop_extent_cache(inode, start, start + len - 1, 0); |
5281 | 5417 | ||
5282 | trans = btrfs_join_transaction(root, 0); | 5418 | trans = btrfs_join_transaction(root, 0); |
5283 | if (!trans) | 5419 | if (IS_ERR(trans)) |
5284 | return ERR_PTR(-ENOMEM); | 5420 | return ERR_CAST(trans); |
5285 | 5421 | ||
5286 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 5422 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
5287 | 5423 | ||
@@ -5505,7 +5641,7 @@ static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock, | |||
5505 | * while we look for nocow cross refs | 5641 | * while we look for nocow cross refs |
5506 | */ | 5642 | */ |
5507 | trans = btrfs_join_transaction(root, 0); | 5643 | trans = btrfs_join_transaction(root, 0); |
5508 | if (!trans) | 5644 | if (IS_ERR(trans)) |
5509 | goto must_cow; | 5645 | goto must_cow; |
5510 | 5646 | ||
5511 | if (can_nocow_odirect(trans, inode, start, len) == 1) { | 5647 | if (can_nocow_odirect(trans, inode, start, len) == 1) { |
@@ -5640,7 +5776,7 @@ again: | |||
5640 | BUG_ON(!ordered); | 5776 | BUG_ON(!ordered); |
5641 | 5777 | ||
5642 | trans = btrfs_join_transaction(root, 1); | 5778 | trans = btrfs_join_transaction(root, 1); |
5643 | if (!trans) { | 5779 | if (IS_ERR(trans)) { |
5644 | err = -ENOMEM; | 5780 | err = -ENOMEM; |
5645 | goto out; | 5781 | goto out; |
5646 | } | 5782 | } |
@@ -6088,7 +6224,7 @@ out: | |||
6088 | static int btrfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, | 6224 | static int btrfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, |
6089 | __u64 start, __u64 len) | 6225 | __u64 start, __u64 len) |
6090 | { | 6226 | { |
6091 | return extent_fiemap(inode, fieinfo, start, len, btrfs_get_extent); | 6227 | return extent_fiemap(inode, fieinfo, start, len, btrfs_get_extent_fiemap); |
6092 | } | 6228 | } |
6093 | 6229 | ||
6094 | int btrfs_readpage(struct file *file, struct page *page) | 6230 | int btrfs_readpage(struct file *file, struct page *page) |