aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r--fs/btrfs/inode.c173
1 files changed, 154 insertions, 19 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 160b55b3e13..4a0107e1874 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:
1557out_page: 1561out_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);
@@ -4794,9 +4806,6 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir,
4794 int err; 4806 int err;
4795 int drop_inode = 0; 4807 int drop_inode = 0;
4796 4808
4797 if (inode->i_nlink == 0)
4798 return -ENOENT;
4799
4800 /* do not allow sys_link's with other subvols of the same device */ 4809 /* do not allow sys_link's with other subvols of the same device */
4801 if (root->objectid != BTRFS_I(inode)->root->objectid) 4810 if (root->objectid != BTRFS_I(inode)->root->objectid)
4802 return -EPERM; 4811 return -EPERM;
@@ -4809,10 +4818,11 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir,
4809 goto fail; 4818 goto fail;
4810 4819
4811 /* 4820 /*
4812 * 1 item for inode ref 4821 * 2 items for inode and inode ref
4813 * 2 items for dir items 4822 * 2 items for dir items
4823 * 1 item for parent inode
4814 */ 4824 */
4815 trans = btrfs_start_transaction(root, 3); 4825 trans = btrfs_start_transaction(root, 5);
4816 if (IS_ERR(trans)) { 4826 if (IS_ERR(trans)) {
4817 err = PTR_ERR(trans); 4827 err = PTR_ERR(trans);
4818 goto fail; 4828 goto fail;
@@ -5176,6 +5186,8 @@ again:
5176 em = NULL; 5186 em = NULL;
5177 btrfs_release_path(root, path); 5187 btrfs_release_path(root, path);
5178 trans = btrfs_join_transaction(root, 1); 5188 trans = btrfs_join_transaction(root, 1);
5189 if (IS_ERR(trans))
5190 return ERR_CAST(trans);
5179 goto again; 5191 goto again;
5180 } 5192 }
5181 map = kmap(page); 5193 map = kmap(page);
@@ -5266,6 +5278,128 @@ out:
5266 return em; 5278 return em;
5267} 5279}
5268 5280
5281struct extent_map *btrfs_get_extent_fiemap(struct inode *inode, struct page *page,
5282 size_t pg_offset, u64 start, u64 len,
5283 int create)
5284{
5285 struct extent_map *em;
5286 struct extent_map *hole_em = NULL;
5287 u64 range_start = start;
5288 u64 end;
5289 u64 found;
5290 u64 found_end;
5291 int err = 0;
5292
5293 em = btrfs_get_extent(inode, page, pg_offset, start, len, create);
5294 if (IS_ERR(em))
5295 return em;
5296 if (em) {
5297 /*
5298 * if our em maps to a hole, there might
5299 * actually be delalloc bytes behind it
5300 */
5301 if (em->block_start != EXTENT_MAP_HOLE)
5302 return em;
5303 else
5304 hole_em = em;
5305 }
5306
5307 /* check to see if we've wrapped (len == -1 or similar) */
5308 end = start + len;
5309 if (end < start)
5310 end = (u64)-1;
5311 else
5312 end -= 1;
5313
5314 em = NULL;
5315
5316 /* ok, we didn't find anything, lets look for delalloc */
5317 found = count_range_bits(&BTRFS_I(inode)->io_tree, &range_start,
5318 end, len, EXTENT_DELALLOC, 1);
5319 found_end = range_start + found;
5320 if (found_end < range_start)
5321 found_end = (u64)-1;
5322
5323 /*
5324 * we didn't find anything useful, return
5325 * the original results from get_extent()
5326 */
5327 if (range_start > end || found_end <= start) {
5328 em = hole_em;
5329 hole_em = NULL;
5330 goto out;
5331 }
5332
5333 /* adjust the range_start to make sure it doesn't
5334 * go backwards from the start they passed in
5335 */
5336 range_start = max(start,range_start);
5337 found = found_end - range_start;
5338
5339 if (found > 0) {
5340 u64 hole_start = start;
5341 u64 hole_len = len;
5342
5343 em = alloc_extent_map(GFP_NOFS);
5344 if (!em) {
5345 err = -ENOMEM;
5346 goto out;
5347 }
5348 /*
5349 * when btrfs_get_extent can't find anything it
5350 * returns one huge hole
5351 *
5352 * make sure what it found really fits our range, and
5353 * adjust to make sure it is based on the start from
5354 * the caller
5355 */
5356 if (hole_em) {
5357 u64 calc_end = extent_map_end(hole_em);
5358
5359 if (calc_end <= start || (hole_em->start > end)) {
5360 free_extent_map(hole_em);
5361 hole_em = NULL;
5362 } else {
5363 hole_start = max(hole_em->start, start);
5364 hole_len = calc_end - hole_start;
5365 }
5366 }
5367 em->bdev = NULL;
5368 if (hole_em && range_start > hole_start) {
5369 /* our hole starts before our delalloc, so we
5370 * have to return just the parts of the hole
5371 * that go until the delalloc starts
5372 */
5373 em->len = min(hole_len,
5374 range_start - hole_start);
5375 em->start = hole_start;
5376 em->orig_start = hole_start;
5377 /*
5378 * don't adjust block start at all,
5379 * it is fixed at EXTENT_MAP_HOLE
5380 */
5381 em->block_start = hole_em->block_start;
5382 em->block_len = hole_len;
5383 } else {
5384 em->start = range_start;
5385 em->len = found;
5386 em->orig_start = range_start;
5387 em->block_start = EXTENT_MAP_DELALLOC;
5388 em->block_len = found;
5389 }
5390 } else if (hole_em) {
5391 return hole_em;
5392 }
5393out:
5394
5395 free_extent_map(hole_em);
5396 if (err) {
5397 free_extent_map(em);
5398 return ERR_PTR(err);
5399 }
5400 return em;
5401}
5402
5269static struct extent_map *btrfs_new_extent_direct(struct inode *inode, 5403static struct extent_map *btrfs_new_extent_direct(struct inode *inode,
5270 u64 start, u64 len) 5404 u64 start, u64 len)
5271{ 5405{
@@ -5280,8 +5414,8 @@ static struct extent_map *btrfs_new_extent_direct(struct inode *inode,
5280 btrfs_drop_extent_cache(inode, start, start + len - 1, 0); 5414 btrfs_drop_extent_cache(inode, start, start + len - 1, 0);
5281 5415
5282 trans = btrfs_join_transaction(root, 0); 5416 trans = btrfs_join_transaction(root, 0);
5283 if (!trans) 5417 if (IS_ERR(trans))
5284 return ERR_PTR(-ENOMEM); 5418 return ERR_CAST(trans);
5285 5419
5286 trans->block_rsv = &root->fs_info->delalloc_block_rsv; 5420 trans->block_rsv = &root->fs_info->delalloc_block_rsv;
5287 5421
@@ -5505,7 +5639,7 @@ static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock,
5505 * while we look for nocow cross refs 5639 * while we look for nocow cross refs
5506 */ 5640 */
5507 trans = btrfs_join_transaction(root, 0); 5641 trans = btrfs_join_transaction(root, 0);
5508 if (!trans) 5642 if (IS_ERR(trans))
5509 goto must_cow; 5643 goto must_cow;
5510 5644
5511 if (can_nocow_odirect(trans, inode, start, len) == 1) { 5645 if (can_nocow_odirect(trans, inode, start, len) == 1) {
@@ -5640,7 +5774,7 @@ again:
5640 BUG_ON(!ordered); 5774 BUG_ON(!ordered);
5641 5775
5642 trans = btrfs_join_transaction(root, 1); 5776 trans = btrfs_join_transaction(root, 1);
5643 if (!trans) { 5777 if (IS_ERR(trans)) {
5644 err = -ENOMEM; 5778 err = -ENOMEM;
5645 goto out; 5779 goto out;
5646 } 5780 }
@@ -5920,6 +6054,7 @@ static void btrfs_submit_direct(int rw, struct bio *bio, struct inode *inode,
5920 if (!skip_sum) { 6054 if (!skip_sum) {
5921 dip->csums = kmalloc(sizeof(u32) * bio->bi_vcnt, GFP_NOFS); 6055 dip->csums = kmalloc(sizeof(u32) * bio->bi_vcnt, GFP_NOFS);
5922 if (!dip->csums) { 6056 if (!dip->csums) {
6057 kfree(dip);
5923 ret = -ENOMEM; 6058 ret = -ENOMEM;
5924 goto free_ordered; 6059 goto free_ordered;
5925 } 6060 }
@@ -6088,7 +6223,7 @@ out:
6088static int btrfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, 6223static int btrfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
6089 __u64 start, __u64 len) 6224 __u64 start, __u64 len)
6090{ 6225{
6091 return extent_fiemap(inode, fieinfo, start, len, btrfs_get_extent); 6226 return extent_fiemap(inode, fieinfo, start, len, btrfs_get_extent_fiemap);
6092} 6227}
6093 6228
6094int btrfs_readpage(struct file *file, struct page *page) 6229int btrfs_readpage(struct file *file, struct page *page)