Lines Matching refs:fs_info
47 static inline u64 btrfs_inc_tree_mod_seq(struct btrfs_fs_info *fs_info) in btrfs_inc_tree_mod_seq() argument
49 return atomic64_inc_return(&fs_info->tree_mod_seq); in btrfs_inc_tree_mod_seq()
60 u64 btrfs_get_tree_mod_seq(struct btrfs_fs_info *fs_info, in btrfs_get_tree_mod_seq() argument
63 write_lock(&fs_info->tree_mod_log_lock); in btrfs_get_tree_mod_seq()
65 elem->seq = btrfs_inc_tree_mod_seq(fs_info); in btrfs_get_tree_mod_seq()
66 list_add_tail(&elem->list, &fs_info->tree_mod_seq_list); in btrfs_get_tree_mod_seq()
67 set_bit(BTRFS_FS_TREE_MOD_LOG_USERS, &fs_info->flags); in btrfs_get_tree_mod_seq()
69 write_unlock(&fs_info->tree_mod_log_lock); in btrfs_get_tree_mod_seq()
74 void btrfs_put_tree_mod_seq(struct btrfs_fs_info *fs_info, in btrfs_put_tree_mod_seq() argument
87 write_lock(&fs_info->tree_mod_log_lock); in btrfs_put_tree_mod_seq()
91 if (list_empty(&fs_info->tree_mod_seq_list)) { in btrfs_put_tree_mod_seq()
92 clear_bit(BTRFS_FS_TREE_MOD_LOG_USERS, &fs_info->flags); in btrfs_put_tree_mod_seq()
96 first = list_first_entry(&fs_info->tree_mod_seq_list, in btrfs_put_tree_mod_seq()
103 write_unlock(&fs_info->tree_mod_log_lock); in btrfs_put_tree_mod_seq()
113 tm_root = &fs_info->tree_mod_log; in btrfs_put_tree_mod_seq()
122 write_unlock(&fs_info->tree_mod_log_lock); in btrfs_put_tree_mod_seq()
133 static noinline int tree_mod_log_insert(struct btrfs_fs_info *fs_info, in tree_mod_log_insert() argument
141 lockdep_assert_held_write(&fs_info->tree_mod_log_lock); in tree_mod_log_insert()
143 tm->seq = btrfs_inc_tree_mod_seq(fs_info); in tree_mod_log_insert()
145 tm_root = &fs_info->tree_mod_log; in tree_mod_log_insert()
173 static inline bool tree_mod_dont_log(struct btrfs_fs_info *fs_info, in tree_mod_dont_log() argument
176 if (!test_bit(BTRFS_FS_TREE_MOD_LOG_USERS, &fs_info->flags)) in tree_mod_dont_log()
181 write_lock(&fs_info->tree_mod_log_lock); in tree_mod_dont_log()
182 if (list_empty(&(fs_info)->tree_mod_seq_list)) { in tree_mod_dont_log()
183 write_unlock(&fs_info->tree_mod_log_lock); in tree_mod_dont_log()
191 static inline bool tree_mod_need_log(const struct btrfs_fs_info *fs_info, in tree_mod_need_log() argument
194 if (!test_bit(BTRFS_FS_TREE_MOD_LOG_USERS, &fs_info->flags)) in tree_mod_need_log()
231 if (!tree_mod_need_log(eb->fs_info, eb)) in btrfs_tree_mod_log_insert_key()
238 if (tree_mod_dont_log(eb->fs_info, eb)) { in btrfs_tree_mod_log_insert_key()
243 ret = tree_mod_log_insert(eb->fs_info, tm); in btrfs_tree_mod_log_insert_key()
244 write_unlock(&eb->fs_info->tree_mod_log_lock); in btrfs_tree_mod_log_insert_key()
261 if (!tree_mod_need_log(eb->fs_info, eb)) in btrfs_tree_mod_log_insert_move()
289 if (tree_mod_dont_log(eb->fs_info, eb)) in btrfs_tree_mod_log_insert_move()
299 ret = tree_mod_log_insert(eb->fs_info, tm_list[i]); in btrfs_tree_mod_log_insert_move()
304 ret = tree_mod_log_insert(eb->fs_info, tm); in btrfs_tree_mod_log_insert_move()
307 write_unlock(&eb->fs_info->tree_mod_log_lock); in btrfs_tree_mod_log_insert_move()
315 rb_erase(&tm_list[i]->node, &eb->fs_info->tree_mod_log); in btrfs_tree_mod_log_insert_move()
319 write_unlock(&eb->fs_info->tree_mod_log_lock); in btrfs_tree_mod_log_insert_move()
326 static inline int tree_mod_log_free_eb(struct btrfs_fs_info *fs_info, in tree_mod_log_free_eb() argument
334 ret = tree_mod_log_insert(fs_info, tm_list[i]); in tree_mod_log_free_eb()
338 &fs_info->tree_mod_log); in tree_mod_log_free_eb()
350 struct btrfs_fs_info *fs_info = old_root->fs_info; in btrfs_tree_mod_log_insert_root() local
357 if (!tree_mod_need_log(fs_info, NULL)) in btrfs_tree_mod_log_insert_root()
390 if (tree_mod_dont_log(fs_info, NULL)) in btrfs_tree_mod_log_insert_root()
394 ret = tree_mod_log_free_eb(fs_info, tm_list, nritems); in btrfs_tree_mod_log_insert_root()
396 ret = tree_mod_log_insert(fs_info, tm); in btrfs_tree_mod_log_insert_root()
398 write_unlock(&fs_info->tree_mod_log_lock); in btrfs_tree_mod_log_insert_root()
416 static struct tree_mod_elem *__tree_mod_log_search(struct btrfs_fs_info *fs_info, in __tree_mod_log_search() argument
425 read_lock(&fs_info->tree_mod_log_lock); in __tree_mod_log_search()
426 tm_root = &fs_info->tree_mod_log; in __tree_mod_log_search()
453 read_unlock(&fs_info->tree_mod_log_lock); in __tree_mod_log_search()
463 static struct tree_mod_elem *tree_mod_log_search_oldest(struct btrfs_fs_info *fs_info, in tree_mod_log_search_oldest() argument
466 return __tree_mod_log_search(fs_info, start, min_seq, true); in tree_mod_log_search_oldest()
474 static struct tree_mod_elem *tree_mod_log_search(struct btrfs_fs_info *fs_info, in tree_mod_log_search() argument
477 return __tree_mod_log_search(fs_info, start, min_seq, false); in tree_mod_log_search()
486 struct btrfs_fs_info *fs_info = dst->fs_info; in btrfs_tree_mod_log_eb_copy() local
493 if (!tree_mod_need_log(fs_info, NULL)) in btrfs_tree_mod_log_eb_copy()
522 if (tree_mod_dont_log(fs_info, NULL)) in btrfs_tree_mod_log_eb_copy()
527 ret = tree_mod_log_insert(fs_info, tm_list_rem[i]); in btrfs_tree_mod_log_eb_copy()
530 ret = tree_mod_log_insert(fs_info, tm_list_add[i]); in btrfs_tree_mod_log_eb_copy()
535 write_unlock(&fs_info->tree_mod_log_lock); in btrfs_tree_mod_log_eb_copy()
543 rb_erase(&tm_list[i]->node, &fs_info->tree_mod_log); in btrfs_tree_mod_log_eb_copy()
547 write_unlock(&fs_info->tree_mod_log_lock); in btrfs_tree_mod_log_eb_copy()
560 if (!tree_mod_need_log(eb->fs_info, eb)) in btrfs_tree_mod_log_free_eb()
577 if (tree_mod_dont_log(eb->fs_info, eb)) in btrfs_tree_mod_log_free_eb()
580 ret = tree_mod_log_free_eb(eb->fs_info, tm_list, nritems); in btrfs_tree_mod_log_free_eb()
581 write_unlock(&eb->fs_info->tree_mod_log_lock); in btrfs_tree_mod_log_free_eb()
618 tm = tree_mod_log_search_oldest(eb_root->fs_info, root_logical, in tree_mod_log_oldest_root()
656 static void tree_mod_log_rewind(struct btrfs_fs_info *fs_info, in tree_mod_log_rewind() argument
669 read_lock(&fs_info->tree_mod_log_lock); in tree_mod_log_rewind()
724 read_unlock(&fs_info->tree_mod_log_lock); in tree_mod_log_rewind()
735 struct extent_buffer *btrfs_tree_mod_log_rewind(struct btrfs_fs_info *fs_info, in btrfs_tree_mod_log_rewind() argument
749 tm = tree_mod_log_search(fs_info, eb->start, time_seq); in btrfs_tree_mod_log_rewind()
755 eb_rewin = alloc_dummy_extent_buffer(fs_info, eb->start); in btrfs_tree_mod_log_rewind()
781 tree_mod_log_rewind(fs_info, eb_rewin, time_seq, tm); in btrfs_tree_mod_log_rewind()
783 BTRFS_NODEPTRS_PER_BLOCK(fs_info)); in btrfs_tree_mod_log_rewind()
797 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_get_old_root() local
823 tm = tree_mod_log_search(fs_info, logical, time_seq); in btrfs_get_old_root()
833 old = read_tree_block(fs_info, logical, &check); in btrfs_get_old_root()
837 btrfs_warn(fs_info, in btrfs_get_old_root()
855 tm2 = tree_mod_log_search(fs_info, logical, time_seq); in btrfs_get_old_root()
870 eb = alloc_dummy_extent_buffer(fs_info, logical); in btrfs_get_old_root()
890 tree_mod_log_rewind(fs_info, eb, time_seq, tm); in btrfs_get_old_root()
893 WARN_ON(btrfs_header_nritems(eb) > BTRFS_NODEPTRS_PER_BLOCK(fs_info)); in btrfs_get_old_root()
922 u64 btrfs_tree_mod_log_lowest_seq(struct btrfs_fs_info *fs_info) in btrfs_tree_mod_log_lowest_seq() argument
926 read_lock(&fs_info->tree_mod_log_lock); in btrfs_tree_mod_log_lowest_seq()
927 if (!list_empty(&fs_info->tree_mod_seq_list)) { in btrfs_tree_mod_log_lowest_seq()
930 elem = list_first_entry(&fs_info->tree_mod_seq_list, in btrfs_tree_mod_log_lowest_seq()
934 read_unlock(&fs_info->tree_mod_log_lock); in btrfs_tree_mod_log_lowest_seq()