Merge tag 'for-5.11/drivers-2020-12-14' of git://git.kernel.dk/linux-block
[linux-2.6-microblaze.git] / fs / btrfs / transaction.c
index 8f70d71..8e0f7a1 100644 (file)
@@ -16,7 +16,6 @@
 #include "transaction.h"
 #include "locking.h"
 #include "tree-log.h"
-#include "inode-map.h"
 #include "volumes.h"
 #include "dev-replace.h"
 #include "qgroup.h"
@@ -155,6 +154,7 @@ static noinline void switch_commit_roots(struct btrfs_trans_handle *trans)
        struct btrfs_transaction *cur_trans = trans->transaction;
        struct btrfs_fs_info *fs_info = trans->fs_info;
        struct btrfs_root *root, *tmp;
+       struct btrfs_caching_control *caching_ctl, *next;
 
        down_write(&fs_info->commit_root_sem);
        list_for_each_entry_safe(root, tmp, &cur_trans->switch_commits,
@@ -162,8 +162,6 @@ static noinline void switch_commit_roots(struct btrfs_trans_handle *trans)
                list_del_init(&root->dirty_list);
                free_extent_buffer(root->commit_root);
                root->commit_root = btrfs_root_node(root);
-               if (is_fstree(root->root_key.objectid))
-                       btrfs_unpin_free_ino(root);
                extent_io_tree_release(&root->dirty_log_pages);
                btrfs_qgroup_clean_swapped_blocks(root);
        }
@@ -180,6 +178,47 @@ static noinline void switch_commit_roots(struct btrfs_trans_handle *trans)
                spin_lock(&cur_trans->dropped_roots_lock);
        }
        spin_unlock(&cur_trans->dropped_roots_lock);
+
+       /*
+        * We have to update the last_byte_to_unpin under the commit_root_sem,
+        * at the same time we swap out the commit roots.
+        *
+        * This is because we must have a real view of the last spot the caching
+        * kthreads were while caching.  Consider the following views of the
+        * extent tree for a block group
+        *
+        * commit root
+        * +----+----+----+----+----+----+----+
+        * |\\\\|    |\\\\|\\\\|    |\\\\|\\\\|
+        * +----+----+----+----+----+----+----+
+        * 0    1    2    3    4    5    6    7
+        *
+        * new commit root
+        * +----+----+----+----+----+----+----+
+        * |    |    |    |\\\\|    |    |\\\\|
+        * +----+----+----+----+----+----+----+
+        * 0    1    2    3    4    5    6    7
+        *
+        * If the cache_ctl->progress was at 3, then we are only allowed to
+        * unpin [0,1) and [2,3], because the caching thread has already
+        * processed those extents.  We are not allowed to unpin [5,6), because
+        * the caching thread will re-start it's search from 3, and thus find
+        * the hole from [4,6) to add to the free space cache.
+        */
+       spin_lock(&fs_info->block_group_cache_lock);
+       list_for_each_entry_safe(caching_ctl, next,
+                                &fs_info->caching_block_groups, list) {
+               struct btrfs_block_group *cache = caching_ctl->block_group;
+
+               if (btrfs_block_group_done(cache)) {
+                       cache->last_byte_to_unpin = (u64)-1;
+                       list_del_init(&caching_ctl->list);
+                       btrfs_put_caching_control(caching_ctl);
+               } else {
+                       cache->last_byte_to_unpin = caching_ctl->progress;
+               }
+       }
+       spin_unlock(&fs_info->block_group_cache_lock);
        up_write(&fs_info->commit_root_sem);
 }
 
@@ -856,24 +895,24 @@ void btrfs_throttle(struct btrfs_fs_info *fs_info)
        wait_current_trans(fs_info);
 }
 
-static int should_end_transaction(struct btrfs_trans_handle *trans)
+static bool should_end_transaction(struct btrfs_trans_handle *trans)
 {
        struct btrfs_fs_info *fs_info = trans->fs_info;
 
        if (btrfs_check_space_for_delayed_refs(fs_info))
-               return 1;
+               return true;
 
        return !!btrfs_block_rsv_check(&fs_info->global_block_rsv, 5);
 }
 
-int btrfs_should_end_transaction(struct btrfs_trans_handle *trans)
+bool btrfs_should_end_transaction(struct btrfs_trans_handle *trans)
 {
        struct btrfs_transaction *cur_trans = trans->transaction;
 
        smp_mb();
        if (cur_trans->state >= TRANS_STATE_COMMIT_START ||
            cur_trans->delayed_refs.flushing)
-               return 1;
+               return true;
 
        return should_end_transaction(trans);
 }
@@ -1300,8 +1339,6 @@ static noinline int commit_fs_roots(struct btrfs_trans_handle *trans)
                        btrfs_free_log(trans, root);
                        btrfs_update_reloc_root(trans, root);
 
-                       btrfs_save_ino_cache(root, trans);
-
                        /* see comments in should_cow_block() */
                        clear_bit(BTRFS_ROOT_FORCE_COW, &root->state);
                        smp_mb__after_atomic();
@@ -1598,8 +1635,6 @@ static noinline int create_pending_snapshot(struct btrfs_trans_handle *trans,
                goto fail;
        }
 
-       btrfs_set_lock_blocking_write(old);
-
        ret = btrfs_copy_root(trans, root, old, &tmp, objectid);
        /* clean up in any case */
        btrfs_tree_unlock(old);
@@ -1681,7 +1716,7 @@ static noinline int create_pending_snapshot(struct btrfs_trans_handle *trans,
                                         dentry->d_name.len * 2);
        parent_inode->i_mtime = parent_inode->i_ctime =
                current_time(parent_inode);
-       ret = btrfs_update_inode_fallback(trans, parent_root, parent_inode);
+       ret = btrfs_update_inode_fallback(trans, parent_root, BTRFS_I(parent_inode));
        if (ret) {
                btrfs_abort_transaction(trans, ret);
                goto fail;
@@ -1761,6 +1796,8 @@ static void update_super_roots(struct btrfs_fs_info *fs_info)
        super->root_level = root_item->level;
        if (btrfs_test_opt(fs_info, SPACE_CACHE))
                super->cache_generation = root_item->generation;
+       else if (test_bit(BTRFS_FS_CLEANUP_SPACE_CACHE_V1, &fs_info->flags))
+               super->cache_generation = 0;
        if (test_bit(BTRFS_FS_UPDATE_UUID_TREE_GEN, &fs_info->flags))
                super->uuid_tree_generation = root_item->generation;
 }
@@ -2256,8 +2293,6 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans)
                goto unlock_tree_log;
        }
 
-       btrfs_prepare_extent_commit(fs_info);
-
        cur_trans = fs_info->running_transaction;
 
        btrfs_set_root_node(&fs_info->tree_root->root_item,
@@ -2398,10 +2433,6 @@ int btrfs_clean_one_deleted_snapshot(struct btrfs_root *root)
        btrfs_debug(fs_info, "cleaner removing %llu", root->root_key.objectid);
 
        btrfs_kill_all_delayed_nodes(root);
-       if (root->ino_cache_inode) {
-               iput(root->ino_cache_inode);
-               root->ino_cache_inode = NULL;
-       }
 
        if (btrfs_header_backref_rev(root->node) <
                        BTRFS_MIXED_BACKREF_REV)
@@ -2422,16 +2453,6 @@ void btrfs_apply_pending_changes(struct btrfs_fs_info *fs_info)
        if (!prev)
                return;
 
-       bit = 1 << BTRFS_PENDING_SET_INODE_MAP_CACHE;
-       if (prev & bit)
-               btrfs_set_opt(fs_info->mount_opt, INODE_MAP_CACHE);
-       prev &= ~bit;
-
-       bit = 1 << BTRFS_PENDING_CLEAR_INODE_MAP_CACHE;
-       if (prev & bit)
-               btrfs_clear_opt(fs_info->mount_opt, INODE_MAP_CACHE);
-       prev &= ~bit;
-
        bit = 1 << BTRFS_PENDING_COMMIT;
        if (prev & bit)
                btrfs_debug(fs_info, "pending commit done");