diff options
Diffstat (limited to 'fs/btrfs/backref.c')
-rw-r--r-- | fs/btrfs/backref.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c index baf907adede1..297f33850425 100644 --- a/fs/btrfs/backref.c +++ b/fs/btrfs/backref.c | |||
@@ -136,9 +136,10 @@ struct prelim_ref { | |||
136 | 136 | ||
137 | struct preftree { | 137 | struct preftree { |
138 | struct rb_root root; | 138 | struct rb_root root; |
139 | unsigned int count; | ||
139 | }; | 140 | }; |
140 | 141 | ||
141 | #define PREFTREE_INIT { .root = RB_ROOT } | 142 | #define PREFTREE_INIT { .root = RB_ROOT, .count = 0 } |
142 | 143 | ||
143 | struct preftrees { | 144 | struct preftrees { |
144 | struct preftree direct; /* BTRFS_SHARED_[DATA|BLOCK]_REF_KEY */ | 145 | struct preftree direct; /* BTRFS_SHARED_[DATA|BLOCK]_REF_KEY */ |
@@ -248,6 +249,7 @@ static void prelim_ref_insert(struct preftree *preftree, | |||
248 | } | 249 | } |
249 | } | 250 | } |
250 | 251 | ||
252 | preftree->count++; | ||
251 | rb_link_node(&newref->rbnode, parent, p); | 253 | rb_link_node(&newref->rbnode, parent, p); |
252 | rb_insert_color(&newref->rbnode, root); | 254 | rb_insert_color(&newref->rbnode, root); |
253 | } | 255 | } |
@@ -265,6 +267,7 @@ static void prelim_release(struct preftree *preftree) | |||
265 | free_pref(ref); | 267 | free_pref(ref); |
266 | 268 | ||
267 | preftree->root = RB_ROOT; | 269 | preftree->root = RB_ROOT; |
270 | preftree->count = 0; | ||
268 | } | 271 | } |
269 | 272 | ||
270 | /* | 273 | /* |
@@ -608,6 +611,7 @@ static int resolve_indirect_refs(struct btrfs_fs_info *fs_info, | |||
608 | } | 611 | } |
609 | 612 | ||
610 | rb_erase(&ref->rbnode, &preftrees->indirect.root); | 613 | rb_erase(&ref->rbnode, &preftrees->indirect.root); |
614 | preftrees->indirect.count--; | ||
611 | 615 | ||
612 | if (ref->count == 0) { | 616 | if (ref->count == 0) { |
613 | free_pref(ref); | 617 | free_pref(ref); |