aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorLi Zefan <lizf@cn.fujitsu.com>2011-04-19 22:33:24 -0400
committerLi Zefan <lizf@cn.fujitsu.com>2011-04-25 04:46:11 -0400
commit82d5902d9c681be37ffa9d70482907f9f0b7ec1f (patch)
treec9c99f0b60004ac14d09d277d3216667df09c32d /fs
parent33345d01522f8152f99dc84a3e7a1a45707f387f (diff)
Btrfs: Support reading/writing on disk free ino cache
This is similar to block group caching. We dedicate a special inode in fs tree to save free ino cache. At the very first time we create/delete a file after mount, the free ino cache will be loaded from disk into memory. When the fs tree is commited, the cache will be written back to disk. To keep compatibility, we check the root generation against the generation of the special inode when loading the cache, so the loading will fail if the btrfs filesystem was mounted in an older kernel before. Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/btrfs/ctree.h7
-rw-r--r--fs/btrfs/disk-io.c1
-rw-r--r--fs/btrfs/extent-tree.c3
-rw-r--r--fs/btrfs/free-space-cache.c97
-rw-r--r--fs/btrfs/free-space-cache.h11
-rw-r--r--fs/btrfs/inode-map.c87
-rw-r--r--fs/btrfs/inode-map.h2
-rw-r--r--fs/btrfs/inode.c45
-rw-r--r--fs/btrfs/transaction.c2
9 files changed, 236 insertions, 19 deletions
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
index c96a4e4c5566..b20082e27a9f 100644
--- a/fs/btrfs/ctree.h
+++ b/fs/btrfs/ctree.h
@@ -105,6 +105,12 @@ struct btrfs_ordered_sum;
105/* For storing free space cache */ 105/* For storing free space cache */
106#define BTRFS_FREE_SPACE_OBJECTID -11ULL 106#define BTRFS_FREE_SPACE_OBJECTID -11ULL
107 107
108/*
109 * The inode number assigned to the special inode for sotring
110 * free ino cache
111 */
112#define BTRFS_FREE_INO_OBJECTID -12ULL
113
108/* dummy objectid represents multiple objectids */ 114/* dummy objectid represents multiple objectids */
109#define BTRFS_MULTIPLE_OBJECTIDS -255ULL 115#define BTRFS_MULTIPLE_OBJECTIDS -255ULL
110 116
@@ -1110,6 +1116,7 @@ struct btrfs_root {
1110 wait_queue_head_t cache_wait; 1116 wait_queue_head_t cache_wait;
1111 struct btrfs_free_space_ctl *free_ino_pinned; 1117 struct btrfs_free_space_ctl *free_ino_pinned;
1112 u64 cache_progress; 1118 u64 cache_progress;
1119 struct inode *cache_inode;
1113 1120
1114 struct mutex log_mutex; 1121 struct mutex log_mutex;
1115 wait_queue_head_t log_writer_wait; 1122 wait_queue_head_t log_writer_wait;
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index d02683b1ee16..4f12c30a5470 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -2505,6 +2505,7 @@ int btrfs_free_fs_root(struct btrfs_fs_info *fs_info, struct btrfs_root *root)
2505 2505
2506static void free_fs_root(struct btrfs_root *root) 2506static void free_fs_root(struct btrfs_root *root)
2507{ 2507{
2508 iput(root->cache_inode);
2508 WARN_ON(!RB_EMPTY_ROOT(&root->inode_tree)); 2509 WARN_ON(!RB_EMPTY_ROOT(&root->inode_tree));
2509 if (root->anon_super.s_dev) { 2510 if (root->anon_super.s_dev) {
2510 down_write(&root->anon_super.s_umount); 2511 down_write(&root->anon_super.s_umount);
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index a0e818cb0401..95ce8da63b28 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -3145,7 +3145,8 @@ int btrfs_check_data_free_space(struct inode *inode, u64 bytes)
3145 /* make sure bytes are sectorsize aligned */ 3145 /* make sure bytes are sectorsize aligned */
3146 bytes = (bytes + root->sectorsize - 1) & ~((u64)root->sectorsize - 1); 3146 bytes = (bytes + root->sectorsize - 1) & ~((u64)root->sectorsize - 1);
3147 3147
3148 if (root == root->fs_info->tree_root) { 3148 if (root == root->fs_info->tree_root ||
3149 BTRFS_I(inode)->location.objectid == BTRFS_FREE_INO_OBJECTID) {
3149 alloc_chunk = 0; 3150 alloc_chunk = 0;
3150 committed = 1; 3151 committed = 1;
3151 } 3152 }
diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c
index fcbdcef6ca28..7d8b6b643403 100644
--- a/fs/btrfs/free-space-cache.c
+++ b/fs/btrfs/free-space-cache.c
@@ -209,7 +209,8 @@ int btrfs_truncate_free_space_cache(struct btrfs_root *root,
209 return ret; 209 return ret;
210 } 210 }
211 211
212 return btrfs_update_inode(trans, root, inode); 212 ret = btrfs_update_inode(trans, root, inode);
213 return ret;
213} 214}
214 215
215static int readahead_cache(struct inode *inode) 216static int readahead_cache(struct inode *inode)
@@ -525,6 +526,7 @@ out:
525 spin_lock(&block_group->lock); 526 spin_lock(&block_group->lock);
526 block_group->disk_cache_state = BTRFS_DC_CLEAR; 527 block_group->disk_cache_state = BTRFS_DC_CLEAR;
527 spin_unlock(&block_group->lock); 528 spin_unlock(&block_group->lock);
529 ret = 0;
528 530
529 printk(KERN_ERR "btrfs: failed to load free space cache " 531 printk(KERN_ERR "btrfs: failed to load free space cache "
530 "for block group %llu\n", block_group->key.objectid); 532 "for block group %llu\n", block_group->key.objectid);
@@ -893,6 +895,7 @@ int btrfs_write_out_cache(struct btrfs_root *root,
893 spin_lock(&block_group->lock); 895 spin_lock(&block_group->lock);
894 block_group->disk_cache_state = BTRFS_DC_ERROR; 896 block_group->disk_cache_state = BTRFS_DC_ERROR;
895 spin_unlock(&block_group->lock); 897 spin_unlock(&block_group->lock);
898 ret = 0;
896 899
897 printk(KERN_ERR "btrfs: failed to write free space cace " 900 printk(KERN_ERR "btrfs: failed to write free space cace "
898 "for block group %llu\n", block_group->key.objectid); 901 "for block group %llu\n", block_group->key.objectid);
@@ -2458,3 +2461,95 @@ out:
2458 2461
2459 return ino; 2462 return ino;
2460} 2463}
2464
2465struct inode *lookup_free_ino_inode(struct btrfs_root *root,
2466 struct btrfs_path *path)
2467{
2468 struct inode *inode = NULL;
2469
2470 spin_lock(&root->cache_lock);
2471 if (root->cache_inode)
2472 inode = igrab(root->cache_inode);
2473 spin_unlock(&root->cache_lock);
2474 if (inode)
2475 return inode;
2476
2477 inode = __lookup_free_space_inode(root, path, 0);
2478 if (IS_ERR(inode))
2479 return inode;
2480
2481 spin_lock(&root->cache_lock);
2482 if (!root->fs_info->closing)
2483 root->cache_inode = igrab(inode);
2484 spin_unlock(&root->cache_lock);
2485
2486 return inode;
2487}
2488
2489int create_free_ino_inode(struct btrfs_root *root,
2490 struct btrfs_trans_handle *trans,
2491 struct btrfs_path *path)
2492{
2493 return __create_free_space_inode(root, trans, path,
2494 BTRFS_FREE_INO_OBJECTID, 0);
2495}
2496
2497int load_free_ino_cache(struct btrfs_fs_info *fs_info, struct btrfs_root *root)
2498{
2499 struct btrfs_free_space_ctl *ctl = root->free_ino_ctl;
2500 struct btrfs_path *path;
2501 struct inode *inode;
2502 int ret = 0;
2503 u64 root_gen = btrfs_root_generation(&root->root_item);
2504
2505 /*
2506 * If we're unmounting then just return, since this does a search on the
2507 * normal root and not the commit root and we could deadlock.
2508 */
2509 smp_mb();
2510 if (fs_info->closing)
2511 return 0;
2512
2513 path = btrfs_alloc_path();
2514 if (!path)
2515 return 0;
2516
2517 inode = lookup_free_ino_inode(root, path);
2518 if (IS_ERR(inode))
2519 goto out;
2520
2521 if (root_gen != BTRFS_I(inode)->generation)
2522 goto out_put;
2523
2524 ret = __load_free_space_cache(root, inode, ctl, path, 0);
2525
2526 if (ret < 0)
2527 printk(KERN_ERR "btrfs: failed to load free ino cache for "
2528 "root %llu\n", root->root_key.objectid);
2529out_put:
2530 iput(inode);
2531out:
2532 btrfs_free_path(path);
2533 return ret;
2534}
2535
2536int btrfs_write_out_ino_cache(struct btrfs_root *root,
2537 struct btrfs_trans_handle *trans,
2538 struct btrfs_path *path)
2539{
2540 struct btrfs_free_space_ctl *ctl = root->free_ino_ctl;
2541 struct inode *inode;
2542 int ret;
2543
2544 inode = lookup_free_ino_inode(root, path);
2545 if (IS_ERR(inode))
2546 return 0;
2547
2548 ret = __btrfs_write_out_cache(root, inode, ctl, NULL, trans, path, 0);
2549 if (ret < 0)
2550 printk(KERN_ERR "btrfs: failed to write free ino cache "
2551 "for root %llu\n", root->root_key.objectid);
2552
2553 iput(inode);
2554 return ret;
2555}
diff --git a/fs/btrfs/free-space-cache.h b/fs/btrfs/free-space-cache.h
index af06e6b6ceaa..8f2613f779ed 100644
--- a/fs/btrfs/free-space-cache.h
+++ b/fs/btrfs/free-space-cache.h
@@ -65,6 +65,17 @@ int btrfs_write_out_cache(struct btrfs_root *root,
65 struct btrfs_block_group_cache *block_group, 65 struct btrfs_block_group_cache *block_group,
66 struct btrfs_path *path); 66 struct btrfs_path *path);
67 67
68struct inode *lookup_free_ino_inode(struct btrfs_root *root,
69 struct btrfs_path *path);
70int create_free_ino_inode(struct btrfs_root *root,
71 struct btrfs_trans_handle *trans,
72 struct btrfs_path *path);
73int load_free_ino_cache(struct btrfs_fs_info *fs_info,
74 struct btrfs_root *root);
75int btrfs_write_out_ino_cache(struct btrfs_root *root,
76 struct btrfs_trans_handle *trans,
77 struct btrfs_path *path);
78
68void btrfs_init_free_space_ctl(struct btrfs_block_group_cache *block_group); 79void btrfs_init_free_space_ctl(struct btrfs_block_group_cache *block_group);
69int __btrfs_add_free_space(struct btrfs_free_space_ctl *ctl, 80int __btrfs_add_free_space(struct btrfs_free_space_ctl *ctl,
70 u64 bytenr, u64 size); 81 u64 bytenr, u64 size);
diff --git a/fs/btrfs/inode-map.c b/fs/btrfs/inode-map.c
index 5be62df90c4f..7967e85c72f5 100644
--- a/fs/btrfs/inode-map.c
+++ b/fs/btrfs/inode-map.c
@@ -137,6 +137,7 @@ out:
137static void start_caching(struct btrfs_root *root) 137static void start_caching(struct btrfs_root *root)
138{ 138{
139 struct task_struct *tsk; 139 struct task_struct *tsk;
140 int ret;
140 141
141 spin_lock(&root->cache_lock); 142 spin_lock(&root->cache_lock);
142 if (root->cached != BTRFS_CACHE_NO) { 143 if (root->cached != BTRFS_CACHE_NO) {
@@ -147,6 +148,14 @@ static void start_caching(struct btrfs_root *root)
147 root->cached = BTRFS_CACHE_STARTED; 148 root->cached = BTRFS_CACHE_STARTED;
148 spin_unlock(&root->cache_lock); 149 spin_unlock(&root->cache_lock);
149 150
151 ret = load_free_ino_cache(root->fs_info, root);
152 if (ret == 1) {
153 spin_lock(&root->cache_lock);
154 root->cached = BTRFS_CACHE_FINISHED;
155 spin_unlock(&root->cache_lock);
156 return;
157 }
158
150 tsk = kthread_run(caching_kthread, root, "btrfs-ino-cache-%llu\n", 159 tsk = kthread_run(caching_kthread, root, "btrfs-ino-cache-%llu\n",
151 root->root_key.objectid); 160 root->root_key.objectid);
152 BUG_ON(IS_ERR(tsk)); 161 BUG_ON(IS_ERR(tsk));
@@ -352,6 +361,84 @@ void btrfs_init_free_ino_ctl(struct btrfs_root *root)
352 pinned->op = &pinned_free_ino_op; 361 pinned->op = &pinned_free_ino_op;
353} 362}
354 363
364int btrfs_save_ino_cache(struct btrfs_root *root,
365 struct btrfs_trans_handle *trans)
366{
367 struct btrfs_free_space_ctl *ctl = root->free_ino_ctl;
368 struct btrfs_path *path;
369 struct inode *inode;
370 u64 alloc_hint = 0;
371 int ret;
372 int prealloc;
373 bool retry = false;
374
375 path = btrfs_alloc_path();
376 if (!path)
377 return -ENOMEM;
378again:
379 inode = lookup_free_ino_inode(root, path);
380 if (IS_ERR(inode) && PTR_ERR(inode) != -ENOENT) {
381 ret = PTR_ERR(inode);
382 goto out;
383 }
384
385 if (IS_ERR(inode)) {
386 BUG_ON(retry);
387 retry = true;
388
389 ret = create_free_ino_inode(root, trans, path);
390 if (ret)
391 goto out;
392 goto again;
393 }
394
395 BTRFS_I(inode)->generation = 0;
396 ret = btrfs_update_inode(trans, root, inode);
397 WARN_ON(ret);
398
399 if (i_size_read(inode) > 0) {
400 ret = btrfs_truncate_free_space_cache(root, trans, path, inode);
401 if (ret)
402 goto out_put;
403 }
404
405 spin_lock(&root->cache_lock);
406 if (root->cached != BTRFS_CACHE_FINISHED) {
407 ret = -1;
408 spin_unlock(&root->cache_lock);
409 goto out_put;
410 }
411 spin_unlock(&root->cache_lock);
412
413 spin_lock(&ctl->tree_lock);
414 prealloc = sizeof(struct btrfs_free_space) * ctl->free_extents;
415 prealloc = ALIGN(prealloc, PAGE_CACHE_SIZE);
416 prealloc += ctl->total_bitmaps * PAGE_CACHE_SIZE;
417 spin_unlock(&ctl->tree_lock);
418
419 /* Just to make sure we have enough space */
420 prealloc += 8 * PAGE_CACHE_SIZE;
421
422 ret = btrfs_check_data_free_space(inode, prealloc);
423 if (ret)
424 goto out_put;
425
426 ret = btrfs_prealloc_file_range_trans(inode, trans, 0, 0, prealloc,
427 prealloc, prealloc, &alloc_hint);
428 if (ret)
429 goto out_put;
430 btrfs_free_reserved_data_space(inode, prealloc);
431
432out_put:
433 iput(inode);
434out:
435 if (ret == 0)
436 ret = btrfs_write_out_ino_cache(root, trans, path);
437
438 btrfs_free_path(path);
439 return ret;
440}
441
355static int btrfs_find_highest_objectid(struct btrfs_root *root, u64 *objectid) 442static int btrfs_find_highest_objectid(struct btrfs_root *root, u64 *objectid)
356{ 443{
357 struct btrfs_path *path; 444 struct btrfs_path *path;
diff --git a/fs/btrfs/inode-map.h b/fs/btrfs/inode-map.h
index eb918451b492..ddb347bfee23 100644
--- a/fs/btrfs/inode-map.h
+++ b/fs/btrfs/inode-map.h
@@ -5,6 +5,8 @@ void btrfs_init_free_ino_ctl(struct btrfs_root *root);
5void btrfs_unpin_free_ino(struct btrfs_root *root); 5void btrfs_unpin_free_ino(struct btrfs_root *root);
6void btrfs_return_ino(struct btrfs_root *root, u64 objectid); 6void btrfs_return_ino(struct btrfs_root *root, u64 objectid);
7int btrfs_find_free_ino(struct btrfs_root *root, u64 *objectid); 7int btrfs_find_free_ino(struct btrfs_root *root, u64 *objectid);
8int btrfs_save_ino_cache(struct btrfs_root *root,
9 struct btrfs_trans_handle *trans);
8 10
9int btrfs_find_free_objectid(struct btrfs_root *root, u64 *objectid); 11int btrfs_find_free_objectid(struct btrfs_root *root, u64 *objectid);
10 12
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index adec22884a3e..b78d3ab789ca 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -745,6 +745,15 @@ static u64 get_extent_allocation_hint(struct inode *inode, u64 start,
745 return alloc_hint; 745 return alloc_hint;
746} 746}
747 747
748static inline bool is_free_space_inode(struct btrfs_root *root,
749 struct inode *inode)
750{
751 if (root == root->fs_info->tree_root ||
752 BTRFS_I(inode)->location.objectid == BTRFS_FREE_INO_OBJECTID)
753 return true;
754 return false;
755}
756
748/* 757/*
749 * when extent_io.c finds a delayed allocation range in the file, 758 * when extent_io.c finds a delayed allocation range in the file,
750 * the call backs end up in this code. The basic idea is to 759 * the call backs end up in this code. The basic idea is to
@@ -777,7 +786,7 @@ static noinline int cow_file_range(struct inode *inode,
777 struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; 786 struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree;
778 int ret = 0; 787 int ret = 0;
779 788
780 BUG_ON(root == root->fs_info->tree_root); 789 BUG_ON(is_free_space_inode(root, inode));
781 trans = btrfs_join_transaction(root, 1); 790 trans = btrfs_join_transaction(root, 1);
782 BUG_ON(IS_ERR(trans)); 791 BUG_ON(IS_ERR(trans));
783 btrfs_set_trans_block_group(trans, inode); 792 btrfs_set_trans_block_group(trans, inode);
@@ -1048,17 +1057,18 @@ static noinline int run_delalloc_nocow(struct inode *inode,
1048 int type; 1057 int type;
1049 int nocow; 1058 int nocow;
1050 int check_prev = 1; 1059 int check_prev = 1;
1051 bool nolock = false; 1060 bool nolock;
1052 u64 ino = btrfs_ino(inode); 1061 u64 ino = btrfs_ino(inode);
1053 1062
1054 path = btrfs_alloc_path(); 1063 path = btrfs_alloc_path();
1055 BUG_ON(!path); 1064 BUG_ON(!path);
1056 if (root == root->fs_info->tree_root) { 1065
1057 nolock = true; 1066 nolock = is_free_space_inode(root, inode);
1067
1068 if (nolock)
1058 trans = btrfs_join_transaction_nolock(root, 1); 1069 trans = btrfs_join_transaction_nolock(root, 1);
1059 } else { 1070 else
1060 trans = btrfs_join_transaction(root, 1); 1071 trans = btrfs_join_transaction(root, 1);
1061 }
1062 BUG_ON(IS_ERR(trans)); 1072 BUG_ON(IS_ERR(trans));
1063 1073
1064 cow_start = (u64)-1; 1074 cow_start = (u64)-1;
@@ -1316,8 +1326,7 @@ static int btrfs_set_bit_hook(struct inode *inode,
1316 if (!(state->state & EXTENT_DELALLOC) && (*bits & EXTENT_DELALLOC)) { 1326 if (!(state->state & EXTENT_DELALLOC) && (*bits & EXTENT_DELALLOC)) {
1317 struct btrfs_root *root = BTRFS_I(inode)->root; 1327 struct btrfs_root *root = BTRFS_I(inode)->root;
1318 u64 len = state->end + 1 - state->start; 1328 u64 len = state->end + 1 - state->start;
1319 int do_list = (root->root_key.objectid != 1329 bool do_list = !is_free_space_inode(root, inode);
1320 BTRFS_ROOT_TREE_OBJECTID);
1321 1330
1322 if (*bits & EXTENT_FIRST_DELALLOC) 1331 if (*bits & EXTENT_FIRST_DELALLOC)
1323 *bits &= ~EXTENT_FIRST_DELALLOC; 1332 *bits &= ~EXTENT_FIRST_DELALLOC;
@@ -1350,8 +1359,7 @@ static int btrfs_clear_bit_hook(struct inode *inode,
1350 if ((state->state & EXTENT_DELALLOC) && (*bits & EXTENT_DELALLOC)) { 1359 if ((state->state & EXTENT_DELALLOC) && (*bits & EXTENT_DELALLOC)) {
1351 struct btrfs_root *root = BTRFS_I(inode)->root; 1360 struct btrfs_root *root = BTRFS_I(inode)->root;
1352 u64 len = state->end + 1 - state->start; 1361 u64 len = state->end + 1 - state->start;
1353 int do_list = (root->root_key.objectid != 1362 bool do_list = !is_free_space_inode(root, inode);
1354 BTRFS_ROOT_TREE_OBJECTID);
1355 1363
1356 if (*bits & EXTENT_FIRST_DELALLOC) 1364 if (*bits & EXTENT_FIRST_DELALLOC)
1357 *bits &= ~EXTENT_FIRST_DELALLOC; 1365 *bits &= ~EXTENT_FIRST_DELALLOC;
@@ -1458,7 +1466,7 @@ static int btrfs_submit_bio_hook(struct inode *inode, int rw, struct bio *bio,
1458 1466
1459 skip_sum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM; 1467 skip_sum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM;
1460 1468
1461 if (root == root->fs_info->tree_root) 1469 if (is_free_space_inode(root, inode))
1462 ret = btrfs_bio_wq_end_io(root->fs_info, bio, 2); 1470 ret = btrfs_bio_wq_end_io(root->fs_info, bio, 2);
1463 else 1471 else
1464 ret = btrfs_bio_wq_end_io(root->fs_info, bio, 0); 1472 ret = btrfs_bio_wq_end_io(root->fs_info, bio, 0);
@@ -1701,7 +1709,7 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end)
1701 struct extent_state *cached_state = NULL; 1709 struct extent_state *cached_state = NULL;
1702 int compress_type = 0; 1710 int compress_type = 0;
1703 int ret; 1711 int ret;
1704 bool nolock = false; 1712 bool nolock;
1705 1713
1706 ret = btrfs_dec_test_ordered_pending(inode, &ordered_extent, start, 1714 ret = btrfs_dec_test_ordered_pending(inode, &ordered_extent, start,
1707 end - start + 1); 1715 end - start + 1);
@@ -1709,7 +1717,7 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end)
1709 return 0; 1717 return 0;
1710 BUG_ON(!ordered_extent); 1718 BUG_ON(!ordered_extent);
1711 1719
1712 nolock = (root == root->fs_info->tree_root); 1720 nolock = is_free_space_inode(root, inode);
1713 1721
1714 if (test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags)) { 1722 if (test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags)) {
1715 BUG_ON(!list_empty(&ordered_extent->list)); 1723 BUG_ON(!list_empty(&ordered_extent->list));
@@ -3473,7 +3481,9 @@ delete:
3473 3481
3474 if (path->slots[0] == 0 || 3482 if (path->slots[0] == 0 ||
3475 path->slots[0] != pending_del_slot) { 3483 path->slots[0] != pending_del_slot) {
3476 if (root->ref_cows) { 3484 if (root->ref_cows &&
3485 BTRFS_I(inode)->location.objectid !=
3486 BTRFS_FREE_INO_OBJECTID) {
3477 err = -EAGAIN; 3487 err = -EAGAIN;
3478 goto out; 3488 goto out;
3479 } 3489 }
@@ -3765,7 +3775,7 @@ void btrfs_evict_inode(struct inode *inode)
3765 3775
3766 truncate_inode_pages(&inode->i_data, 0); 3776 truncate_inode_pages(&inode->i_data, 0);
3767 if (inode->i_nlink && (btrfs_root_refs(&root->root_item) != 0 || 3777 if (inode->i_nlink && (btrfs_root_refs(&root->root_item) != 0 ||
3768 root == root->fs_info->tree_root)) 3778 is_free_space_inode(root, inode)))
3769 goto no_delete; 3779 goto no_delete;
3770 3780
3771 if (is_bad_inode(inode)) { 3781 if (is_bad_inode(inode)) {
@@ -4382,7 +4392,8 @@ int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc)
4382 return 0; 4392 return 0;
4383 4393
4384 smp_mb(); 4394 smp_mb();
4385 nolock = (root->fs_info->closing && root == root->fs_info->tree_root); 4395 if (root->fs_info->closing && is_free_space_inode(root, inode))
4396 nolock = true;
4386 4397
4387 if (wbc->sync_mode == WB_SYNC_ALL) { 4398 if (wbc->sync_mode == WB_SYNC_ALL) {
4388 if (nolock) 4399 if (nolock)
@@ -6900,7 +6911,7 @@ int btrfs_drop_inode(struct inode *inode)
6900 struct btrfs_root *root = BTRFS_I(inode)->root; 6911 struct btrfs_root *root = BTRFS_I(inode)->root;
6901 6912
6902 if (btrfs_root_refs(&root->root_item) == 0 && 6913 if (btrfs_root_refs(&root->root_item) == 0 &&
6903 root != root->fs_info->tree_root) 6914 !is_free_space_inode(root, inode))
6904 return 1; 6915 return 1;
6905 else 6916 else
6906 return generic_drop_inode(inode); 6917 return generic_drop_inode(inode);
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c
index f4c1184b7f1a..4d1dbcbbaf41 100644
--- a/fs/btrfs/transaction.c
+++ b/fs/btrfs/transaction.c
@@ -761,6 +761,8 @@ static noinline int commit_fs_roots(struct btrfs_trans_handle *trans,
761 btrfs_update_reloc_root(trans, root); 761 btrfs_update_reloc_root(trans, root);
762 btrfs_orphan_commit_root(trans, root); 762 btrfs_orphan_commit_root(trans, root);
763 763
764 btrfs_save_ino_cache(root, trans);
765
764 if (root->commit_root != root->node) { 766 if (root->commit_root != root->node) {
765 mutex_lock(&root->fs_commit_mutex); 767 mutex_lock(&root->fs_commit_mutex);
766 switch_commit_root(root); 768 switch_commit_root(root);