Lines Matching refs:fs_info
43 static inline u64 btrfs_inc_tree_mod_seq(struct btrfs_fs_info *fs_info) in btrfs_inc_tree_mod_seq() argument
45 return atomic64_inc_return(&fs_info->tree_mod_seq); in btrfs_inc_tree_mod_seq()
56 u64 btrfs_get_tree_mod_seq(struct btrfs_fs_info *fs_info, in btrfs_get_tree_mod_seq() argument
59 write_lock(&fs_info->tree_mod_log_lock); in btrfs_get_tree_mod_seq()
61 elem->seq = btrfs_inc_tree_mod_seq(fs_info); in btrfs_get_tree_mod_seq()
62 list_add_tail(&elem->list, &fs_info->tree_mod_seq_list); in btrfs_get_tree_mod_seq()
63 set_bit(BTRFS_FS_TREE_MOD_LOG_USERS, &fs_info->flags); in btrfs_get_tree_mod_seq()
65 write_unlock(&fs_info->tree_mod_log_lock); in btrfs_get_tree_mod_seq()
70 void btrfs_put_tree_mod_seq(struct btrfs_fs_info *fs_info, in btrfs_put_tree_mod_seq() argument
83 write_lock(&fs_info->tree_mod_log_lock); in btrfs_put_tree_mod_seq()
87 if (list_empty(&fs_info->tree_mod_seq_list)) { in btrfs_put_tree_mod_seq()
88 clear_bit(BTRFS_FS_TREE_MOD_LOG_USERS, &fs_info->flags); in btrfs_put_tree_mod_seq()
92 first = list_first_entry(&fs_info->tree_mod_seq_list, in btrfs_put_tree_mod_seq()
99 write_unlock(&fs_info->tree_mod_log_lock); in btrfs_put_tree_mod_seq()
109 tm_root = &fs_info->tree_mod_log; in btrfs_put_tree_mod_seq()
118 write_unlock(&fs_info->tree_mod_log_lock); in btrfs_put_tree_mod_seq()
129 static noinline int tree_mod_log_insert(struct btrfs_fs_info *fs_info, in tree_mod_log_insert() argument
137 lockdep_assert_held_write(&fs_info->tree_mod_log_lock); in tree_mod_log_insert()
139 tm->seq = btrfs_inc_tree_mod_seq(fs_info); in tree_mod_log_insert()
141 tm_root = &fs_info->tree_mod_log; in tree_mod_log_insert()
169 static inline bool tree_mod_dont_log(struct btrfs_fs_info *fs_info, in tree_mod_dont_log() argument
172 if (!test_bit(BTRFS_FS_TREE_MOD_LOG_USERS, &fs_info->flags)) in tree_mod_dont_log()
177 write_lock(&fs_info->tree_mod_log_lock); in tree_mod_dont_log()
178 if (list_empty(&(fs_info)->tree_mod_seq_list)) { in tree_mod_dont_log()
179 write_unlock(&fs_info->tree_mod_log_lock); in tree_mod_dont_log()
187 static inline bool tree_mod_need_log(const struct btrfs_fs_info *fs_info, in tree_mod_need_log() argument
190 if (!test_bit(BTRFS_FS_TREE_MOD_LOG_USERS, &fs_info->flags)) in tree_mod_need_log()
228 if (!tree_mod_need_log(eb->fs_info, eb)) in btrfs_tree_mod_log_insert_key()
235 if (tree_mod_dont_log(eb->fs_info, eb)) { in btrfs_tree_mod_log_insert_key()
240 ret = tree_mod_log_insert(eb->fs_info, tm); in btrfs_tree_mod_log_insert_key()
241 write_unlock(&eb->fs_info->tree_mod_log_lock); in btrfs_tree_mod_log_insert_key()
258 if (!tree_mod_need_log(eb->fs_info, eb)) in btrfs_tree_mod_log_insert_move()
286 if (tree_mod_dont_log(eb->fs_info, eb)) in btrfs_tree_mod_log_insert_move()
296 ret = tree_mod_log_insert(eb->fs_info, tm_list[i]); in btrfs_tree_mod_log_insert_move()
301 ret = tree_mod_log_insert(eb->fs_info, tm); in btrfs_tree_mod_log_insert_move()
304 write_unlock(&eb->fs_info->tree_mod_log_lock); in btrfs_tree_mod_log_insert_move()
312 rb_erase(&tm_list[i]->node, &eb->fs_info->tree_mod_log); in btrfs_tree_mod_log_insert_move()
316 write_unlock(&eb->fs_info->tree_mod_log_lock); in btrfs_tree_mod_log_insert_move()
323 static inline int tree_mod_log_free_eb(struct btrfs_fs_info *fs_info, in tree_mod_log_free_eb() argument
331 ret = tree_mod_log_insert(fs_info, tm_list[i]); in tree_mod_log_free_eb()
335 &fs_info->tree_mod_log); in tree_mod_log_free_eb()
347 struct btrfs_fs_info *fs_info = old_root->fs_info; in btrfs_tree_mod_log_insert_root() local
354 if (!tree_mod_need_log(fs_info, NULL)) in btrfs_tree_mod_log_insert_root()
387 if (tree_mod_dont_log(fs_info, NULL)) in btrfs_tree_mod_log_insert_root()
391 ret = tree_mod_log_free_eb(fs_info, tm_list, nritems); in btrfs_tree_mod_log_insert_root()
393 ret = tree_mod_log_insert(fs_info, tm); in btrfs_tree_mod_log_insert_root()
395 write_unlock(&fs_info->tree_mod_log_lock); in btrfs_tree_mod_log_insert_root()
413 static struct tree_mod_elem *__tree_mod_log_search(struct btrfs_fs_info *fs_info, in __tree_mod_log_search() argument
422 read_lock(&fs_info->tree_mod_log_lock); in __tree_mod_log_search()
423 tm_root = &fs_info->tree_mod_log; in __tree_mod_log_search()
450 read_unlock(&fs_info->tree_mod_log_lock); in __tree_mod_log_search()
460 static struct tree_mod_elem *tree_mod_log_search_oldest(struct btrfs_fs_info *fs_info, in tree_mod_log_search_oldest() argument
463 return __tree_mod_log_search(fs_info, start, min_seq, true); in tree_mod_log_search_oldest()
471 static struct tree_mod_elem *tree_mod_log_search(struct btrfs_fs_info *fs_info, in tree_mod_log_search() argument
474 return __tree_mod_log_search(fs_info, start, min_seq, false); in tree_mod_log_search()
483 struct btrfs_fs_info *fs_info = dst->fs_info; in btrfs_tree_mod_log_eb_copy() local
490 if (!tree_mod_need_log(fs_info, NULL)) in btrfs_tree_mod_log_eb_copy()
519 if (tree_mod_dont_log(fs_info, NULL)) in btrfs_tree_mod_log_eb_copy()
524 ret = tree_mod_log_insert(fs_info, tm_list_rem[i]); in btrfs_tree_mod_log_eb_copy()
527 ret = tree_mod_log_insert(fs_info, tm_list_add[i]); in btrfs_tree_mod_log_eb_copy()
532 write_unlock(&fs_info->tree_mod_log_lock); in btrfs_tree_mod_log_eb_copy()
540 rb_erase(&tm_list[i]->node, &fs_info->tree_mod_log); in btrfs_tree_mod_log_eb_copy()
544 write_unlock(&fs_info->tree_mod_log_lock); in btrfs_tree_mod_log_eb_copy()
557 if (!tree_mod_need_log(eb->fs_info, eb)) in btrfs_tree_mod_log_free_eb()
574 if (tree_mod_dont_log(eb->fs_info, eb)) in btrfs_tree_mod_log_free_eb()
577 ret = tree_mod_log_free_eb(eb->fs_info, tm_list, nritems); in btrfs_tree_mod_log_free_eb()
578 write_unlock(&eb->fs_info->tree_mod_log_lock); in btrfs_tree_mod_log_free_eb()
615 tm = tree_mod_log_search_oldest(eb_root->fs_info, root_logical, in tree_mod_log_oldest_root()
653 static void tree_mod_log_rewind(struct btrfs_fs_info *fs_info, in tree_mod_log_rewind() argument
666 read_lock(&fs_info->tree_mod_log_lock); in tree_mod_log_rewind()
721 read_unlock(&fs_info->tree_mod_log_lock); in tree_mod_log_rewind()
732 struct extent_buffer *btrfs_tree_mod_log_rewind(struct btrfs_fs_info *fs_info, in btrfs_tree_mod_log_rewind() argument
746 tm = tree_mod_log_search(fs_info, eb->start, time_seq); in btrfs_tree_mod_log_rewind()
752 eb_rewin = alloc_dummy_extent_buffer(fs_info, eb->start); in btrfs_tree_mod_log_rewind()
778 tree_mod_log_rewind(fs_info, eb_rewin, time_seq, tm); in btrfs_tree_mod_log_rewind()
780 BTRFS_NODEPTRS_PER_BLOCK(fs_info)); in btrfs_tree_mod_log_rewind()
794 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_get_old_root() local
820 tm = tree_mod_log_search(fs_info, logical, time_seq); in btrfs_get_old_root()
824 old = read_tree_block(fs_info, logical, root->root_key.objectid, in btrfs_get_old_root()
829 btrfs_warn(fs_info, in btrfs_get_old_root()
847 tm2 = tree_mod_log_search(fs_info, logical, time_seq); in btrfs_get_old_root()
862 eb = alloc_dummy_extent_buffer(fs_info, logical); in btrfs_get_old_root()
882 tree_mod_log_rewind(fs_info, eb, time_seq, tm); in btrfs_get_old_root()
885 WARN_ON(btrfs_header_nritems(eb) > BTRFS_NODEPTRS_PER_BLOCK(fs_info)); in btrfs_get_old_root()
914 u64 btrfs_tree_mod_log_lowest_seq(struct btrfs_fs_info *fs_info) in btrfs_tree_mod_log_lowest_seq() argument
918 read_lock(&fs_info->tree_mod_log_lock); in btrfs_tree_mod_log_lowest_seq()
919 if (!list_empty(&fs_info->tree_mod_seq_list)) { in btrfs_tree_mod_log_lowest_seq()
922 elem = list_first_entry(&fs_info->tree_mod_seq_list, in btrfs_tree_mod_log_lowest_seq()
926 read_unlock(&fs_info->tree_mod_log_lock); in btrfs_tree_mod_log_lowest_seq()