relocation.c (584fb12187f087f4909f74fa91dbb61856107684) relocation.c (b1818dab9bda1da8f3ea5a13230b5d91ae964f00)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (C) 2009 Oracle. All rights reserved.
4 */
5
6#include <linux/sched.h>
7#include <linux/pagemap.h>
8#include <linux/writeback.h>

--- 194 unchanged lines hidden (view full) ---

203 ASSERT(list_empty(&cache->useless_node));
204 ASSERT(list_empty(&cache->changed));
205 ASSERT(list_empty(&cache->detached));
206 ASSERT(RB_EMPTY_ROOT(&cache->rb_root));
207 ASSERT(!cache->nr_nodes);
208 ASSERT(!cache->nr_edges);
209}
210
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (C) 2009 Oracle. All rights reserved.
4 */
5
6#include <linux/sched.h>
7#include <linux/pagemap.h>
8#include <linux/writeback.h>

--- 194 unchanged lines hidden (view full) ---

203 ASSERT(list_empty(&cache->useless_node));
204 ASSERT(list_empty(&cache->changed));
205 ASSERT(list_empty(&cache->detached));
206 ASSERT(RB_EMPTY_ROOT(&cache->rb_root));
207 ASSERT(!cache->nr_nodes);
208 ASSERT(!cache->nr_edges);
209}
210
211static struct btrfs_backref_node *alloc_backref_node(
212 struct btrfs_backref_cache *cache, u64 bytenr, int level)
213{
214 struct btrfs_backref_node *node;
215
216 ASSERT(level >= 0 && level < BTRFS_MAX_LEVEL);
217 node = kzalloc(sizeof(*node), GFP_NOFS);
218 if (!node)
219 return node;
220
221 INIT_LIST_HEAD(&node->list);
222 INIT_LIST_HEAD(&node->upper);
223 INIT_LIST_HEAD(&node->lower);
224 RB_CLEAR_NODE(&node->rb_node);
225 cache->nr_nodes++;
226 node->level = level;
227 node->bytenr = bytenr;
228
229 return node;
230}
231
232static void free_backref_node(struct btrfs_backref_cache *cache,
233 struct btrfs_backref_node *node)
234{
235 if (node) {
236 cache->nr_nodes--;
237 btrfs_put_root(node->root);
238 kfree(node);
239 }

--- 364 unchanged lines hidden (view full) ---

604
605 edge = alloc_backref_edge(cache);
606 if (!edge)
607 return -ENOMEM;
608
609 rb_node = rb_simple_search(&cache->rb_root, ref_key->offset);
610 if (!rb_node) {
611 /* Parent node not yet cached */
211static void free_backref_node(struct btrfs_backref_cache *cache,
212 struct btrfs_backref_node *node)
213{
214 if (node) {
215 cache->nr_nodes--;
216 btrfs_put_root(node->root);
217 kfree(node);
218 }

--- 364 unchanged lines hidden (view full) ---

583
584 edge = alloc_backref_edge(cache);
585 if (!edge)
586 return -ENOMEM;
587
588 rb_node = rb_simple_search(&cache->rb_root, ref_key->offset);
589 if (!rb_node) {
590 /* Parent node not yet cached */
612 upper = alloc_backref_node(cache, ref_key->offset,
591 upper = btrfs_backref_alloc_node(cache, ref_key->offset,
613 cur->level + 1);
614 if (!upper) {
615 free_backref_edge(cache, edge);
616 return -ENOMEM;
617 }
618
619 /*
620 * Backrefs for the upper level block isn't cached, add the

--- 103 unchanged lines hidden (view full) ---

724 btrfs_put_root(root);
725 ret = -ENOMEM;
726 goto out;
727 }
728
729 eb = path->nodes[level];
730 rb_node = rb_simple_search(&cache->rb_root, eb->start);
731 if (!rb_node) {
592 cur->level + 1);
593 if (!upper) {
594 free_backref_edge(cache, edge);
595 return -ENOMEM;
596 }
597
598 /*
599 * Backrefs for the upper level block isn't cached, add the

--- 103 unchanged lines hidden (view full) ---

703 btrfs_put_root(root);
704 ret = -ENOMEM;
705 goto out;
706 }
707
708 eb = path->nodes[level];
709 rb_node = rb_simple_search(&cache->rb_root, eb->start);
710 if (!rb_node) {
732 upper = alloc_backref_node(cache, eb->start,
733 lower->level + 1);
711 upper = btrfs_backref_alloc_node(cache, eb->start,
712 lower->level + 1);
734 if (!upper) {
735 btrfs_put_root(root);
736 free_backref_edge(cache, edge);
737 ret = -ENOMEM;
738 goto out;
739 }
740 upper->owner = btrfs_header_owner(eb);
741 if (!test_bit(BTRFS_ROOT_REF_COWS, &root->state))

--- 388 unchanged lines hidden (view full) ---

1130 if (!iter)
1131 return ERR_PTR(-ENOMEM);
1132 path = btrfs_alloc_path();
1133 if (!path) {
1134 err = -ENOMEM;
1135 goto out;
1136 }
1137
713 if (!upper) {
714 btrfs_put_root(root);
715 free_backref_edge(cache, edge);
716 ret = -ENOMEM;
717 goto out;
718 }
719 upper->owner = btrfs_header_owner(eb);
720 if (!test_bit(BTRFS_ROOT_REF_COWS, &root->state))

--- 388 unchanged lines hidden (view full) ---

1109 if (!iter)
1110 return ERR_PTR(-ENOMEM);
1111 path = btrfs_alloc_path();
1112 if (!path) {
1113 err = -ENOMEM;
1114 goto out;
1115 }
1116
1138 node = alloc_backref_node(cache, bytenr, level);
1117 node = btrfs_backref_alloc_node(cache, bytenr, level);
1139 if (!node) {
1140 err = -ENOMEM;
1141 goto out;
1142 }
1143
1144 node->lowest = 1;
1145 cur = node;
1146

--- 120 unchanged lines hidden (view full) ---

1267 rb_node);
1268 BUG_ON(node->detached);
1269 }
1270 }
1271
1272 if (!node)
1273 return 0;
1274
1118 if (!node) {
1119 err = -ENOMEM;
1120 goto out;
1121 }
1122
1123 node->lowest = 1;
1124 cur = node;
1125

--- 120 unchanged lines hidden (view full) ---

1246 rb_node);
1247 BUG_ON(node->detached);
1248 }
1249 }
1250
1251 if (!node)
1252 return 0;
1253
1275 new_node = alloc_backref_node(cache, dest->node->start, node->level);
1254 new_node = btrfs_backref_alloc_node(cache, dest->node->start,
1255 node->level);
1276 if (!new_node)
1277 return -ENOMEM;
1278
1279 new_node->lowest = node->lowest;
1280 new_node->checked = 1;
1281 new_node->root = btrfs_grab_root(dest);
1282 ASSERT(new_node->root);
1283

--- 3475 unchanged lines hidden ---
1256 if (!new_node)
1257 return -ENOMEM;
1258
1259 new_node->lowest = node->lowest;
1260 new_node->checked = 1;
1261 new_node->root = btrfs_grab_root(dest);
1262 ASSERT(new_node->root);
1263

--- 3475 unchanged lines hidden ---