diff options
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r-- | fs/btrfs/inode.c | 300 |
1 files changed, 143 insertions, 157 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 9327f45434e8..9d0eaa57d4ee 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -393,7 +393,10 @@ again: | |||
393 | (BTRFS_I(inode)->flags & BTRFS_INODE_COMPRESS))) { | 393 | (BTRFS_I(inode)->flags & BTRFS_INODE_COMPRESS))) { |
394 | WARN_ON(pages); | 394 | WARN_ON(pages); |
395 | pages = kzalloc(sizeof(struct page *) * nr_pages, GFP_NOFS); | 395 | pages = kzalloc(sizeof(struct page *) * nr_pages, GFP_NOFS); |
396 | BUG_ON(!pages); | 396 | if (!pages) { |
397 | /* just bail out to the uncompressed code */ | ||
398 | goto cont; | ||
399 | } | ||
397 | 400 | ||
398 | if (BTRFS_I(inode)->force_compress) | 401 | if (BTRFS_I(inode)->force_compress) |
399 | compress_type = BTRFS_I(inode)->force_compress; | 402 | compress_type = BTRFS_I(inode)->force_compress; |
@@ -424,6 +427,7 @@ again: | |||
424 | will_compress = 1; | 427 | will_compress = 1; |
425 | } | 428 | } |
426 | } | 429 | } |
430 | cont: | ||
427 | if (start == 0) { | 431 | if (start == 0) { |
428 | trans = btrfs_join_transaction(root); | 432 | trans = btrfs_join_transaction(root); |
429 | BUG_ON(IS_ERR(trans)); | 433 | BUG_ON(IS_ERR(trans)); |
@@ -820,7 +824,7 @@ static noinline int cow_file_range(struct inode *inode, | |||
820 | } | 824 | } |
821 | 825 | ||
822 | BUG_ON(disk_num_bytes > | 826 | BUG_ON(disk_num_bytes > |
823 | btrfs_super_total_bytes(&root->fs_info->super_copy)); | 827 | btrfs_super_total_bytes(root->fs_info->super_copy)); |
824 | 828 | ||
825 | alloc_hint = get_extent_allocation_hint(inode, start, num_bytes); | 829 | alloc_hint = get_extent_allocation_hint(inode, start, num_bytes); |
826 | btrfs_drop_extent_cache(inode, start, start + num_bytes - 1, 0); | 830 | btrfs_drop_extent_cache(inode, start, start + num_bytes - 1, 0); |
@@ -1792,12 +1796,12 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
1792 | } | 1796 | } |
1793 | ret = 0; | 1797 | ret = 0; |
1794 | out: | 1798 | out: |
1795 | if (nolock) { | 1799 | 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); | 1800 | btrfs_delalloc_release_metadata(inode, ordered_extent->len); |
1800 | if (trans) | 1801 | if (trans) { |
1802 | if (nolock) | ||
1803 | btrfs_end_transaction_nolock(trans, root); | ||
1804 | else | ||
1801 | btrfs_end_transaction(trans, root); | 1805 | btrfs_end_transaction(trans, root); |
1802 | } | 1806 | } |
1803 | 1807 | ||
@@ -1931,89 +1935,6 @@ void btrfs_run_delayed_iputs(struct btrfs_root *root) | |||
1931 | up_read(&root->fs_info->cleanup_work_sem); | 1935 | up_read(&root->fs_info->cleanup_work_sem); |
1932 | } | 1936 | } |
1933 | 1937 | ||
1934 | /* | ||
1935 | * calculate extra metadata reservation when snapshotting a subvolume | ||
1936 | * contains orphan files. | ||
1937 | */ | ||
1938 | void btrfs_orphan_pre_snapshot(struct btrfs_trans_handle *trans, | ||
1939 | struct btrfs_pending_snapshot *pending, | ||
1940 | u64 *bytes_to_reserve) | ||
1941 | { | ||
1942 | struct btrfs_root *root; | ||
1943 | struct btrfs_block_rsv *block_rsv; | ||
1944 | u64 num_bytes; | ||
1945 | int index; | ||
1946 | |||
1947 | root = pending->root; | ||
1948 | if (!root->orphan_block_rsv || list_empty(&root->orphan_list)) | ||
1949 | return; | ||
1950 | |||
1951 | block_rsv = root->orphan_block_rsv; | ||
1952 | |||
1953 | /* orphan block reservation for the snapshot */ | ||
1954 | num_bytes = block_rsv->size; | ||
1955 | |||
1956 | /* | ||
1957 | * after the snapshot is created, COWing tree blocks may use more | ||
1958 | * space than it frees. So we should make sure there is enough | ||
1959 | * reserved space. | ||
1960 | */ | ||
1961 | index = trans->transid & 0x1; | ||
1962 | if (block_rsv->reserved + block_rsv->freed[index] < block_rsv->size) { | ||
1963 | num_bytes += block_rsv->size - | ||
1964 | (block_rsv->reserved + block_rsv->freed[index]); | ||
1965 | } | ||
1966 | |||
1967 | *bytes_to_reserve += num_bytes; | ||
1968 | } | ||
1969 | |||
1970 | void btrfs_orphan_post_snapshot(struct btrfs_trans_handle *trans, | ||
1971 | struct btrfs_pending_snapshot *pending) | ||
1972 | { | ||
1973 | struct btrfs_root *root = pending->root; | ||
1974 | struct btrfs_root *snap = pending->snap; | ||
1975 | struct btrfs_block_rsv *block_rsv; | ||
1976 | u64 num_bytes; | ||
1977 | int index; | ||
1978 | int ret; | ||
1979 | |||
1980 | if (!root->orphan_block_rsv || list_empty(&root->orphan_list)) | ||
1981 | return; | ||
1982 | |||
1983 | /* refill source subvolume's orphan block reservation */ | ||
1984 | block_rsv = root->orphan_block_rsv; | ||
1985 | index = trans->transid & 0x1; | ||
1986 | if (block_rsv->reserved + block_rsv->freed[index] < block_rsv->size) { | ||
1987 | num_bytes = block_rsv->size - | ||
1988 | (block_rsv->reserved + block_rsv->freed[index]); | ||
1989 | ret = btrfs_block_rsv_migrate(&pending->block_rsv, | ||
1990 | root->orphan_block_rsv, | ||
1991 | num_bytes); | ||
1992 | BUG_ON(ret); | ||
1993 | } | ||
1994 | |||
1995 | /* setup orphan block reservation for the snapshot */ | ||
1996 | block_rsv = btrfs_alloc_block_rsv(snap); | ||
1997 | BUG_ON(!block_rsv); | ||
1998 | |||
1999 | btrfs_add_durable_block_rsv(root->fs_info, block_rsv); | ||
2000 | snap->orphan_block_rsv = block_rsv; | ||
2001 | |||
2002 | num_bytes = root->orphan_block_rsv->size; | ||
2003 | ret = btrfs_block_rsv_migrate(&pending->block_rsv, | ||
2004 | block_rsv, num_bytes); | ||
2005 | BUG_ON(ret); | ||
2006 | |||
2007 | #if 0 | ||
2008 | /* insert orphan item for the snapshot */ | ||
2009 | WARN_ON(!root->orphan_item_inserted); | ||
2010 | ret = btrfs_insert_orphan_item(trans, root->fs_info->tree_root, | ||
2011 | snap->root_key.objectid); | ||
2012 | BUG_ON(ret); | ||
2013 | snap->orphan_item_inserted = 1; | ||
2014 | #endif | ||
2015 | } | ||
2016 | |||
2017 | enum btrfs_orphan_cleanup_state { | 1938 | enum btrfs_orphan_cleanup_state { |
2018 | ORPHAN_CLEANUP_STARTED = 1, | 1939 | ORPHAN_CLEANUP_STARTED = 1, |
2019 | ORPHAN_CLEANUP_DONE = 2, | 1940 | ORPHAN_CLEANUP_DONE = 2, |
@@ -2099,9 +2020,6 @@ int btrfs_orphan_add(struct btrfs_trans_handle *trans, struct inode *inode) | |||
2099 | } | 2020 | } |
2100 | spin_unlock(&root->orphan_lock); | 2021 | spin_unlock(&root->orphan_lock); |
2101 | 2022 | ||
2102 | if (block_rsv) | ||
2103 | btrfs_add_durable_block_rsv(root->fs_info, block_rsv); | ||
2104 | |||
2105 | /* grab metadata reservation from transaction handle */ | 2023 | /* grab metadata reservation from transaction handle */ |
2106 | if (reserve) { | 2024 | if (reserve) { |
2107 | ret = btrfs_orphan_reserve_metadata(trans, inode); | 2025 | ret = btrfs_orphan_reserve_metadata(trans, inode); |
@@ -2168,6 +2086,7 @@ int btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2168 | struct btrfs_key key, found_key; | 2086 | struct btrfs_key key, found_key; |
2169 | struct btrfs_trans_handle *trans; | 2087 | struct btrfs_trans_handle *trans; |
2170 | struct inode *inode; | 2088 | struct inode *inode; |
2089 | u64 last_objectid = 0; | ||
2171 | int ret = 0, nr_unlink = 0, nr_truncate = 0; | 2090 | int ret = 0, nr_unlink = 0, nr_truncate = 0; |
2172 | 2091 | ||
2173 | if (cmpxchg(&root->orphan_cleanup_state, 0, ORPHAN_CLEANUP_STARTED)) | 2092 | if (cmpxchg(&root->orphan_cleanup_state, 0, ORPHAN_CLEANUP_STARTED)) |
@@ -2219,41 +2138,49 @@ int btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2219 | * crossing root thing. we store the inode number in the | 2138 | * crossing root thing. we store the inode number in the |
2220 | * offset of the orphan item. | 2139 | * offset of the orphan item. |
2221 | */ | 2140 | */ |
2141 | |||
2142 | if (found_key.offset == last_objectid) { | ||
2143 | printk(KERN_ERR "btrfs: Error removing orphan entry, " | ||
2144 | "stopping orphan cleanup\n"); | ||
2145 | ret = -EINVAL; | ||
2146 | goto out; | ||
2147 | } | ||
2148 | |||
2149 | last_objectid = found_key.offset; | ||
2150 | |||
2222 | found_key.objectid = found_key.offset; | 2151 | found_key.objectid = found_key.offset; |
2223 | found_key.type = BTRFS_INODE_ITEM_KEY; | 2152 | found_key.type = BTRFS_INODE_ITEM_KEY; |
2224 | found_key.offset = 0; | 2153 | found_key.offset = 0; |
2225 | inode = btrfs_iget(root->fs_info->sb, &found_key, root, NULL); | 2154 | inode = btrfs_iget(root->fs_info->sb, &found_key, root, NULL); |
2226 | if (IS_ERR(inode)) { | 2155 | ret = PTR_RET(inode); |
2227 | ret = PTR_ERR(inode); | 2156 | if (ret && ret != -ESTALE) |
2228 | goto out; | 2157 | goto out; |
2229 | } | ||
2230 | 2158 | ||
2231 | /* | 2159 | /* |
2232 | * add this inode to the orphan list so btrfs_orphan_del does | 2160 | * Inode is already gone but the orphan item is still there, |
2233 | * the proper thing when we hit it | 2161 | * kill the orphan item. |
2234 | */ | ||
2235 | spin_lock(&root->orphan_lock); | ||
2236 | list_add(&BTRFS_I(inode)->i_orphan, &root->orphan_list); | ||
2237 | spin_unlock(&root->orphan_lock); | ||
2238 | |||
2239 | /* | ||
2240 | * if this is a bad inode, means we actually succeeded in | ||
2241 | * removing the inode, but not the orphan record, which means | ||
2242 | * we need to manually delete the orphan since iput will just | ||
2243 | * do a destroy_inode | ||
2244 | */ | 2162 | */ |
2245 | if (is_bad_inode(inode)) { | 2163 | if (ret == -ESTALE) { |
2246 | trans = btrfs_start_transaction(root, 0); | 2164 | trans = btrfs_start_transaction(root, 1); |
2247 | if (IS_ERR(trans)) { | 2165 | if (IS_ERR(trans)) { |
2248 | ret = PTR_ERR(trans); | 2166 | ret = PTR_ERR(trans); |
2249 | goto out; | 2167 | goto out; |
2250 | } | 2168 | } |
2251 | btrfs_orphan_del(trans, inode); | 2169 | ret = btrfs_del_orphan_item(trans, root, |
2170 | found_key.objectid); | ||
2171 | BUG_ON(ret); | ||
2252 | btrfs_end_transaction(trans, root); | 2172 | btrfs_end_transaction(trans, root); |
2253 | iput(inode); | ||
2254 | continue; | 2173 | continue; |
2255 | } | 2174 | } |
2256 | 2175 | ||
2176 | /* | ||
2177 | * add this inode to the orphan list so btrfs_orphan_del does | ||
2178 | * the proper thing when we hit it | ||
2179 | */ | ||
2180 | spin_lock(&root->orphan_lock); | ||
2181 | list_add(&BTRFS_I(inode)->i_orphan, &root->orphan_list); | ||
2182 | spin_unlock(&root->orphan_lock); | ||
2183 | |||
2257 | /* if we have links, this was a truncate, lets do that */ | 2184 | /* if we have links, this was a truncate, lets do that */ |
2258 | if (inode->i_nlink) { | 2185 | if (inode->i_nlink) { |
2259 | if (!S_ISREG(inode->i_mode)) { | 2186 | if (!S_ISREG(inode->i_mode)) { |
@@ -2687,7 +2614,16 @@ static struct btrfs_trans_handle *__unlink_start_trans(struct inode *dir, | |||
2687 | u64 ino = btrfs_ino(inode); | 2614 | u64 ino = btrfs_ino(inode); |
2688 | u64 dir_ino = btrfs_ino(dir); | 2615 | u64 dir_ino = btrfs_ino(dir); |
2689 | 2616 | ||
2690 | trans = btrfs_start_transaction(root, 10); | 2617 | /* |
2618 | * 1 for the possible orphan item | ||
2619 | * 1 for the dir item | ||
2620 | * 1 for the dir index | ||
2621 | * 1 for the inode ref | ||
2622 | * 1 for the inode ref in the tree log | ||
2623 | * 2 for the dir entries in the log | ||
2624 | * 1 for the inode | ||
2625 | */ | ||
2626 | trans = btrfs_start_transaction(root, 8); | ||
2691 | if (!IS_ERR(trans) || PTR_ERR(trans) != -ENOSPC) | 2627 | if (!IS_ERR(trans) || PTR_ERR(trans) != -ENOSPC) |
2692 | return trans; | 2628 | return trans; |
2693 | 2629 | ||
@@ -2710,7 +2646,8 @@ static struct btrfs_trans_handle *__unlink_start_trans(struct inode *dir, | |||
2710 | return ERR_PTR(-ENOMEM); | 2646 | return ERR_PTR(-ENOMEM); |
2711 | } | 2647 | } |
2712 | 2648 | ||
2713 | trans = btrfs_start_transaction(root, 0); | 2649 | /* 1 for the orphan item */ |
2650 | trans = btrfs_start_transaction(root, 1); | ||
2714 | if (IS_ERR(trans)) { | 2651 | if (IS_ERR(trans)) { |
2715 | btrfs_free_path(path); | 2652 | btrfs_free_path(path); |
2716 | root->fs_info->enospc_unlink = 0; | 2653 | root->fs_info->enospc_unlink = 0; |
@@ -2815,6 +2752,12 @@ static struct btrfs_trans_handle *__unlink_start_trans(struct inode *dir, | |||
2815 | err = 0; | 2752 | err = 0; |
2816 | out: | 2753 | out: |
2817 | btrfs_free_path(path); | 2754 | btrfs_free_path(path); |
2755 | /* Migrate the orphan reservation over */ | ||
2756 | if (!err) | ||
2757 | err = btrfs_block_rsv_migrate(trans->block_rsv, | ||
2758 | &root->fs_info->global_block_rsv, | ||
2759 | trans->bytes_reserved); | ||
2760 | |||
2818 | if (err) { | 2761 | if (err) { |
2819 | btrfs_end_transaction(trans, root); | 2762 | btrfs_end_transaction(trans, root); |
2820 | root->fs_info->enospc_unlink = 0; | 2763 | root->fs_info->enospc_unlink = 0; |
@@ -2829,6 +2772,9 @@ static void __unlink_end_trans(struct btrfs_trans_handle *trans, | |||
2829 | struct btrfs_root *root) | 2772 | struct btrfs_root *root) |
2830 | { | 2773 | { |
2831 | if (trans->block_rsv == &root->fs_info->global_block_rsv) { | 2774 | if (trans->block_rsv == &root->fs_info->global_block_rsv) { |
2775 | btrfs_block_rsv_release(root, trans->block_rsv, | ||
2776 | trans->bytes_reserved); | ||
2777 | trans->block_rsv = &root->fs_info->trans_block_rsv; | ||
2832 | BUG_ON(!root->fs_info->enospc_unlink); | 2778 | BUG_ON(!root->fs_info->enospc_unlink); |
2833 | root->fs_info->enospc_unlink = 0; | 2779 | root->fs_info->enospc_unlink = 0; |
2834 | } | 2780 | } |
@@ -3220,6 +3166,7 @@ static int btrfs_truncate_page(struct address_space *mapping, loff_t from) | |||
3220 | pgoff_t index = from >> PAGE_CACHE_SHIFT; | 3166 | pgoff_t index = from >> PAGE_CACHE_SHIFT; |
3221 | unsigned offset = from & (PAGE_CACHE_SIZE-1); | 3167 | unsigned offset = from & (PAGE_CACHE_SIZE-1); |
3222 | struct page *page; | 3168 | struct page *page; |
3169 | gfp_t mask = btrfs_alloc_write_mask(mapping); | ||
3223 | int ret = 0; | 3170 | int ret = 0; |
3224 | u64 page_start; | 3171 | u64 page_start; |
3225 | u64 page_end; | 3172 | u64 page_end; |
@@ -3232,7 +3179,7 @@ static int btrfs_truncate_page(struct address_space *mapping, loff_t from) | |||
3232 | 3179 | ||
3233 | ret = -ENOMEM; | 3180 | ret = -ENOMEM; |
3234 | again: | 3181 | again: |
3235 | page = find_or_create_page(mapping, index, GFP_NOFS); | 3182 | page = find_or_create_page(mapping, index, mask); |
3236 | if (!page) { | 3183 | if (!page) { |
3237 | btrfs_delalloc_release_space(inode, PAGE_CACHE_SIZE); | 3184 | btrfs_delalloc_release_space(inode, PAGE_CACHE_SIZE); |
3238 | goto out; | 3185 | goto out; |
@@ -3465,6 +3412,8 @@ void btrfs_evict_inode(struct inode *inode) | |||
3465 | { | 3412 | { |
3466 | struct btrfs_trans_handle *trans; | 3413 | struct btrfs_trans_handle *trans; |
3467 | struct btrfs_root *root = BTRFS_I(inode)->root; | 3414 | struct btrfs_root *root = BTRFS_I(inode)->root; |
3415 | struct btrfs_block_rsv *rsv, *global_rsv; | ||
3416 | u64 min_size = btrfs_calc_trunc_metadata_size(root, 1); | ||
3468 | unsigned long nr; | 3417 | unsigned long nr; |
3469 | int ret; | 3418 | int ret; |
3470 | 3419 | ||
@@ -3492,22 +3441,55 @@ void btrfs_evict_inode(struct inode *inode) | |||
3492 | goto no_delete; | 3441 | goto no_delete; |
3493 | } | 3442 | } |
3494 | 3443 | ||
3444 | rsv = btrfs_alloc_block_rsv(root); | ||
3445 | if (!rsv) { | ||
3446 | btrfs_orphan_del(NULL, inode); | ||
3447 | goto no_delete; | ||
3448 | } | ||
3449 | rsv->size = min_size; | ||
3450 | global_rsv = &root->fs_info->global_block_rsv; | ||
3451 | |||
3495 | btrfs_i_size_write(inode, 0); | 3452 | btrfs_i_size_write(inode, 0); |
3496 | 3453 | ||
3454 | /* | ||
3455 | * This is a bit simpler than btrfs_truncate since | ||
3456 | * | ||
3457 | * 1) We've already reserved our space for our orphan item in the | ||
3458 | * unlink. | ||
3459 | * 2) We're going to delete the inode item, so we don't need to update | ||
3460 | * it at all. | ||
3461 | * | ||
3462 | * So we just need to reserve some slack space in case we add bytes when | ||
3463 | * doing the truncate. | ||
3464 | */ | ||
3497 | while (1) { | 3465 | while (1) { |
3498 | trans = btrfs_join_transaction(root); | 3466 | ret = btrfs_block_rsv_refill(root, rsv, min_size); |
3499 | BUG_ON(IS_ERR(trans)); | 3467 | |
3500 | trans->block_rsv = root->orphan_block_rsv; | 3468 | /* |
3469 | * Try and steal from the global reserve since we will | ||
3470 | * likely not use this space anyway, we want to try as | ||
3471 | * hard as possible to get this to work. | ||
3472 | */ | ||
3473 | if (ret) | ||
3474 | ret = btrfs_block_rsv_migrate(global_rsv, rsv, min_size); | ||
3501 | 3475 | ||
3502 | ret = btrfs_block_rsv_check(trans, root, | ||
3503 | root->orphan_block_rsv, 0, 5); | ||
3504 | if (ret) { | 3476 | if (ret) { |
3505 | BUG_ON(ret != -EAGAIN); | 3477 | printk(KERN_WARNING "Could not get space for a " |
3506 | ret = btrfs_commit_transaction(trans, root); | 3478 | "delete, will truncate on mount %d\n", ret); |
3507 | BUG_ON(ret); | 3479 | btrfs_orphan_del(NULL, inode); |
3508 | continue; | 3480 | btrfs_free_block_rsv(root, rsv); |
3481 | goto no_delete; | ||
3482 | } | ||
3483 | |||
3484 | trans = btrfs_start_transaction(root, 0); | ||
3485 | if (IS_ERR(trans)) { | ||
3486 | btrfs_orphan_del(NULL, inode); | ||
3487 | btrfs_free_block_rsv(root, rsv); | ||
3488 | goto no_delete; | ||
3509 | } | 3489 | } |
3510 | 3490 | ||
3491 | trans->block_rsv = rsv; | ||
3492 | |||
3511 | ret = btrfs_truncate_inode_items(trans, root, inode, 0, 0); | 3493 | ret = btrfs_truncate_inode_items(trans, root, inode, 0, 0); |
3512 | if (ret != -EAGAIN) | 3494 | if (ret != -EAGAIN) |
3513 | break; | 3495 | break; |
@@ -3516,14 +3498,17 @@ void btrfs_evict_inode(struct inode *inode) | |||
3516 | btrfs_end_transaction(trans, root); | 3498 | btrfs_end_transaction(trans, root); |
3517 | trans = NULL; | 3499 | trans = NULL; |
3518 | btrfs_btree_balance_dirty(root, nr); | 3500 | btrfs_btree_balance_dirty(root, nr); |
3519 | |||
3520 | } | 3501 | } |
3521 | 3502 | ||
3503 | btrfs_free_block_rsv(root, rsv); | ||
3504 | |||
3522 | if (ret == 0) { | 3505 | if (ret == 0) { |
3506 | trans->block_rsv = root->orphan_block_rsv; | ||
3523 | ret = btrfs_orphan_del(trans, inode); | 3507 | ret = btrfs_orphan_del(trans, inode); |
3524 | BUG_ON(ret); | 3508 | BUG_ON(ret); |
3525 | } | 3509 | } |
3526 | 3510 | ||
3511 | trans->block_rsv = &root->fs_info->trans_block_rsv; | ||
3527 | if (!(root == root->fs_info->tree_root || | 3512 | if (!(root == root->fs_info->tree_root || |
3528 | root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID)) | 3513 | root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID)) |
3529 | btrfs_return_ino(root, btrfs_ino(inode)); | 3514 | btrfs_return_ino(root, btrfs_ino(inode)); |
@@ -5647,8 +5632,7 @@ again: | |||
5647 | if (test_bit(BTRFS_ORDERED_NOCOW, &ordered->flags)) { | 5632 | if (test_bit(BTRFS_ORDERED_NOCOW, &ordered->flags)) { |
5648 | ret = btrfs_ordered_update_i_size(inode, 0, ordered); | 5633 | ret = btrfs_ordered_update_i_size(inode, 0, ordered); |
5649 | if (!ret) | 5634 | if (!ret) |
5650 | ret = btrfs_update_inode(trans, root, inode); | 5635 | err = btrfs_update_inode(trans, root, inode); |
5651 | err = ret; | ||
5652 | goto out; | 5636 | goto out; |
5653 | } | 5637 | } |
5654 | 5638 | ||
@@ -6393,6 +6377,7 @@ static int btrfs_truncate(struct inode *inode) | |||
6393 | struct btrfs_trans_handle *trans; | 6377 | struct btrfs_trans_handle *trans; |
6394 | unsigned long nr; | 6378 | unsigned long nr; |
6395 | u64 mask = root->sectorsize - 1; | 6379 | u64 mask = root->sectorsize - 1; |
6380 | u64 min_size = btrfs_calc_trunc_metadata_size(root, 1); | ||
6396 | 6381 | ||
6397 | ret = btrfs_truncate_page(inode->i_mapping, inode->i_size); | 6382 | ret = btrfs_truncate_page(inode->i_mapping, inode->i_size); |
6398 | if (ret) | 6383 | if (ret) |
@@ -6440,19 +6425,23 @@ static int btrfs_truncate(struct inode *inode) | |||
6440 | rsv = btrfs_alloc_block_rsv(root); | 6425 | rsv = btrfs_alloc_block_rsv(root); |
6441 | if (!rsv) | 6426 | if (!rsv) |
6442 | return -ENOMEM; | 6427 | return -ENOMEM; |
6443 | btrfs_add_durable_block_rsv(root->fs_info, rsv); | 6428 | rsv->size = min_size; |
6444 | 6429 | ||
6430 | /* | ||
6431 | * 1 for the truncate slack space | ||
6432 | * 1 for the orphan item we're going to add | ||
6433 | * 1 for the orphan item deletion | ||
6434 | * 1 for updating the inode. | ||
6435 | */ | ||
6445 | trans = btrfs_start_transaction(root, 4); | 6436 | trans = btrfs_start_transaction(root, 4); |
6446 | if (IS_ERR(trans)) { | 6437 | if (IS_ERR(trans)) { |
6447 | err = PTR_ERR(trans); | 6438 | err = PTR_ERR(trans); |
6448 | goto out; | 6439 | goto out; |
6449 | } | 6440 | } |
6450 | 6441 | ||
6451 | /* | 6442 | /* Migrate the slack space for the truncate to our reserve */ |
6452 | * Reserve space for the truncate process. Truncate should be adding | 6443 | ret = btrfs_block_rsv_migrate(&root->fs_info->trans_block_rsv, rsv, |
6453 | * space, but if there are snapshots it may end up using space. | 6444 | min_size); |
6454 | */ | ||
6455 | ret = btrfs_truncate_reserve_metadata(trans, root, rsv); | ||
6456 | BUG_ON(ret); | 6445 | BUG_ON(ret); |
6457 | 6446 | ||
6458 | ret = btrfs_orphan_add(trans, inode); | 6447 | ret = btrfs_orphan_add(trans, inode); |
@@ -6461,21 +6450,6 @@ static int btrfs_truncate(struct inode *inode) | |||
6461 | goto out; | 6450 | goto out; |
6462 | } | 6451 | } |
6463 | 6452 | ||
6464 | nr = trans->blocks_used; | ||
6465 | btrfs_end_transaction(trans, root); | ||
6466 | btrfs_btree_balance_dirty(root, nr); | ||
6467 | |||
6468 | /* | ||
6469 | * Ok so we've already migrated our bytes over for the truncate, so here | ||
6470 | * just reserve the one slot we need for updating the inode. | ||
6471 | */ | ||
6472 | trans = btrfs_start_transaction(root, 1); | ||
6473 | if (IS_ERR(trans)) { | ||
6474 | err = PTR_ERR(trans); | ||
6475 | goto out; | ||
6476 | } | ||
6477 | trans->block_rsv = rsv; | ||
6478 | |||
6479 | /* | 6453 | /* |
6480 | * setattr is responsible for setting the ordered_data_close flag, | 6454 | * setattr is responsible for setting the ordered_data_close flag, |
6481 | * but that is only tested during the last file release. That | 6455 | * but that is only tested during the last file release. That |
@@ -6497,20 +6471,30 @@ static int btrfs_truncate(struct inode *inode) | |||
6497 | btrfs_add_ordered_operation(trans, root, inode); | 6471 | btrfs_add_ordered_operation(trans, root, inode); |
6498 | 6472 | ||
6499 | while (1) { | 6473 | while (1) { |
6474 | ret = btrfs_block_rsv_refill(root, rsv, min_size); | ||
6475 | if (ret) { | ||
6476 | /* | ||
6477 | * This can only happen with the original transaction we | ||
6478 | * started above, every other time we shouldn't have a | ||
6479 | * transaction started yet. | ||
6480 | */ | ||
6481 | if (ret == -EAGAIN) | ||
6482 | goto end_trans; | ||
6483 | err = ret; | ||
6484 | break; | ||
6485 | } | ||
6486 | |||
6500 | if (!trans) { | 6487 | if (!trans) { |
6501 | trans = btrfs_start_transaction(root, 3); | 6488 | /* Just need the 1 for updating the inode */ |
6489 | trans = btrfs_start_transaction(root, 1); | ||
6502 | if (IS_ERR(trans)) { | 6490 | if (IS_ERR(trans)) { |
6503 | err = PTR_ERR(trans); | 6491 | err = PTR_ERR(trans); |
6504 | goto out; | 6492 | goto out; |
6505 | } | 6493 | } |
6506 | |||
6507 | ret = btrfs_truncate_reserve_metadata(trans, root, | ||
6508 | rsv); | ||
6509 | BUG_ON(ret); | ||
6510 | |||
6511 | trans->block_rsv = rsv; | ||
6512 | } | 6494 | } |
6513 | 6495 | ||
6496 | trans->block_rsv = rsv; | ||
6497 | |||
6514 | ret = btrfs_truncate_inode_items(trans, root, inode, | 6498 | ret = btrfs_truncate_inode_items(trans, root, inode, |
6515 | inode->i_size, | 6499 | inode->i_size, |
6516 | BTRFS_EXTENT_DATA_KEY); | 6500 | BTRFS_EXTENT_DATA_KEY); |
@@ -6525,7 +6509,7 @@ static int btrfs_truncate(struct inode *inode) | |||
6525 | err = ret; | 6509 | err = ret; |
6526 | break; | 6510 | break; |
6527 | } | 6511 | } |
6528 | 6512 | end_trans: | |
6529 | nr = trans->blocks_used; | 6513 | nr = trans->blocks_used; |
6530 | btrfs_end_transaction(trans, root); | 6514 | btrfs_end_transaction(trans, root); |
6531 | trans = NULL; | 6515 | trans = NULL; |
@@ -6607,9 +6591,9 @@ struct inode *btrfs_alloc_inode(struct super_block *sb) | |||
6607 | ei->last_sub_trans = 0; | 6591 | ei->last_sub_trans = 0; |
6608 | ei->logged_trans = 0; | 6592 | ei->logged_trans = 0; |
6609 | ei->delalloc_bytes = 0; | 6593 | ei->delalloc_bytes = 0; |
6610 | ei->reserved_bytes = 0; | ||
6611 | ei->disk_i_size = 0; | 6594 | ei->disk_i_size = 0; |
6612 | ei->flags = 0; | 6595 | ei->flags = 0; |
6596 | ei->csum_bytes = 0; | ||
6613 | ei->index_cnt = (u64)-1; | 6597 | ei->index_cnt = (u64)-1; |
6614 | ei->last_unlink_trans = 0; | 6598 | ei->last_unlink_trans = 0; |
6615 | 6599 | ||
@@ -6655,6 +6639,8 @@ void btrfs_destroy_inode(struct inode *inode) | |||
6655 | WARN_ON(inode->i_data.nrpages); | 6639 | WARN_ON(inode->i_data.nrpages); |
6656 | WARN_ON(BTRFS_I(inode)->outstanding_extents); | 6640 | WARN_ON(BTRFS_I(inode)->outstanding_extents); |
6657 | WARN_ON(BTRFS_I(inode)->reserved_extents); | 6641 | WARN_ON(BTRFS_I(inode)->reserved_extents); |
6642 | WARN_ON(BTRFS_I(inode)->delalloc_bytes); | ||
6643 | WARN_ON(BTRFS_I(inode)->csum_bytes); | ||
6658 | 6644 | ||
6659 | /* | 6645 | /* |
6660 | * This can happen where we create an inode, but somebody else also | 6646 | * This can happen where we create an inode, but somebody else also |