diff options
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r-- | fs/btrfs/inode.c | 286 |
1 files changed, 133 insertions, 153 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index b2d004ad66a0..f12747c9447b 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -1792,12 +1792,12 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
1792 | } | 1792 | } |
1793 | ret = 0; | 1793 | ret = 0; |
1794 | out: | 1794 | out: |
1795 | if (nolock) { | 1795 | if (root != root->fs_info->tree_root) |
1796 | if (trans) | ||
1797 | btrfs_end_transaction_nolock(trans, root); | ||
1798 | } else { | ||
1799 | btrfs_delalloc_release_metadata(inode, ordered_extent->len); | 1796 | btrfs_delalloc_release_metadata(inode, ordered_extent->len); |
1800 | if (trans) | 1797 | if (trans) { |
1798 | if (nolock) | ||
1799 | btrfs_end_transaction_nolock(trans, root); | ||
1800 | else | ||
1801 | btrfs_end_transaction(trans, root); | 1801 | btrfs_end_transaction(trans, root); |
1802 | } | 1802 | } |
1803 | 1803 | ||
@@ -2079,89 +2079,6 @@ void btrfs_run_delayed_iputs(struct btrfs_root *root) | |||
2079 | up_read(&root->fs_info->cleanup_work_sem); | 2079 | up_read(&root->fs_info->cleanup_work_sem); |
2080 | } | 2080 | } |
2081 | 2081 | ||
2082 | /* | ||
2083 | * calculate extra metadata reservation when snapshotting a subvolume | ||
2084 | * contains orphan files. | ||
2085 | */ | ||
2086 | void btrfs_orphan_pre_snapshot(struct btrfs_trans_handle *trans, | ||
2087 | struct btrfs_pending_snapshot *pending, | ||
2088 | u64 *bytes_to_reserve) | ||
2089 | { | ||
2090 | struct btrfs_root *root; | ||
2091 | struct btrfs_block_rsv *block_rsv; | ||
2092 | u64 num_bytes; | ||
2093 | int index; | ||
2094 | |||
2095 | root = pending->root; | ||
2096 | if (!root->orphan_block_rsv || list_empty(&root->orphan_list)) | ||
2097 | return; | ||
2098 | |||
2099 | block_rsv = root->orphan_block_rsv; | ||
2100 | |||
2101 | /* orphan block reservation for the snapshot */ | ||
2102 | num_bytes = block_rsv->size; | ||
2103 | |||
2104 | /* | ||
2105 | * after the snapshot is created, COWing tree blocks may use more | ||
2106 | * space than it frees. So we should make sure there is enough | ||
2107 | * reserved space. | ||
2108 | */ | ||
2109 | index = trans->transid & 0x1; | ||
2110 | if (block_rsv->reserved + block_rsv->freed[index] < block_rsv->size) { | ||
2111 | num_bytes += block_rsv->size - | ||
2112 | (block_rsv->reserved + block_rsv->freed[index]); | ||
2113 | } | ||
2114 | |||
2115 | *bytes_to_reserve += num_bytes; | ||
2116 | } | ||
2117 | |||
2118 | void btrfs_orphan_post_snapshot(struct btrfs_trans_handle *trans, | ||
2119 | struct btrfs_pending_snapshot *pending) | ||
2120 | { | ||
2121 | struct btrfs_root *root = pending->root; | ||
2122 | struct btrfs_root *snap = pending->snap; | ||
2123 | struct btrfs_block_rsv *block_rsv; | ||
2124 | u64 num_bytes; | ||
2125 | int index; | ||
2126 | int ret; | ||
2127 | |||
2128 | if (!root->orphan_block_rsv || list_empty(&root->orphan_list)) | ||
2129 | return; | ||
2130 | |||
2131 | /* refill source subvolume's orphan block reservation */ | ||
2132 | block_rsv = root->orphan_block_rsv; | ||
2133 | index = trans->transid & 0x1; | ||
2134 | if (block_rsv->reserved + block_rsv->freed[index] < block_rsv->size) { | ||
2135 | num_bytes = block_rsv->size - | ||
2136 | (block_rsv->reserved + block_rsv->freed[index]); | ||
2137 | ret = btrfs_block_rsv_migrate(&pending->block_rsv, | ||
2138 | root->orphan_block_rsv, | ||
2139 | num_bytes); | ||
2140 | BUG_ON(ret); | ||
2141 | } | ||
2142 | |||
2143 | /* setup orphan block reservation for the snapshot */ | ||
2144 | block_rsv = btrfs_alloc_block_rsv(snap); | ||
2145 | BUG_ON(!block_rsv); | ||
2146 | |||
2147 | btrfs_add_durable_block_rsv(root->fs_info, block_rsv); | ||
2148 | snap->orphan_block_rsv = block_rsv; | ||
2149 | |||
2150 | num_bytes = root->orphan_block_rsv->size; | ||
2151 | ret = btrfs_block_rsv_migrate(&pending->block_rsv, | ||
2152 | block_rsv, num_bytes); | ||
2153 | BUG_ON(ret); | ||
2154 | |||
2155 | #if 0 | ||
2156 | /* insert orphan item for the snapshot */ | ||
2157 | WARN_ON(!root->orphan_item_inserted); | ||
2158 | ret = btrfs_insert_orphan_item(trans, root->fs_info->tree_root, | ||
2159 | snap->root_key.objectid); | ||
2160 | BUG_ON(ret); | ||
2161 | snap->orphan_item_inserted = 1; | ||
2162 | #endif | ||
2163 | } | ||
2164 | |||
2165 | enum btrfs_orphan_cleanup_state { | 2082 | enum btrfs_orphan_cleanup_state { |
2166 | ORPHAN_CLEANUP_STARTED = 1, | 2083 | ORPHAN_CLEANUP_STARTED = 1, |
2167 | ORPHAN_CLEANUP_DONE = 2, | 2084 | ORPHAN_CLEANUP_DONE = 2, |
@@ -2247,9 +2164,6 @@ int btrfs_orphan_add(struct btrfs_trans_handle *trans, struct inode *inode) | |||
2247 | } | 2164 | } |
2248 | spin_unlock(&root->orphan_lock); | 2165 | spin_unlock(&root->orphan_lock); |
2249 | 2166 | ||
2250 | if (block_rsv) | ||
2251 | btrfs_add_durable_block_rsv(root->fs_info, block_rsv); | ||
2252 | |||
2253 | /* grab metadata reservation from transaction handle */ | 2167 | /* grab metadata reservation from transaction handle */ |
2254 | if (reserve) { | 2168 | if (reserve) { |
2255 | ret = btrfs_orphan_reserve_metadata(trans, inode); | 2169 | ret = btrfs_orphan_reserve_metadata(trans, inode); |
@@ -2316,6 +2230,7 @@ int btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2316 | struct btrfs_key key, found_key; | 2230 | struct btrfs_key key, found_key; |
2317 | struct btrfs_trans_handle *trans; | 2231 | struct btrfs_trans_handle *trans; |
2318 | struct inode *inode; | 2232 | struct inode *inode; |
2233 | u64 last_objectid = 0; | ||
2319 | int ret = 0, nr_unlink = 0, nr_truncate = 0; | 2234 | int ret = 0, nr_unlink = 0, nr_truncate = 0; |
2320 | 2235 | ||
2321 | if (cmpxchg(&root->orphan_cleanup_state, 0, ORPHAN_CLEANUP_STARTED)) | 2236 | if (cmpxchg(&root->orphan_cleanup_state, 0, ORPHAN_CLEANUP_STARTED)) |
@@ -2367,41 +2282,49 @@ int btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2367 | * crossing root thing. we store the inode number in the | 2282 | * crossing root thing. we store the inode number in the |
2368 | * offset of the orphan item. | 2283 | * offset of the orphan item. |
2369 | */ | 2284 | */ |
2285 | |||
2286 | if (found_key.offset == last_objectid) { | ||
2287 | printk(KERN_ERR "btrfs: Error removing orphan entry, " | ||
2288 | "stopping orphan cleanup\n"); | ||
2289 | ret = -EINVAL; | ||
2290 | goto out; | ||
2291 | } | ||
2292 | |||
2293 | last_objectid = found_key.offset; | ||
2294 | |||
2370 | found_key.objectid = found_key.offset; | 2295 | found_key.objectid = found_key.offset; |
2371 | found_key.type = BTRFS_INODE_ITEM_KEY; | 2296 | found_key.type = BTRFS_INODE_ITEM_KEY; |
2372 | found_key.offset = 0; | 2297 | found_key.offset = 0; |
2373 | inode = btrfs_iget(root->fs_info->sb, &found_key, root, NULL); | 2298 | inode = btrfs_iget(root->fs_info->sb, &found_key, root, NULL); |
2374 | if (IS_ERR(inode)) { | 2299 | ret = PTR_RET(inode); |
2375 | ret = PTR_ERR(inode); | 2300 | if (ret && ret != -ESTALE) |
2376 | goto out; | 2301 | goto out; |
2377 | } | ||
2378 | |||
2379 | /* | ||
2380 | * add this inode to the orphan list so btrfs_orphan_del does | ||
2381 | * the proper thing when we hit it | ||
2382 | */ | ||
2383 | spin_lock(&root->orphan_lock); | ||
2384 | list_add(&BTRFS_I(inode)->i_orphan, &root->orphan_list); | ||
2385 | spin_unlock(&root->orphan_lock); | ||
2386 | 2302 | ||
2387 | /* | 2303 | /* |
2388 | * if this is a bad inode, means we actually succeeded in | 2304 | * Inode is already gone but the orphan item is still there, |
2389 | * removing the inode, but not the orphan record, which means | 2305 | * kill the orphan item. |
2390 | * we need to manually delete the orphan since iput will just | ||
2391 | * do a destroy_inode | ||
2392 | */ | 2306 | */ |
2393 | if (is_bad_inode(inode)) { | 2307 | if (ret == -ESTALE) { |
2394 | trans = btrfs_start_transaction(root, 0); | 2308 | trans = btrfs_start_transaction(root, 1); |
2395 | if (IS_ERR(trans)) { | 2309 | if (IS_ERR(trans)) { |
2396 | ret = PTR_ERR(trans); | 2310 | ret = PTR_ERR(trans); |
2397 | goto out; | 2311 | goto out; |
2398 | } | 2312 | } |
2399 | btrfs_orphan_del(trans, inode); | 2313 | ret = btrfs_del_orphan_item(trans, root, |
2314 | found_key.objectid); | ||
2315 | BUG_ON(ret); | ||
2400 | btrfs_end_transaction(trans, root); | 2316 | btrfs_end_transaction(trans, root); |
2401 | iput(inode); | ||
2402 | continue; | 2317 | continue; |
2403 | } | 2318 | } |
2404 | 2319 | ||
2320 | /* | ||
2321 | * add this inode to the orphan list so btrfs_orphan_del does | ||
2322 | * the proper thing when we hit it | ||
2323 | */ | ||
2324 | spin_lock(&root->orphan_lock); | ||
2325 | list_add(&BTRFS_I(inode)->i_orphan, &root->orphan_list); | ||
2326 | spin_unlock(&root->orphan_lock); | ||
2327 | |||
2405 | /* if we have links, this was a truncate, lets do that */ | 2328 | /* if we have links, this was a truncate, lets do that */ |
2406 | if (inode->i_nlink) { | 2329 | if (inode->i_nlink) { |
2407 | if (!S_ISREG(inode->i_mode)) { | 2330 | if (!S_ISREG(inode->i_mode)) { |
@@ -2835,7 +2758,16 @@ static struct btrfs_trans_handle *__unlink_start_trans(struct inode *dir, | |||
2835 | u64 ino = btrfs_ino(inode); | 2758 | u64 ino = btrfs_ino(inode); |
2836 | u64 dir_ino = btrfs_ino(dir); | 2759 | u64 dir_ino = btrfs_ino(dir); |
2837 | 2760 | ||
2838 | trans = btrfs_start_transaction(root, 10); | 2761 | /* |
2762 | * 1 for the possible orphan item | ||
2763 | * 1 for the dir item | ||
2764 | * 1 for the dir index | ||
2765 | * 1 for the inode ref | ||
2766 | * 1 for the inode ref in the tree log | ||
2767 | * 2 for the dir entries in the log | ||
2768 | * 1 for the inode | ||
2769 | */ | ||
2770 | trans = btrfs_start_transaction(root, 8); | ||
2839 | if (!IS_ERR(trans) || PTR_ERR(trans) != -ENOSPC) | 2771 | if (!IS_ERR(trans) || PTR_ERR(trans) != -ENOSPC) |
2840 | return trans; | 2772 | return trans; |
2841 | 2773 | ||
@@ -2858,7 +2790,8 @@ static struct btrfs_trans_handle *__unlink_start_trans(struct inode *dir, | |||
2858 | return ERR_PTR(-ENOMEM); | 2790 | return ERR_PTR(-ENOMEM); |
2859 | } | 2791 | } |
2860 | 2792 | ||
2861 | trans = btrfs_start_transaction(root, 0); | 2793 | /* 1 for the orphan item */ |
2794 | trans = btrfs_start_transaction(root, 1); | ||
2862 | if (IS_ERR(trans)) { | 2795 | if (IS_ERR(trans)) { |
2863 | btrfs_free_path(path); | 2796 | btrfs_free_path(path); |
2864 | root->fs_info->enospc_unlink = 0; | 2797 | root->fs_info->enospc_unlink = 0; |
@@ -2963,6 +2896,12 @@ static struct btrfs_trans_handle *__unlink_start_trans(struct inode *dir, | |||
2963 | err = 0; | 2896 | err = 0; |
2964 | out: | 2897 | out: |
2965 | btrfs_free_path(path); | 2898 | btrfs_free_path(path); |
2899 | /* Migrate the orphan reservation over */ | ||
2900 | if (!err) | ||
2901 | err = btrfs_block_rsv_migrate(trans->block_rsv, | ||
2902 | &root->fs_info->global_block_rsv, | ||
2903 | btrfs_calc_trans_metadata_size(root, 1)); | ||
2904 | |||
2966 | if (err) { | 2905 | if (err) { |
2967 | btrfs_end_transaction(trans, root); | 2906 | btrfs_end_transaction(trans, root); |
2968 | root->fs_info->enospc_unlink = 0; | 2907 | root->fs_info->enospc_unlink = 0; |
@@ -3368,6 +3307,7 @@ static int btrfs_truncate_page(struct address_space *mapping, loff_t from) | |||
3368 | pgoff_t index = from >> PAGE_CACHE_SHIFT; | 3307 | pgoff_t index = from >> PAGE_CACHE_SHIFT; |
3369 | unsigned offset = from & (PAGE_CACHE_SIZE-1); | 3308 | unsigned offset = from & (PAGE_CACHE_SIZE-1); |
3370 | struct page *page; | 3309 | struct page *page; |
3310 | gfp_t mask = btrfs_alloc_write_mask(mapping); | ||
3371 | int ret = 0; | 3311 | int ret = 0; |
3372 | u64 page_start; | 3312 | u64 page_start; |
3373 | u64 page_end; | 3313 | u64 page_end; |
@@ -3380,7 +3320,7 @@ static int btrfs_truncate_page(struct address_space *mapping, loff_t from) | |||
3380 | 3320 | ||
3381 | ret = -ENOMEM; | 3321 | ret = -ENOMEM; |
3382 | again: | 3322 | again: |
3383 | page = find_or_create_page(mapping, index, GFP_NOFS); | 3323 | page = find_or_create_page(mapping, index, mask); |
3384 | if (!page) { | 3324 | if (!page) { |
3385 | btrfs_delalloc_release_space(inode, PAGE_CACHE_SIZE); | 3325 | btrfs_delalloc_release_space(inode, PAGE_CACHE_SIZE); |
3386 | goto out; | 3326 | goto out; |
@@ -3613,6 +3553,8 @@ void btrfs_evict_inode(struct inode *inode) | |||
3613 | { | 3553 | { |
3614 | struct btrfs_trans_handle *trans; | 3554 | struct btrfs_trans_handle *trans; |
3615 | struct btrfs_root *root = BTRFS_I(inode)->root; | 3555 | struct btrfs_root *root = BTRFS_I(inode)->root; |
3556 | struct btrfs_block_rsv *rsv, *global_rsv; | ||
3557 | u64 min_size = btrfs_calc_trunc_metadata_size(root, 1); | ||
3616 | unsigned long nr; | 3558 | unsigned long nr; |
3617 | int ret; | 3559 | int ret; |
3618 | 3560 | ||
@@ -3640,22 +3582,55 @@ void btrfs_evict_inode(struct inode *inode) | |||
3640 | goto no_delete; | 3582 | goto no_delete; |
3641 | } | 3583 | } |
3642 | 3584 | ||
3585 | rsv = btrfs_alloc_block_rsv(root); | ||
3586 | if (!rsv) { | ||
3587 | btrfs_orphan_del(NULL, inode); | ||
3588 | goto no_delete; | ||
3589 | } | ||
3590 | rsv->size = min_size; | ||
3591 | global_rsv = &root->fs_info->global_block_rsv; | ||
3592 | |||
3643 | btrfs_i_size_write(inode, 0); | 3593 | btrfs_i_size_write(inode, 0); |
3644 | 3594 | ||
3595 | /* | ||
3596 | * This is a bit simpler than btrfs_truncate since | ||
3597 | * | ||
3598 | * 1) We've already reserved our space for our orphan item in the | ||
3599 | * unlink. | ||
3600 | * 2) We're going to delete the inode item, so we don't need to update | ||
3601 | * it at all. | ||
3602 | * | ||
3603 | * So we just need to reserve some slack space in case we add bytes when | ||
3604 | * doing the truncate. | ||
3605 | */ | ||
3645 | while (1) { | 3606 | while (1) { |
3646 | trans = btrfs_join_transaction(root); | 3607 | ret = btrfs_block_rsv_refill(root, rsv, min_size); |
3647 | BUG_ON(IS_ERR(trans)); | 3608 | |
3648 | trans->block_rsv = root->orphan_block_rsv; | 3609 | /* |
3610 | * Try and steal from the global reserve since we will | ||
3611 | * likely not use this space anyway, we want to try as | ||
3612 | * hard as possible to get this to work. | ||
3613 | */ | ||
3614 | if (ret) | ||
3615 | ret = btrfs_block_rsv_migrate(global_rsv, rsv, min_size); | ||
3649 | 3616 | ||
3650 | ret = btrfs_block_rsv_check(trans, root, | ||
3651 | root->orphan_block_rsv, 0, 5); | ||
3652 | if (ret) { | 3617 | if (ret) { |
3653 | BUG_ON(ret != -EAGAIN); | 3618 | printk(KERN_WARNING "Could not get space for a " |
3654 | ret = btrfs_commit_transaction(trans, root); | 3619 | "delete, will truncate on mount %d\n", ret); |
3655 | BUG_ON(ret); | 3620 | btrfs_orphan_del(NULL, inode); |
3656 | continue; | 3621 | btrfs_free_block_rsv(root, rsv); |
3622 | goto no_delete; | ||
3623 | } | ||
3624 | |||
3625 | trans = btrfs_start_transaction(root, 0); | ||
3626 | if (IS_ERR(trans)) { | ||
3627 | btrfs_orphan_del(NULL, inode); | ||
3628 | btrfs_free_block_rsv(root, rsv); | ||
3629 | goto no_delete; | ||
3657 | } | 3630 | } |
3658 | 3631 | ||
3632 | trans->block_rsv = rsv; | ||
3633 | |||
3659 | ret = btrfs_truncate_inode_items(trans, root, inode, 0, 0); | 3634 | ret = btrfs_truncate_inode_items(trans, root, inode, 0, 0); |
3660 | if (ret != -EAGAIN) | 3635 | if (ret != -EAGAIN) |
3661 | break; | 3636 | break; |
@@ -3664,14 +3639,17 @@ void btrfs_evict_inode(struct inode *inode) | |||
3664 | btrfs_end_transaction(trans, root); | 3639 | btrfs_end_transaction(trans, root); |
3665 | trans = NULL; | 3640 | trans = NULL; |
3666 | btrfs_btree_balance_dirty(root, nr); | 3641 | btrfs_btree_balance_dirty(root, nr); |
3667 | |||
3668 | } | 3642 | } |
3669 | 3643 | ||
3644 | btrfs_free_block_rsv(root, rsv); | ||
3645 | |||
3670 | if (ret == 0) { | 3646 | if (ret == 0) { |
3647 | trans->block_rsv = root->orphan_block_rsv; | ||
3671 | ret = btrfs_orphan_del(trans, inode); | 3648 | ret = btrfs_orphan_del(trans, inode); |
3672 | BUG_ON(ret); | 3649 | BUG_ON(ret); |
3673 | } | 3650 | } |
3674 | 3651 | ||
3652 | trans->block_rsv = &root->fs_info->trans_block_rsv; | ||
3675 | if (!(root == root->fs_info->tree_root || | 3653 | if (!(root == root->fs_info->tree_root || |
3676 | root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID)) | 3654 | root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID)) |
3677 | btrfs_return_ino(root, btrfs_ino(inode)); | 3655 | btrfs_return_ino(root, btrfs_ino(inode)); |
@@ -6541,6 +6519,7 @@ static int btrfs_truncate(struct inode *inode) | |||
6541 | struct btrfs_trans_handle *trans; | 6519 | struct btrfs_trans_handle *trans; |
6542 | unsigned long nr; | 6520 | unsigned long nr; |
6543 | u64 mask = root->sectorsize - 1; | 6521 | u64 mask = root->sectorsize - 1; |
6522 | u64 min_size = btrfs_calc_trunc_metadata_size(root, 1); | ||
6544 | 6523 | ||
6545 | ret = btrfs_truncate_page(inode->i_mapping, inode->i_size); | 6524 | ret = btrfs_truncate_page(inode->i_mapping, inode->i_size); |
6546 | if (ret) | 6525 | if (ret) |
@@ -6588,19 +6567,23 @@ static int btrfs_truncate(struct inode *inode) | |||
6588 | rsv = btrfs_alloc_block_rsv(root); | 6567 | rsv = btrfs_alloc_block_rsv(root); |
6589 | if (!rsv) | 6568 | if (!rsv) |
6590 | return -ENOMEM; | 6569 | return -ENOMEM; |
6591 | btrfs_add_durable_block_rsv(root->fs_info, rsv); | 6570 | rsv->size = min_size; |
6592 | 6571 | ||
6572 | /* | ||
6573 | * 1 for the truncate slack space | ||
6574 | * 1 for the orphan item we're going to add | ||
6575 | * 1 for the orphan item deletion | ||
6576 | * 1 for updating the inode. | ||
6577 | */ | ||
6593 | trans = btrfs_start_transaction(root, 4); | 6578 | trans = btrfs_start_transaction(root, 4); |
6594 | if (IS_ERR(trans)) { | 6579 | if (IS_ERR(trans)) { |
6595 | err = PTR_ERR(trans); | 6580 | err = PTR_ERR(trans); |
6596 | goto out; | 6581 | goto out; |
6597 | } | 6582 | } |
6598 | 6583 | ||
6599 | /* | 6584 | /* Migrate the slack space for the truncate to our reserve */ |
6600 | * Reserve space for the truncate process. Truncate should be adding | 6585 | ret = btrfs_block_rsv_migrate(&root->fs_info->trans_block_rsv, rsv, |
6601 | * space, but if there are snapshots it may end up using space. | 6586 | min_size); |
6602 | */ | ||
6603 | ret = btrfs_truncate_reserve_metadata(trans, root, rsv); | ||
6604 | BUG_ON(ret); | 6587 | BUG_ON(ret); |
6605 | 6588 | ||
6606 | ret = btrfs_orphan_add(trans, inode); | 6589 | ret = btrfs_orphan_add(trans, inode); |
@@ -6609,21 +6592,6 @@ static int btrfs_truncate(struct inode *inode) | |||
6609 | goto out; | 6592 | goto out; |
6610 | } | 6593 | } |
6611 | 6594 | ||
6612 | nr = trans->blocks_used; | ||
6613 | btrfs_end_transaction(trans, root); | ||
6614 | btrfs_btree_balance_dirty(root, nr); | ||
6615 | |||
6616 | /* | ||
6617 | * Ok so we've already migrated our bytes over for the truncate, so here | ||
6618 | * just reserve the one slot we need for updating the inode. | ||
6619 | */ | ||
6620 | trans = btrfs_start_transaction(root, 1); | ||
6621 | if (IS_ERR(trans)) { | ||
6622 | err = PTR_ERR(trans); | ||
6623 | goto out; | ||
6624 | } | ||
6625 | trans->block_rsv = rsv; | ||
6626 | |||
6627 | /* | 6595 | /* |
6628 | * setattr is responsible for setting the ordered_data_close flag, | 6596 | * setattr is responsible for setting the ordered_data_close flag, |
6629 | * but that is only tested during the last file release. That | 6597 | * but that is only tested during the last file release. That |
@@ -6645,20 +6613,30 @@ static int btrfs_truncate(struct inode *inode) | |||
6645 | btrfs_add_ordered_operation(trans, root, inode); | 6613 | btrfs_add_ordered_operation(trans, root, inode); |
6646 | 6614 | ||
6647 | while (1) { | 6615 | while (1) { |
6616 | ret = btrfs_block_rsv_refill(root, rsv, min_size); | ||
6617 | if (ret) { | ||
6618 | /* | ||
6619 | * This can only happen with the original transaction we | ||
6620 | * started above, every other time we shouldn't have a | ||
6621 | * transaction started yet. | ||
6622 | */ | ||
6623 | if (ret == -EAGAIN) | ||
6624 | goto end_trans; | ||
6625 | err = ret; | ||
6626 | break; | ||
6627 | } | ||
6628 | |||
6648 | if (!trans) { | 6629 | if (!trans) { |
6649 | trans = btrfs_start_transaction(root, 3); | 6630 | /* Just need the 1 for updating the inode */ |
6631 | trans = btrfs_start_transaction(root, 1); | ||
6650 | if (IS_ERR(trans)) { | 6632 | if (IS_ERR(trans)) { |
6651 | err = PTR_ERR(trans); | 6633 | err = PTR_ERR(trans); |
6652 | goto out; | 6634 | goto out; |
6653 | } | 6635 | } |
6654 | |||
6655 | ret = btrfs_truncate_reserve_metadata(trans, root, | ||
6656 | rsv); | ||
6657 | BUG_ON(ret); | ||
6658 | |||
6659 | trans->block_rsv = rsv; | ||
6660 | } | 6636 | } |
6661 | 6637 | ||
6638 | trans->block_rsv = rsv; | ||
6639 | |||
6662 | ret = btrfs_truncate_inode_items(trans, root, inode, | 6640 | ret = btrfs_truncate_inode_items(trans, root, inode, |
6663 | inode->i_size, | 6641 | inode->i_size, |
6664 | BTRFS_EXTENT_DATA_KEY); | 6642 | BTRFS_EXTENT_DATA_KEY); |
@@ -6673,7 +6651,7 @@ static int btrfs_truncate(struct inode *inode) | |||
6673 | err = ret; | 6651 | err = ret; |
6674 | break; | 6652 | break; |
6675 | } | 6653 | } |
6676 | 6654 | end_trans: | |
6677 | nr = trans->blocks_used; | 6655 | nr = trans->blocks_used; |
6678 | btrfs_end_transaction(trans, root); | 6656 | btrfs_end_transaction(trans, root); |
6679 | trans = NULL; | 6657 | trans = NULL; |
@@ -6755,9 +6733,9 @@ struct inode *btrfs_alloc_inode(struct super_block *sb) | |||
6755 | ei->last_sub_trans = 0; | 6733 | ei->last_sub_trans = 0; |
6756 | ei->logged_trans = 0; | 6734 | ei->logged_trans = 0; |
6757 | ei->delalloc_bytes = 0; | 6735 | ei->delalloc_bytes = 0; |
6758 | ei->reserved_bytes = 0; | ||
6759 | ei->disk_i_size = 0; | 6736 | ei->disk_i_size = 0; |
6760 | ei->flags = 0; | 6737 | ei->flags = 0; |
6738 | ei->csum_bytes = 0; | ||
6761 | ei->index_cnt = (u64)-1; | 6739 | ei->index_cnt = (u64)-1; |
6762 | ei->last_unlink_trans = 0; | 6740 | ei->last_unlink_trans = 0; |
6763 | 6741 | ||
@@ -6803,6 +6781,8 @@ void btrfs_destroy_inode(struct inode *inode) | |||
6803 | WARN_ON(inode->i_data.nrpages); | 6781 | WARN_ON(inode->i_data.nrpages); |
6804 | WARN_ON(BTRFS_I(inode)->outstanding_extents); | 6782 | WARN_ON(BTRFS_I(inode)->outstanding_extents); |
6805 | WARN_ON(BTRFS_I(inode)->reserved_extents); | 6783 | WARN_ON(BTRFS_I(inode)->reserved_extents); |
6784 | WARN_ON(BTRFS_I(inode)->delalloc_bytes); | ||
6785 | WARN_ON(BTRFS_I(inode)->csum_bytes); | ||
6806 | 6786 | ||
6807 | /* | 6787 | /* |
6808 | * This can happen where we create an inode, but somebody else also | 6788 | * This can happen where we create an inode, but somebody else also |