~ubuntu-branches/debian/stretch/btrfs-tools/stretch

« back to all changes in this revision

Viewing changes to backref.c

  • Committer: Package Import Robot
  • Author(s): Dimitri John Ledkov
  • Date: 2014-10-23 22:04:07 UTC
  • mfrom: (1.2.15) (6.1.40 sid)
  • Revision ID: package-import@ubuntu.com-20141023220407-skt9hy0ft4oim95o
Tags: 3.17-1
New upstream release.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (C) 2011 STRATO.  All rights reserved.
 
3
 *
 
4
 * This program is free software; you can redistribute it and/or
 
5
 * modify it under the terms of the GNU General Public
 
6
 * License v2 as published by the Free Software Foundation.
 
7
 *
 
8
 * This program is distributed in the hope that it will be useful,
 
9
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
11
 * General Public License for more details.
 
12
 *
 
13
 * You should have received a copy of the GNU General Public
 
14
 * License along with this program; if not, write to the
 
15
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 
16
 * Boston, MA 021110-1307, USA.
 
17
 */
 
18
 
 
19
#include "kerncompat.h"
 
20
#include "ctree.h"
 
21
#include "disk-io.h"
 
22
#include "backref.h"
 
23
#include "ulist.h"
 
24
#include "transaction.h"
 
25
 
 
26
#define pr_debug(...) do { } while (0)
 
27
 
 
28
struct extent_inode_elem {
 
29
        u64 inum;
 
30
        u64 offset;
 
31
        struct extent_inode_elem *next;
 
32
};
 
33
 
 
34
static int check_extent_in_eb(struct btrfs_key *key, struct extent_buffer *eb,
 
35
                                struct btrfs_file_extent_item *fi,
 
36
                                u64 extent_item_pos,
 
37
                                struct extent_inode_elem **eie)
 
38
{
 
39
        u64 offset = 0;
 
40
        struct extent_inode_elem *e;
 
41
 
 
42
        if (!btrfs_file_extent_compression(eb, fi) &&
 
43
            !btrfs_file_extent_encryption(eb, fi) &&
 
44
            !btrfs_file_extent_other_encoding(eb, fi)) {
 
45
                u64 data_offset;
 
46
                u64 data_len;
 
47
 
 
48
                data_offset = btrfs_file_extent_offset(eb, fi);
 
49
                data_len = btrfs_file_extent_num_bytes(eb, fi);
 
50
 
 
51
                if (extent_item_pos < data_offset ||
 
52
                    extent_item_pos >= data_offset + data_len)
 
53
                        return 1;
 
54
                offset = extent_item_pos - data_offset;
 
55
        }
 
56
 
 
57
        e = kmalloc(sizeof(*e), GFP_NOFS);
 
58
        if (!e)
 
59
                return -ENOMEM;
 
60
 
 
61
        e->next = *eie;
 
62
        e->inum = key->objectid;
 
63
        e->offset = key->offset + offset;
 
64
        *eie = e;
 
65
 
 
66
        return 0;
 
67
}
 
68
 
 
69
static void free_inode_elem_list(struct extent_inode_elem *eie)
 
70
{
 
71
        struct extent_inode_elem *eie_next;
 
72
 
 
73
        for (; eie; eie = eie_next) {
 
74
                eie_next = eie->next;
 
75
                kfree(eie);
 
76
        }
 
77
}
 
78
 
 
79
static int find_extent_in_eb(struct extent_buffer *eb, u64 wanted_disk_byte,
 
80
                                u64 extent_item_pos,
 
81
                                struct extent_inode_elem **eie)
 
82
{
 
83
        u64 disk_byte;
 
84
        struct btrfs_key key;
 
85
        struct btrfs_file_extent_item *fi;
 
86
        int slot;
 
87
        int nritems;
 
88
        int extent_type;
 
89
        int ret;
 
90
 
 
91
        /*
 
92
         * from the shared data ref, we only have the leaf but we need
 
93
         * the key. thus, we must look into all items and see that we
 
94
         * find one (some) with a reference to our extent item.
 
95
         */
 
96
        nritems = btrfs_header_nritems(eb);
 
97
        for (slot = 0; slot < nritems; ++slot) {
 
98
                btrfs_item_key_to_cpu(eb, &key, slot);
 
99
                if (key.type != BTRFS_EXTENT_DATA_KEY)
 
100
                        continue;
 
101
                fi = btrfs_item_ptr(eb, slot, struct btrfs_file_extent_item);
 
102
                extent_type = btrfs_file_extent_type(eb, fi);
 
103
                if (extent_type == BTRFS_FILE_EXTENT_INLINE)
 
104
                        continue;
 
105
                /* don't skip BTRFS_FILE_EXTENT_PREALLOC, we can handle that */
 
106
                disk_byte = btrfs_file_extent_disk_bytenr(eb, fi);
 
107
                if (disk_byte != wanted_disk_byte)
 
108
                        continue;
 
109
 
 
110
                ret = check_extent_in_eb(&key, eb, fi, extent_item_pos, eie);
 
111
                if (ret < 0)
 
112
                        return ret;
 
113
        }
 
114
 
 
115
        return 0;
 
116
}
 
117
 
 
118
/*
 
119
 * this structure records all encountered refs on the way up to the root
 
120
 */
 
121
struct __prelim_ref {
 
122
        struct list_head list;
 
123
        u64 root_id;
 
124
        struct btrfs_key key_for_search;
 
125
        int level;
 
126
        int count;
 
127
        struct extent_inode_elem *inode_list;
 
128
        u64 parent;
 
129
        u64 wanted_disk_byte;
 
130
};
 
131
 
 
132
/*
 
133
 * the rules for all callers of this function are:
 
134
 * - obtaining the parent is the goal
 
135
 * - if you add a key, you must know that it is a correct key
 
136
 * - if you cannot add the parent or a correct key, then we will look into the
 
137
 *   block later to set a correct key
 
138
 *
 
139
 * delayed refs
 
140
 * ============
 
141
 *        backref type | shared | indirect | shared | indirect
 
142
 * information         |   tree |     tree |   data |     data
 
143
 * --------------------+--------+----------+--------+----------
 
144
 *      parent logical |    y   |     -    |    -   |     -
 
145
 *      key to resolve |    -   |     y    |    y   |     y
 
146
 *  tree block logical |    -   |     -    |    -   |     -
 
147
 *  root for resolving |    y   |     y    |    y   |     y
 
148
 *
 
149
 * - column 1:       we've the parent -> done
 
150
 * - column 2, 3, 4: we use the key to find the parent
 
151
 *
 
152
 * on disk refs (inline or keyed)
 
153
 * ==============================
 
154
 *        backref type | shared | indirect | shared | indirect
 
155
 * information         |   tree |     tree |   data |     data
 
156
 * --------------------+--------+----------+--------+----------
 
157
 *      parent logical |    y   |     -    |    y   |     -
 
158
 *      key to resolve |    -   |     -    |    -   |     y
 
159
 *  tree block logical |    y   |     y    |    y   |     y
 
160
 *  root for resolving |    -   |     y    |    y   |     y
 
161
 *
 
162
 * - column 1, 3: we've the parent -> done
 
163
 * - column 2:    we take the first key from the block to find the parent
 
164
 *                (see __add_missing_keys)
 
165
 * - column 4:    we use the key to find the parent
 
166
 *
 
167
 * additional information that's available but not required to find the parent
 
168
 * block might help in merging entries to gain some speed.
 
169
 */
 
170
 
 
171
static int __add_prelim_ref(struct list_head *head, u64 root_id,
 
172
                            struct btrfs_key *key, int level,
 
173
                            u64 parent, u64 wanted_disk_byte, int count,
 
174
                            gfp_t gfp_mask)
 
175
{
 
176
        struct __prelim_ref *ref;
 
177
 
 
178
        if (root_id == BTRFS_DATA_RELOC_TREE_OBJECTID)
 
179
                return 0;
 
180
 
 
181
        ref = kmalloc(sizeof(*ref), gfp_mask);
 
182
        if (!ref)
 
183
                return -ENOMEM;
 
184
 
 
185
        ref->root_id = root_id;
 
186
        if (key)
 
187
                ref->key_for_search = *key;
 
188
        else
 
189
                memset(&ref->key_for_search, 0, sizeof(ref->key_for_search));
 
190
 
 
191
        ref->inode_list = NULL;
 
192
        ref->level = level;
 
193
        ref->count = count;
 
194
        ref->parent = parent;
 
195
        ref->wanted_disk_byte = wanted_disk_byte;
 
196
        list_add_tail(&ref->list, head);
 
197
 
 
198
        return 0;
 
199
}
 
200
 
 
201
static int add_all_parents(struct btrfs_root *root, struct btrfs_path *path,
 
202
                           struct ulist *parents, struct __prelim_ref *ref,
 
203
                           int level, u64 time_seq, const u64 *extent_item_pos,
 
204
                           u64 total_refs)
 
205
{
 
206
        int ret = 0;
 
207
        int slot;
 
208
        struct extent_buffer *eb;
 
209
        struct btrfs_key key;
 
210
        struct btrfs_key *key_for_search = &ref->key_for_search;
 
211
        struct btrfs_file_extent_item *fi;
 
212
        struct extent_inode_elem *eie = NULL, *old = NULL;
 
213
        u64 disk_byte;
 
214
        u64 wanted_disk_byte = ref->wanted_disk_byte;
 
215
        u64 count = 0;
 
216
 
 
217
        if (level != 0) {
 
218
                eb = path->nodes[level];
 
219
                ret = ulist_add(parents, eb->start, 0, GFP_NOFS);
 
220
                if (ret < 0)
 
221
                        return ret;
 
222
                return 0;
 
223
        }
 
224
 
 
225
        /*
 
226
         * We normally enter this function with the path already pointing to
 
227
         * the first item to check. But sometimes, we may enter it with
 
228
         * slot==nritems. In that case, go to the next leaf before we continue.
 
229
         */
 
230
        if (path->slots[0] >= btrfs_header_nritems(path->nodes[0]))
 
231
                ret = btrfs_next_leaf(root, path);
 
232
 
 
233
        while (!ret && count < total_refs) {
 
234
                eb = path->nodes[0];
 
235
                slot = path->slots[0];
 
236
 
 
237
                btrfs_item_key_to_cpu(eb, &key, slot);
 
238
 
 
239
                if (key.objectid != key_for_search->objectid ||
 
240
                    key.type != BTRFS_EXTENT_DATA_KEY)
 
241
                        break;
 
242
 
 
243
                fi = btrfs_item_ptr(eb, slot, struct btrfs_file_extent_item);
 
244
                disk_byte = btrfs_file_extent_disk_bytenr(eb, fi);
 
245
 
 
246
                if (disk_byte == wanted_disk_byte) {
 
247
                        eie = NULL;
 
248
                        old = NULL;
 
249
                        count++;
 
250
                        if (extent_item_pos) {
 
251
                                ret = check_extent_in_eb(&key, eb, fi,
 
252
                                                *extent_item_pos,
 
253
                                                &eie);
 
254
                                if (ret < 0)
 
255
                                        break;
 
256
                        }
 
257
                        if (ret > 0)
 
258
                                goto next;
 
259
                        ret = ulist_add_merge_ptr(parents, eb->start,
 
260
                                                  eie, (void **)&old, GFP_NOFS);
 
261
                        if (ret < 0)
 
262
                                break;
 
263
                        if (!ret && extent_item_pos) {
 
264
                                while (old->next)
 
265
                                        old = old->next;
 
266
                                old->next = eie;
 
267
                        }
 
268
                        eie = NULL;
 
269
                }
 
270
next:
 
271
                ret = btrfs_next_item(root, path);
 
272
        }
 
273
 
 
274
        if (ret > 0)
 
275
                ret = 0;
 
276
        else if (ret < 0)
 
277
                free_inode_elem_list(eie);
 
278
        return ret;
 
279
}
 
280
 
 
281
/*
 
282
 * resolve an indirect backref in the form (root_id, key, level)
 
283
 * to a logical address
 
284
 */
 
285
static int __resolve_indirect_ref(struct btrfs_fs_info *fs_info,
 
286
                                  struct btrfs_path *path, u64 time_seq,
 
287
                                  struct __prelim_ref *ref,
 
288
                                  struct ulist *parents,
 
289
                                  const u64 *extent_item_pos, u64 total_refs)
 
290
{
 
291
        struct btrfs_root *root;
 
292
        struct btrfs_key root_key;
 
293
        struct extent_buffer *eb;
 
294
        int ret = 0;
 
295
        int root_level;
 
296
        int level = ref->level;
 
297
 
 
298
        root_key.objectid = ref->root_id;
 
299
        root_key.type = BTRFS_ROOT_ITEM_KEY;
 
300
        root_key.offset = (u64)-1;
 
301
 
 
302
        root = btrfs_read_fs_root(fs_info, &root_key);
 
303
        if (IS_ERR(root)) {
 
304
                ret = PTR_ERR(root);
 
305
                goto out;
 
306
        }
 
307
 
 
308
        root_level = btrfs_root_level(&root->root_item);
 
309
 
 
310
        if (root_level + 1 == level)
 
311
                goto out;
 
312
 
 
313
        path->lowest_level = level;
 
314
        ret = btrfs_search_slot(NULL, root, &ref->key_for_search, path, 0, 0);
 
315
 
 
316
        pr_debug("search slot in root %llu (level %d, ref count %d) returned "
 
317
                 "%d for key (%llu %u %llu)\n",
 
318
                 ref->root_id, level, ref->count, ret,
 
319
                 ref->key_for_search.objectid, ref->key_for_search.type,
 
320
                 ref->key_for_search.offset);
 
321
        if (ret < 0)
 
322
                goto out;
 
323
 
 
324
        eb = path->nodes[level];
 
325
        while (!eb) {
 
326
                WARN_ON(!level);
 
327
                if (!level) {
 
328
                        ret = 1;
 
329
                        goto out;
 
330
                }
 
331
                level--;
 
332
                eb = path->nodes[level];
 
333
        }
 
334
 
 
335
        ret = add_all_parents(root, path, parents, ref, level, time_seq,
 
336
                              extent_item_pos, total_refs);
 
337
out:
 
338
        path->lowest_level = 0;
 
339
        btrfs_release_path(path);
 
340
        return ret;
 
341
}
 
342
 
 
343
/*
 
344
 * resolve all indirect backrefs from the list
 
345
 */
 
346
static int __resolve_indirect_refs(struct btrfs_fs_info *fs_info,
 
347
                                   struct btrfs_path *path, u64 time_seq,
 
348
                                   struct list_head *head,
 
349
                                   const u64 *extent_item_pos, u64 total_refs)
 
350
{
 
351
        int err;
 
352
        int ret = 0;
 
353
        struct __prelim_ref *ref;
 
354
        struct __prelim_ref *ref_safe;
 
355
        struct __prelim_ref *new_ref;
 
356
        struct ulist *parents;
 
357
        struct ulist_node *node;
 
358
        struct ulist_iterator uiter;
 
359
 
 
360
        parents = ulist_alloc(GFP_NOFS);
 
361
        if (!parents)
 
362
                return -ENOMEM;
 
363
 
 
364
        /*
 
365
         * _safe allows us to insert directly after the current item without
 
366
         * iterating over the newly inserted items.
 
367
         * we're also allowed to re-assign ref during iteration.
 
368
         */
 
369
        list_for_each_entry_safe(ref, ref_safe, head, list) {
 
370
                if (ref->parent)        /* already direct */
 
371
                        continue;
 
372
                if (ref->count == 0)
 
373
                        continue;
 
374
                err = __resolve_indirect_ref(fs_info, path, time_seq, ref,
 
375
                                             parents, extent_item_pos,
 
376
                                             total_refs);
 
377
                /*
 
378
                 * we can only tolerate ENOENT,otherwise,we should catch error
 
379
                 * and return directly.
 
380
                 */
 
381
                if (err == -ENOENT) {
 
382
                        continue;
 
383
                } else if (err) {
 
384
                        ret = err;
 
385
                        goto out;
 
386
                }
 
387
 
 
388
                /* we put the first parent into the ref at hand */
 
389
                ULIST_ITER_INIT(&uiter);
 
390
                node = ulist_next(parents, &uiter);
 
391
                ref->parent = node ? node->val : 0;
 
392
                ref->inode_list = node ?
 
393
                        (struct extent_inode_elem *)(uintptr_t)node->aux : NULL;
 
394
 
 
395
                /* additional parents require new refs being added here */
 
396
                while ((node = ulist_next(parents, &uiter))) {
 
397
                        new_ref = kmalloc(sizeof(*new_ref), GFP_NOFS);
 
398
                        if (!new_ref) {
 
399
                                ret = -ENOMEM;
 
400
                                goto out;
 
401
                        }
 
402
                        memcpy(new_ref, ref, sizeof(*ref));
 
403
                        new_ref->parent = node->val;
 
404
                        new_ref->inode_list = (struct extent_inode_elem *)
 
405
                                                        (uintptr_t)node->aux;
 
406
                        list_add(&new_ref->list, &ref->list);
 
407
                }
 
408
                ulist_reinit(parents);
 
409
        }
 
410
out:
 
411
        ulist_free(parents);
 
412
        return ret;
 
413
}
 
414
 
 
415
static inline int ref_for_same_block(struct __prelim_ref *ref1,
 
416
                                     struct __prelim_ref *ref2)
 
417
{
 
418
        if (ref1->level != ref2->level)
 
419
                return 0;
 
420
        if (ref1->root_id != ref2->root_id)
 
421
                return 0;
 
422
        if (ref1->key_for_search.type != ref2->key_for_search.type)
 
423
                return 0;
 
424
        if (ref1->key_for_search.objectid != ref2->key_for_search.objectid)
 
425
                return 0;
 
426
        if (ref1->key_for_search.offset != ref2->key_for_search.offset)
 
427
                return 0;
 
428
        if (ref1->parent != ref2->parent)
 
429
                return 0;
 
430
 
 
431
        return 1;
 
432
}
 
433
 
 
434
/*
 
435
 * read tree blocks and add keys where required.
 
436
 */
 
437
static int __add_missing_keys(struct btrfs_fs_info *fs_info,
 
438
                              struct list_head *head)
 
439
{
 
440
        struct list_head *pos;
 
441
        struct extent_buffer *eb;
 
442
 
 
443
        list_for_each(pos, head) {
 
444
                struct __prelim_ref *ref;
 
445
                ref = list_entry(pos, struct __prelim_ref, list);
 
446
 
 
447
                if (ref->parent)
 
448
                        continue;
 
449
                if (ref->key_for_search.type)
 
450
                        continue;
 
451
                BUG_ON(!ref->wanted_disk_byte);
 
452
                eb = read_tree_block(fs_info->tree_root, ref->wanted_disk_byte,
 
453
                                     fs_info->tree_root->leafsize, 0);
 
454
                if (!eb || !extent_buffer_uptodate(eb)) {
 
455
                        free_extent_buffer(eb);
 
456
                        return -EIO;
 
457
                }
 
458
                if (btrfs_header_level(eb) == 0)
 
459
                        btrfs_item_key_to_cpu(eb, &ref->key_for_search, 0);
 
460
                else
 
461
                        btrfs_node_key_to_cpu(eb, &ref->key_for_search, 0);
 
462
                free_extent_buffer(eb);
 
463
        }
 
464
        return 0;
 
465
}
 
466
 
 
467
/*
 
468
 * merge two lists of backrefs and adjust counts accordingly
 
469
 *
 
470
 * mode = 1: merge identical keys, if key is set
 
471
 *    FIXME: if we add more keys in __add_prelim_ref, we can merge more here.
 
472
 *           additionally, we could even add a key range for the blocks we
 
473
 *           looked into to merge even more (-> replace unresolved refs by those
 
474
 *           having a parent).
 
475
 * mode = 2: merge identical parents
 
476
 */
 
477
static void __merge_refs(struct list_head *head, int mode)
 
478
{
 
479
        struct list_head *pos1;
 
480
 
 
481
        list_for_each(pos1, head) {
 
482
                struct list_head *n2;
 
483
                struct list_head *pos2;
 
484
                struct __prelim_ref *ref1;
 
485
 
 
486
                ref1 = list_entry(pos1, struct __prelim_ref, list);
 
487
 
 
488
                for (pos2 = pos1->next, n2 = pos2->next; pos2 != head;
 
489
                     pos2 = n2, n2 = pos2->next) {
 
490
                        struct __prelim_ref *ref2;
 
491
                        struct __prelim_ref *xchg;
 
492
                        struct extent_inode_elem *eie;
 
493
 
 
494
                        ref2 = list_entry(pos2, struct __prelim_ref, list);
 
495
 
 
496
                        if (mode == 1) {
 
497
                                if (!ref_for_same_block(ref1, ref2))
 
498
                                        continue;
 
499
                                if (!ref1->parent && ref2->parent) {
 
500
                                        xchg = ref1;
 
501
                                        ref1 = ref2;
 
502
                                        ref2 = xchg;
 
503
                                }
 
504
                        } else {
 
505
                                if (ref1->parent != ref2->parent)
 
506
                                        continue;
 
507
                        }
 
508
 
 
509
                        eie = ref1->inode_list;
 
510
                        while (eie && eie->next)
 
511
                                eie = eie->next;
 
512
                        if (eie)
 
513
                                eie->next = ref2->inode_list;
 
514
                        else
 
515
                                ref1->inode_list = ref2->inode_list;
 
516
                        ref1->count += ref2->count;
 
517
 
 
518
                        list_del(&ref2->list);
 
519
                        kfree(ref2);
 
520
                }
 
521
 
 
522
        }
 
523
}
 
524
 
 
525
/*
 
526
 * add all inline backrefs for bytenr to the list
 
527
 */
 
528
static int __add_inline_refs(struct btrfs_fs_info *fs_info,
 
529
                             struct btrfs_path *path, u64 bytenr,
 
530
                             int *info_level, struct list_head *prefs,
 
531
                             u64 *total_refs)
 
532
{
 
533
        int ret = 0;
 
534
        int slot;
 
535
        struct extent_buffer *leaf;
 
536
        struct btrfs_key key;
 
537
        struct btrfs_key found_key;
 
538
        unsigned long ptr;
 
539
        unsigned long end;
 
540
        struct btrfs_extent_item *ei;
 
541
        u64 flags;
 
542
        u64 item_size;
 
543
 
 
544
        /*
 
545
         * enumerate all inline refs
 
546
         */
 
547
        leaf = path->nodes[0];
 
548
        slot = path->slots[0];
 
549
 
 
550
        item_size = btrfs_item_size_nr(leaf, slot);
 
551
        BUG_ON(item_size < sizeof(*ei));
 
552
 
 
553
        ei = btrfs_item_ptr(leaf, slot, struct btrfs_extent_item);
 
554
        flags = btrfs_extent_flags(leaf, ei);
 
555
        *total_refs += btrfs_extent_refs(leaf, ei);
 
556
        btrfs_item_key_to_cpu(leaf, &found_key, slot);
 
557
 
 
558
        ptr = (unsigned long)(ei + 1);
 
559
        end = (unsigned long)ei + item_size;
 
560
 
 
561
        if (found_key.type == BTRFS_EXTENT_ITEM_KEY &&
 
562
            flags & BTRFS_EXTENT_FLAG_TREE_BLOCK) {
 
563
                struct btrfs_tree_block_info *info;
 
564
 
 
565
                info = (struct btrfs_tree_block_info *)ptr;
 
566
                *info_level = btrfs_tree_block_level(leaf, info);
 
567
                ptr += sizeof(struct btrfs_tree_block_info);
 
568
                BUG_ON(ptr > end);
 
569
        } else if (found_key.type == BTRFS_METADATA_ITEM_KEY) {
 
570
                *info_level = found_key.offset;
 
571
        } else {
 
572
                BUG_ON(!(flags & BTRFS_EXTENT_FLAG_DATA));
 
573
        }
 
574
 
 
575
        while (ptr < end) {
 
576
                struct btrfs_extent_inline_ref *iref;
 
577
                u64 offset;
 
578
                int type;
 
579
 
 
580
                iref = (struct btrfs_extent_inline_ref *)ptr;
 
581
                type = btrfs_extent_inline_ref_type(leaf, iref);
 
582
                offset = btrfs_extent_inline_ref_offset(leaf, iref);
 
583
 
 
584
                switch (type) {
 
585
                case BTRFS_SHARED_BLOCK_REF_KEY:
 
586
                        ret = __add_prelim_ref(prefs, 0, NULL,
 
587
                                                *info_level + 1, offset,
 
588
                                                bytenr, 1, GFP_NOFS);
 
589
                        break;
 
590
                case BTRFS_SHARED_DATA_REF_KEY: {
 
591
                        struct btrfs_shared_data_ref *sdref;
 
592
                        int count;
 
593
 
 
594
                        sdref = (struct btrfs_shared_data_ref *)(iref + 1);
 
595
                        count = btrfs_shared_data_ref_count(leaf, sdref);
 
596
                        ret = __add_prelim_ref(prefs, 0, NULL, 0, offset,
 
597
                                               bytenr, count, GFP_NOFS);
 
598
                        break;
 
599
                }
 
600
                case BTRFS_TREE_BLOCK_REF_KEY:
 
601
                        ret = __add_prelim_ref(prefs, offset, NULL,
 
602
                                               *info_level + 1, 0,
 
603
                                               bytenr, 1, GFP_NOFS);
 
604
                        break;
 
605
                case BTRFS_EXTENT_DATA_REF_KEY: {
 
606
                        struct btrfs_extent_data_ref *dref;
 
607
                        int count;
 
608
                        u64 root;
 
609
 
 
610
                        dref = (struct btrfs_extent_data_ref *)(&iref->offset);
 
611
                        count = btrfs_extent_data_ref_count(leaf, dref);
 
612
                        key.objectid = btrfs_extent_data_ref_objectid(leaf,
 
613
                                                                      dref);
 
614
                        key.type = BTRFS_EXTENT_DATA_KEY;
 
615
                        key.offset = btrfs_extent_data_ref_offset(leaf, dref);
 
616
                        root = btrfs_extent_data_ref_root(leaf, dref);
 
617
                        ret = __add_prelim_ref(prefs, root, &key, 0, 0,
 
618
                                               bytenr, count, GFP_NOFS);
 
619
                        break;
 
620
                }
 
621
                default:
 
622
                        WARN_ON(1);
 
623
                }
 
624
                if (ret)
 
625
                        return ret;
 
626
                ptr += btrfs_extent_inline_ref_size(type);
 
627
        }
 
628
 
 
629
        return 0;
 
630
}
 
631
 
 
632
/*
 
633
 * add all non-inline backrefs for bytenr to the list
 
634
 */
 
635
static int __add_keyed_refs(struct btrfs_fs_info *fs_info,
 
636
                            struct btrfs_path *path, u64 bytenr,
 
637
                            int info_level, struct list_head *prefs)
 
638
{
 
639
        struct btrfs_root *extent_root = fs_info->extent_root;
 
640
        int ret;
 
641
        int slot;
 
642
        struct extent_buffer *leaf;
 
643
        struct btrfs_key key;
 
644
 
 
645
        while (1) {
 
646
                ret = btrfs_next_item(extent_root, path);
 
647
                if (ret < 0)
 
648
                        break;
 
649
                if (ret) {
 
650
                        ret = 0;
 
651
                        break;
 
652
                }
 
653
 
 
654
                slot = path->slots[0];
 
655
                leaf = path->nodes[0];
 
656
                btrfs_item_key_to_cpu(leaf, &key, slot);
 
657
 
 
658
                if (key.objectid != bytenr)
 
659
                        break;
 
660
                if (key.type < BTRFS_TREE_BLOCK_REF_KEY)
 
661
                        continue;
 
662
                if (key.type > BTRFS_SHARED_DATA_REF_KEY)
 
663
                        break;
 
664
 
 
665
                switch (key.type) {
 
666
                case BTRFS_SHARED_BLOCK_REF_KEY:
 
667
                        ret = __add_prelim_ref(prefs, 0, NULL,
 
668
                                                info_level + 1, key.offset,
 
669
                                                bytenr, 1, GFP_NOFS);
 
670
                        break;
 
671
                case BTRFS_SHARED_DATA_REF_KEY: {
 
672
                        struct btrfs_shared_data_ref *sdref;
 
673
                        int count;
 
674
 
 
675
                        sdref = btrfs_item_ptr(leaf, slot,
 
676
                                              struct btrfs_shared_data_ref);
 
677
                        count = btrfs_shared_data_ref_count(leaf, sdref);
 
678
                        ret = __add_prelim_ref(prefs, 0, NULL, 0, key.offset,
 
679
                                                bytenr, count, GFP_NOFS);
 
680
                        break;
 
681
                }
 
682
                case BTRFS_TREE_BLOCK_REF_KEY:
 
683
                        ret = __add_prelim_ref(prefs, key.offset, NULL,
 
684
                                               info_level + 1, 0,
 
685
                                               bytenr, 1, GFP_NOFS);
 
686
                        break;
 
687
                case BTRFS_EXTENT_DATA_REF_KEY: {
 
688
                        struct btrfs_extent_data_ref *dref;
 
689
                        int count;
 
690
                        u64 root;
 
691
 
 
692
                        dref = btrfs_item_ptr(leaf, slot,
 
693
                                              struct btrfs_extent_data_ref);
 
694
                        count = btrfs_extent_data_ref_count(leaf, dref);
 
695
                        key.objectid = btrfs_extent_data_ref_objectid(leaf,
 
696
                                                                      dref);
 
697
                        key.type = BTRFS_EXTENT_DATA_KEY;
 
698
                        key.offset = btrfs_extent_data_ref_offset(leaf, dref);
 
699
                        root = btrfs_extent_data_ref_root(leaf, dref);
 
700
                        ret = __add_prelim_ref(prefs, root, &key, 0, 0,
 
701
                                               bytenr, count, GFP_NOFS);
 
702
                        break;
 
703
                }
 
704
                default:
 
705
                        WARN_ON(1);
 
706
                }
 
707
                if (ret)
 
708
                        return ret;
 
709
 
 
710
        }
 
711
 
 
712
        return ret;
 
713
}
 
714
 
 
715
/*
 
716
 * this adds all existing backrefs (inline backrefs, backrefs and delayed
 
717
 * refs) for the given bytenr to the refs list, merges duplicates and resolves
 
718
 * indirect refs to their parent bytenr.
 
719
 * When roots are found, they're added to the roots list
 
720
 *
 
721
 * FIXME some caching might speed things up
 
722
 */
 
723
static int find_parent_nodes(struct btrfs_trans_handle *trans,
 
724
                             struct btrfs_fs_info *fs_info, u64 bytenr,
 
725
                             u64 time_seq, struct ulist *refs,
 
726
                             struct ulist *roots, const u64 *extent_item_pos)
 
727
{
 
728
        struct btrfs_key key;
 
729
        struct btrfs_path *path;
 
730
        int info_level = 0;
 
731
        int ret;
 
732
        struct list_head prefs;
 
733
        struct __prelim_ref *ref;
 
734
        struct extent_inode_elem *eie = NULL;
 
735
        u64 total_refs = 0;
 
736
 
 
737
        INIT_LIST_HEAD(&prefs);
 
738
 
 
739
        key.objectid = bytenr;
 
740
        key.offset = (u64)-1;
 
741
        if (btrfs_fs_incompat(fs_info,
 
742
                              BTRFS_FEATURE_INCOMPAT_SKINNY_METADATA))
 
743
                key.type = BTRFS_METADATA_ITEM_KEY;
 
744
        else
 
745
                key.type = BTRFS_EXTENT_ITEM_KEY;
 
746
 
 
747
        path = btrfs_alloc_path();
 
748
        if (!path)
 
749
                return -ENOMEM;
 
750
 
 
751
        ret = btrfs_search_slot(trans, fs_info->extent_root, &key, path, 0, 0);
 
752
        if (ret < 0)
 
753
                goto out;
 
754
        BUG_ON(ret == 0);
 
755
 
 
756
        if (path->slots[0]) {
 
757
                struct extent_buffer *leaf;
 
758
                int slot;
 
759
 
 
760
                path->slots[0]--;
 
761
                leaf = path->nodes[0];
 
762
                slot = path->slots[0];
 
763
                btrfs_item_key_to_cpu(leaf, &key, slot);
 
764
                if (key.objectid == bytenr &&
 
765
                    (key.type == BTRFS_EXTENT_ITEM_KEY ||
 
766
                     key.type == BTRFS_METADATA_ITEM_KEY)) {
 
767
                        ret = __add_inline_refs(fs_info, path, bytenr,
 
768
                                                &info_level, &prefs,
 
769
                                                &total_refs);
 
770
                        if (ret)
 
771
                                goto out;
 
772
                        ret = __add_keyed_refs(fs_info, path, bytenr,
 
773
                                               info_level, &prefs);
 
774
                        if (ret)
 
775
                                goto out;
 
776
                }
 
777
        }
 
778
        btrfs_release_path(path);
 
779
 
 
780
        ret = __add_missing_keys(fs_info, &prefs);
 
781
        if (ret)
 
782
                goto out;
 
783
 
 
784
        __merge_refs(&prefs, 1);
 
785
 
 
786
        ret = __resolve_indirect_refs(fs_info, path, time_seq, &prefs,
 
787
                                      extent_item_pos, total_refs);
 
788
        if (ret)
 
789
                goto out;
 
790
 
 
791
        __merge_refs(&prefs, 2);
 
792
 
 
793
        while (!list_empty(&prefs)) {
 
794
                ref = list_first_entry(&prefs, struct __prelim_ref, list);
 
795
                WARN_ON(ref->count < 0);
 
796
                if (roots && ref->count && ref->root_id && ref->parent == 0) {
 
797
                        /* no parent == root of tree */
 
798
                        ret = ulist_add(roots, ref->root_id, 0, GFP_NOFS);
 
799
                        if (ret < 0)
 
800
                                goto out;
 
801
                }
 
802
                if (ref->count && ref->parent) {
 
803
                        if (extent_item_pos && !ref->inode_list &&
 
804
                            ref->level == 0) {
 
805
                                u32 bsz;
 
806
                                struct extent_buffer *eb;
 
807
                                bsz = btrfs_level_size(fs_info->extent_root,
 
808
                                                        ref->level);
 
809
                                eb = read_tree_block(fs_info->extent_root,
 
810
                                                           ref->parent, bsz, 0);
 
811
                                if (!eb || !extent_buffer_uptodate(eb)) {
 
812
                                        free_extent_buffer(eb);
 
813
                                        ret = -EIO;
 
814
                                        goto out;
 
815
                                }
 
816
                                ret = find_extent_in_eb(eb, bytenr,
 
817
                                                        *extent_item_pos, &eie);
 
818
                                free_extent_buffer(eb);
 
819
                                if (ret < 0)
 
820
                                        goto out;
 
821
                                ref->inode_list = eie;
 
822
                        }
 
823
                        ret = ulist_add_merge_ptr(refs, ref->parent,
 
824
                                                  ref->inode_list,
 
825
                                                  (void **)&eie, GFP_NOFS);
 
826
                        if (ret < 0)
 
827
                                goto out;
 
828
                        if (!ret && extent_item_pos) {
 
829
                                /*
 
830
                                 * we've recorded that parent, so we must extend
 
831
                                 * its inode list here
 
832
                                 */
 
833
                                BUG_ON(!eie);
 
834
                                while (eie->next)
 
835
                                        eie = eie->next;
 
836
                                eie->next = ref->inode_list;
 
837
                        }
 
838
                        eie = NULL;
 
839
                }
 
840
                list_del(&ref->list);
 
841
                kfree(ref);
 
842
        }
 
843
 
 
844
out:
 
845
        btrfs_free_path(path);
 
846
        while (!list_empty(&prefs)) {
 
847
                ref = list_first_entry(&prefs, struct __prelim_ref, list);
 
848
                list_del(&ref->list);
 
849
                kfree(ref);
 
850
        }
 
851
        if (ret < 0)
 
852
                free_inode_elem_list(eie);
 
853
        return ret;
 
854
}
 
855
 
 
856
static void free_leaf_list(struct ulist *blocks)
 
857
{
 
858
        struct ulist_node *node = NULL;
 
859
        struct extent_inode_elem *eie;
 
860
        struct ulist_iterator uiter;
 
861
 
 
862
        ULIST_ITER_INIT(&uiter);
 
863
        while ((node = ulist_next(blocks, &uiter))) {
 
864
                if (!node->aux)
 
865
                        continue;
 
866
                eie = (struct extent_inode_elem *)(uintptr_t)node->aux;
 
867
                free_inode_elem_list(eie);
 
868
                node->aux = 0;
 
869
        }
 
870
 
 
871
        ulist_free(blocks);
 
872
}
 
873
 
 
874
/*
 
875
 * Finds all leafs with a reference to the specified combination of bytenr and
 
876
 * offset. key_list_head will point to a list of corresponding keys (caller must
 
877
 * free each list element). The leafs will be stored in the leafs ulist, which
 
878
 * must be freed with ulist_free.
 
879
 *
 
880
 * returns 0 on success, <0 on error
 
881
 */
 
882
static int btrfs_find_all_leafs(struct btrfs_trans_handle *trans,
 
883
                                struct btrfs_fs_info *fs_info, u64 bytenr,
 
884
                                u64 time_seq, struct ulist **leafs,
 
885
                                const u64 *extent_item_pos)
 
886
{
 
887
        int ret;
 
888
 
 
889
        *leafs = ulist_alloc(GFP_NOFS);
 
890
        if (!*leafs)
 
891
                return -ENOMEM;
 
892
 
 
893
        ret = find_parent_nodes(trans, fs_info, bytenr,
 
894
                                time_seq, *leafs, NULL, extent_item_pos);
 
895
        if (ret < 0 && ret != -ENOENT) {
 
896
                free_leaf_list(*leafs);
 
897
                return ret;
 
898
        }
 
899
 
 
900
        return 0;
 
901
}
 
902
 
 
903
/*
 
904
 * walk all backrefs for a given extent to find all roots that reference this
 
905
 * extent. Walking a backref means finding all extents that reference this
 
906
 * extent and in turn walk the backrefs of those, too. Naturally this is a
 
907
 * recursive process, but here it is implemented in an iterative fashion: We
 
908
 * find all referencing extents for the extent in question and put them on a
 
909
 * list. In turn, we find all referencing extents for those, further appending
 
910
 * to the list. The way we iterate the list allows adding more elements after
 
911
 * the current while iterating. The process stops when we reach the end of the
 
912
 * list. Found roots are added to the roots list.
 
913
 *
 
914
 * returns 0 on success, < 0 on error.
 
915
 */
 
916
static int __btrfs_find_all_roots(struct btrfs_trans_handle *trans,
 
917
                                  struct btrfs_fs_info *fs_info, u64 bytenr,
 
918
                                  u64 time_seq, struct ulist **roots)
 
919
{
 
920
        struct ulist *tmp;
 
921
        struct ulist_node *node = NULL;
 
922
        struct ulist_iterator uiter;
 
923
        int ret;
 
924
 
 
925
        tmp = ulist_alloc(GFP_NOFS);
 
926
        if (!tmp)
 
927
                return -ENOMEM;
 
928
        *roots = ulist_alloc(GFP_NOFS);
 
929
        if (!*roots) {
 
930
                ulist_free(tmp);
 
931
                return -ENOMEM;
 
932
        }
 
933
 
 
934
        ULIST_ITER_INIT(&uiter);
 
935
        while (1) {
 
936
                ret = find_parent_nodes(trans, fs_info, bytenr,
 
937
                                        time_seq, tmp, *roots, NULL);
 
938
                if (ret < 0 && ret != -ENOENT) {
 
939
                        ulist_free(tmp);
 
940
                        ulist_free(*roots);
 
941
                        return ret;
 
942
                }
 
943
                node = ulist_next(tmp, &uiter);
 
944
                if (!node)
 
945
                        break;
 
946
                bytenr = node->val;
 
947
                cond_resched();
 
948
        }
 
949
 
 
950
        ulist_free(tmp);
 
951
        return 0;
 
952
}
 
953
 
 
954
int btrfs_find_all_roots(struct btrfs_trans_handle *trans,
 
955
                         struct btrfs_fs_info *fs_info, u64 bytenr,
 
956
                         u64 time_seq, struct ulist **roots)
 
957
{
 
958
        return __btrfs_find_all_roots(trans, fs_info, bytenr, time_seq, roots);
 
959
}
 
960
 
 
961
/*
 
962
 * this makes the path point to (inum INODE_ITEM ioff)
 
963
 */
 
964
int inode_item_info(u64 inum, u64 ioff, struct btrfs_root *fs_root,
 
965
                        struct btrfs_path *path)
 
966
{
 
967
        struct btrfs_key key;
 
968
        return btrfs_find_item(fs_root, path, inum, ioff,
 
969
                        BTRFS_INODE_ITEM_KEY, &key);
 
970
}
 
971
 
 
972
static int inode_ref_info(u64 inum, u64 ioff, struct btrfs_root *fs_root,
 
973
                                struct btrfs_path *path,
 
974
                                struct btrfs_key *found_key)
 
975
{
 
976
        return btrfs_find_item(fs_root, path, inum, ioff,
 
977
                        BTRFS_INODE_REF_KEY, found_key);
 
978
}
 
979
 
 
980
int btrfs_find_one_extref(struct btrfs_root *root, u64 inode_objectid,
 
981
                          u64 start_off, struct btrfs_path *path,
 
982
                          struct btrfs_inode_extref **ret_extref,
 
983
                          u64 *found_off)
 
984
{
 
985
        int ret, slot;
 
986
        struct btrfs_key key;
 
987
        struct btrfs_key found_key;
 
988
        struct btrfs_inode_extref *extref;
 
989
        struct extent_buffer *leaf;
 
990
        unsigned long ptr;
 
991
 
 
992
        key.objectid = inode_objectid;
 
993
        btrfs_set_key_type(&key, BTRFS_INODE_EXTREF_KEY);
 
994
        key.offset = start_off;
 
995
 
 
996
        ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
 
997
        if (ret < 0)
 
998
                return ret;
 
999
 
 
1000
        while (1) {
 
1001
                leaf = path->nodes[0];
 
1002
                slot = path->slots[0];
 
1003
                if (slot >= btrfs_header_nritems(leaf)) {
 
1004
                        /*
 
1005
                         * If the item at offset is not found,
 
1006
                         * btrfs_search_slot will point us to the slot
 
1007
                         * where it should be inserted. In our case
 
1008
                         * that will be the slot directly before the
 
1009
                         * next INODE_REF_KEY_V2 item. In the case
 
1010
                         * that we're pointing to the last slot in a
 
1011
                         * leaf, we must move one leaf over.
 
1012
                         */
 
1013
                        ret = btrfs_next_leaf(root, path);
 
1014
                        if (ret) {
 
1015
                                if (ret >= 1)
 
1016
                                        ret = -ENOENT;
 
1017
                                break;
 
1018
                        }
 
1019
                        continue;
 
1020
                }
 
1021
 
 
1022
                btrfs_item_key_to_cpu(leaf, &found_key, slot);
 
1023
 
 
1024
                /*
 
1025
                 * Check that we're still looking at an extended ref key for
 
1026
                 * this particular objectid. If we have different
 
1027
                 * objectid or type then there are no more to be found
 
1028
                 * in the tree and we can exit.
 
1029
                 */
 
1030
                ret = -ENOENT;
 
1031
                if (found_key.objectid != inode_objectid)
 
1032
                        break;
 
1033
                if (btrfs_key_type(&found_key) != BTRFS_INODE_EXTREF_KEY)
 
1034
                        break;
 
1035
 
 
1036
                ret = 0;
 
1037
                ptr = btrfs_item_ptr_offset(leaf, path->slots[0]);
 
1038
                extref = (struct btrfs_inode_extref *)ptr;
 
1039
                *ret_extref = extref;
 
1040
                if (found_off)
 
1041
                        *found_off = found_key.offset;
 
1042
                break;
 
1043
        }
 
1044
 
 
1045
        return ret;
 
1046
}
 
1047
 
 
1048
/*
 
1049
 * this iterates to turn a name (from iref/extref) into a full filesystem path.
 
1050
 * Elements of the path are separated by '/' and the path is guaranteed to be
 
1051
 * 0-terminated. the path is only given within the current file system.
 
1052
 * Therefore, it never starts with a '/'. the caller is responsible to provide
 
1053
 * "size" bytes in "dest". the dest buffer will be filled backwards. finally,
 
1054
 * the start point of the resulting string is returned. this pointer is within
 
1055
 * dest, normally.
 
1056
 * in case the path buffer would overflow, the pointer is decremented further
 
1057
 * as if output was written to the buffer, though no more output is actually
 
1058
 * generated. that way, the caller can determine how much space would be
 
1059
 * required for the path to fit into the buffer. in that case, the returned
 
1060
 * value will be smaller than dest. callers must check this!
 
1061
 */
 
1062
char *btrfs_ref_to_path(struct btrfs_root *fs_root, struct btrfs_path *path,
 
1063
                        u32 name_len, unsigned long name_off,
 
1064
                        struct extent_buffer *eb_in, u64 parent,
 
1065
                        char *dest, u32 size)
 
1066
{
 
1067
        int slot;
 
1068
        u64 next_inum;
 
1069
        int ret;
 
1070
        s64 bytes_left = ((s64)size) - 1;
 
1071
        struct extent_buffer *eb = eb_in;
 
1072
        struct btrfs_key found_key;
 
1073
        struct btrfs_inode_ref *iref;
 
1074
 
 
1075
        if (bytes_left >= 0)
 
1076
                dest[bytes_left] = '\0';
 
1077
 
 
1078
        while (1) {
 
1079
                bytes_left -= name_len;
 
1080
                if (bytes_left >= 0)
 
1081
                        read_extent_buffer(eb, dest + bytes_left,
 
1082
                                           name_off, name_len);
 
1083
                if (eb != eb_in)
 
1084
                        free_extent_buffer(eb);
 
1085
                ret = inode_ref_info(parent, 0, fs_root, path, &found_key);
 
1086
                if (ret > 0)
 
1087
                        ret = -ENOENT;
 
1088
                if (ret)
 
1089
                        break;
 
1090
 
 
1091
                next_inum = found_key.offset;
 
1092
 
 
1093
                /* regular exit ahead */
 
1094
                if (parent == next_inum)
 
1095
                        break;
 
1096
 
 
1097
                slot = path->slots[0];
 
1098
                eb = path->nodes[0];
 
1099
                /* make sure we can use eb after releasing the path */
 
1100
                if (eb != eb_in)
 
1101
                        eb->refs++;
 
1102
                btrfs_release_path(path);
 
1103
                iref = btrfs_item_ptr(eb, slot, struct btrfs_inode_ref);
 
1104
 
 
1105
                name_len = btrfs_inode_ref_name_len(eb, iref);
 
1106
                name_off = (unsigned long)(iref + 1);
 
1107
 
 
1108
                parent = next_inum;
 
1109
                --bytes_left;
 
1110
                if (bytes_left >= 0)
 
1111
                        dest[bytes_left] = '/';
 
1112
        }
 
1113
 
 
1114
        btrfs_release_path(path);
 
1115
 
 
1116
        if (ret)
 
1117
                return ERR_PTR(ret);
 
1118
 
 
1119
        return dest + bytes_left;
 
1120
}
 
1121
 
 
1122
/*
 
1123
 * this makes the path point to (logical EXTENT_ITEM *)
 
1124
 * returns BTRFS_EXTENT_FLAG_DATA for data, BTRFS_EXTENT_FLAG_TREE_BLOCK for
 
1125
 * tree blocks and <0 on error.
 
1126
 */
 
1127
int extent_from_logical(struct btrfs_fs_info *fs_info, u64 logical,
 
1128
                        struct btrfs_path *path, struct btrfs_key *found_key,
 
1129
                        u64 *flags_ret)
 
1130
{
 
1131
        int ret;
 
1132
        u64 flags;
 
1133
        u64 size = 0;
 
1134
        u32 item_size;
 
1135
        struct extent_buffer *eb;
 
1136
        struct btrfs_extent_item *ei;
 
1137
        struct btrfs_key key;
 
1138
 
 
1139
        if (btrfs_fs_incompat(fs_info,
 
1140
                              BTRFS_FEATURE_INCOMPAT_SKINNY_METADATA))
 
1141
                key.type = BTRFS_METADATA_ITEM_KEY;
 
1142
        else
 
1143
                key.type = BTRFS_EXTENT_ITEM_KEY;
 
1144
        key.objectid = logical;
 
1145
        key.offset = (u64)-1;
 
1146
 
 
1147
        ret = btrfs_search_slot(NULL, fs_info->extent_root, &key, path, 0, 0);
 
1148
        if (ret < 0)
 
1149
                return ret;
 
1150
 
 
1151
        ret = btrfs_previous_extent_item(fs_info->extent_root, path, 0);
 
1152
        if (ret) {
 
1153
                if (ret > 0)
 
1154
                        ret = -ENOENT;
 
1155
                return ret;
 
1156
        }
 
1157
        btrfs_item_key_to_cpu(path->nodes[0], found_key, path->slots[0]);
 
1158
        if (found_key->type == BTRFS_METADATA_ITEM_KEY)
 
1159
                size = fs_info->extent_root->leafsize;
 
1160
        else if (found_key->type == BTRFS_EXTENT_ITEM_KEY)
 
1161
                size = found_key->offset;
 
1162
 
 
1163
        if (found_key->objectid > logical ||
 
1164
            found_key->objectid + size <= logical) {
 
1165
                pr_debug("logical %llu is not within any extent\n", logical);
 
1166
                return -ENOENT;
 
1167
        }
 
1168
 
 
1169
        eb = path->nodes[0];
 
1170
        item_size = btrfs_item_size_nr(eb, path->slots[0]);
 
1171
        BUG_ON(item_size < sizeof(*ei));
 
1172
 
 
1173
        ei = btrfs_item_ptr(eb, path->slots[0], struct btrfs_extent_item);
 
1174
        flags = btrfs_extent_flags(eb, ei);
 
1175
 
 
1176
        pr_debug("logical %llu is at position %llu within the extent (%llu "
 
1177
                 "EXTENT_ITEM %llu) flags %#llx size %u\n",
 
1178
                 logical, logical - found_key->objectid, found_key->objectid,
 
1179
                 found_key->offset, flags, item_size);
 
1180
 
 
1181
        WARN_ON(!flags_ret);
 
1182
        if (flags_ret) {
 
1183
                if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK)
 
1184
                        *flags_ret = BTRFS_EXTENT_FLAG_TREE_BLOCK;
 
1185
                else if (flags & BTRFS_EXTENT_FLAG_DATA)
 
1186
                        *flags_ret = BTRFS_EXTENT_FLAG_DATA;
 
1187
                else
 
1188
                        BUG_ON(1);
 
1189
                return 0;
 
1190
        }
 
1191
 
 
1192
        return -EIO;
 
1193
}
 
1194
 
 
1195
/*
 
1196
 * helper function to iterate extent inline refs. ptr must point to a 0 value
 
1197
 * for the first call and may be modified. it is used to track state.
 
1198
 * if more refs exist, 0 is returned and the next call to
 
1199
 * __get_extent_inline_ref must pass the modified ptr parameter to get the
 
1200
 * next ref. after the last ref was processed, 1 is returned.
 
1201
 * returns <0 on error
 
1202
 */
 
1203
static int __get_extent_inline_ref(unsigned long *ptr, struct extent_buffer *eb,
 
1204
                                   struct btrfs_key *key,
 
1205
                                   struct btrfs_extent_item *ei, u32 item_size,
 
1206
                                   struct btrfs_extent_inline_ref **out_eiref,
 
1207
                                   int *out_type)
 
1208
{
 
1209
        unsigned long end;
 
1210
        u64 flags;
 
1211
        struct btrfs_tree_block_info *info;
 
1212
 
 
1213
        if (!*ptr) {
 
1214
                /* first call */
 
1215
                flags = btrfs_extent_flags(eb, ei);
 
1216
                if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK) {
 
1217
                        if (key->type == BTRFS_METADATA_ITEM_KEY) {
 
1218
                                /* a skinny metadata extent */
 
1219
                                *out_eiref =
 
1220
                                     (struct btrfs_extent_inline_ref *)(ei + 1);
 
1221
                        } else {
 
1222
                                WARN_ON(key->type != BTRFS_EXTENT_ITEM_KEY);
 
1223
                                info = (struct btrfs_tree_block_info *)(ei + 1);
 
1224
                                *out_eiref =
 
1225
                                   (struct btrfs_extent_inline_ref *)(info + 1);
 
1226
                        }
 
1227
                } else {
 
1228
                        *out_eiref = (struct btrfs_extent_inline_ref *)(ei + 1);
 
1229
                }
 
1230
                *ptr = (unsigned long)*out_eiref;
 
1231
                if ((unsigned long)(*ptr) >= (unsigned long)ei + item_size)
 
1232
                        return -ENOENT;
 
1233
        }
 
1234
 
 
1235
        end = (unsigned long)ei + item_size;
 
1236
        *out_eiref = (struct btrfs_extent_inline_ref *)(*ptr);
 
1237
        *out_type = btrfs_extent_inline_ref_type(eb, *out_eiref);
 
1238
 
 
1239
        *ptr += btrfs_extent_inline_ref_size(*out_type);
 
1240
        WARN_ON(*ptr > end);
 
1241
        if (*ptr == end)
 
1242
                return 1; /* last */
 
1243
 
 
1244
        return 0;
 
1245
}
 
1246
 
 
1247
/*
 
1248
 * reads the tree block backref for an extent. tree level and root are returned
 
1249
 * through out_level and out_root. ptr must point to a 0 value for the first
 
1250
 * call and may be modified (see __get_extent_inline_ref comment).
 
1251
 * returns 0 if data was provided, 1 if there was no more data to provide or
 
1252
 * <0 on error.
 
1253
 */
 
1254
int tree_backref_for_extent(unsigned long *ptr, struct extent_buffer *eb,
 
1255
                            struct btrfs_key *key, struct btrfs_extent_item *ei,
 
1256
                            u32 item_size, u64 *out_root, u8 *out_level)
 
1257
{
 
1258
        int ret;
 
1259
        int type;
 
1260
        struct btrfs_tree_block_info *info;
 
1261
        struct btrfs_extent_inline_ref *eiref;
 
1262
 
 
1263
        if (*ptr == (unsigned long)-1)
 
1264
                return 1;
 
1265
 
 
1266
        while (1) {
 
1267
                ret = __get_extent_inline_ref(ptr, eb, key, ei, item_size,
 
1268
                                              &eiref, &type);
 
1269
                if (ret < 0)
 
1270
                        return ret;
 
1271
 
 
1272
                if (type == BTRFS_TREE_BLOCK_REF_KEY ||
 
1273
                    type == BTRFS_SHARED_BLOCK_REF_KEY)
 
1274
                        break;
 
1275
 
 
1276
                if (ret == 1)
 
1277
                        return 1;
 
1278
        }
 
1279
 
 
1280
        /* we can treat both ref types equally here */
 
1281
        info = (struct btrfs_tree_block_info *)(ei + 1);
 
1282
        *out_root = btrfs_extent_inline_ref_offset(eb, eiref);
 
1283
        *out_level = btrfs_tree_block_level(eb, info);
 
1284
 
 
1285
        if (ret == 1)
 
1286
                *ptr = (unsigned long)-1;
 
1287
 
 
1288
        return 0;
 
1289
}
 
1290
 
 
1291
static int iterate_leaf_refs(struct extent_inode_elem *inode_list,
 
1292
                                u64 root, u64 extent_item_objectid,
 
1293
                                iterate_extent_inodes_t *iterate, void *ctx)
 
1294
{
 
1295
        struct extent_inode_elem *eie;
 
1296
        int ret = 0;
 
1297
 
 
1298
        for (eie = inode_list; eie; eie = eie->next) {
 
1299
                pr_debug("ref for %llu resolved, key (%llu EXTEND_DATA %llu), "
 
1300
                         "root %llu\n", extent_item_objectid,
 
1301
                         eie->inum, eie->offset, root);
 
1302
                ret = iterate(eie->inum, eie->offset, root, ctx);
 
1303
                if (ret) {
 
1304
                        pr_debug("stopping iteration for %llu due to ret=%d\n",
 
1305
                                 extent_item_objectid, ret);
 
1306
                        break;
 
1307
                }
 
1308
        }
 
1309
 
 
1310
        return ret;
 
1311
}
 
1312
 
 
1313
/*
 
1314
 * calls iterate() for every inode that references the extent identified by
 
1315
 * the given parameters.
 
1316
 * when the iterator function returns a non-zero value, iteration stops.
 
1317
 */
 
1318
int iterate_extent_inodes(struct btrfs_fs_info *fs_info,
 
1319
                                u64 extent_item_objectid, u64 extent_item_pos,
 
1320
                                int search_commit_root,
 
1321
                                iterate_extent_inodes_t *iterate, void *ctx)
 
1322
{
 
1323
        int ret;
 
1324
        struct btrfs_trans_handle *trans = NULL;
 
1325
        struct ulist *refs = NULL;
 
1326
        struct ulist *roots = NULL;
 
1327
        struct ulist_node *ref_node = NULL;
 
1328
        struct ulist_node *root_node = NULL;
 
1329
        struct ulist_iterator ref_uiter;
 
1330
        struct ulist_iterator root_uiter;
 
1331
 
 
1332
        pr_debug("resolving all inodes for extent %llu\n",
 
1333
                        extent_item_objectid);
 
1334
 
 
1335
        ret = btrfs_find_all_leafs(trans, fs_info, extent_item_objectid,
 
1336
                                   0, &refs, &extent_item_pos);
 
1337
        if (ret)
 
1338
                goto out;
 
1339
 
 
1340
        ULIST_ITER_INIT(&ref_uiter);
 
1341
        while (!ret && (ref_node = ulist_next(refs, &ref_uiter))) {
 
1342
                ret = __btrfs_find_all_roots(trans, fs_info, ref_node->val,
 
1343
                                             0, &roots);
 
1344
                if (ret)
 
1345
                        break;
 
1346
                ULIST_ITER_INIT(&root_uiter);
 
1347
                while (!ret && (root_node = ulist_next(roots, &root_uiter))) {
 
1348
                        pr_debug("root %llu references leaf %llu, data list "
 
1349
                                 "%#llx\n", root_node->val, ref_node->val,
 
1350
                                 ref_node->aux);
 
1351
                        ret = iterate_leaf_refs((struct extent_inode_elem *)
 
1352
                                                (uintptr_t)ref_node->aux,
 
1353
                                                root_node->val,
 
1354
                                                extent_item_objectid,
 
1355
                                                iterate, ctx);
 
1356
                }
 
1357
                ulist_free(roots);
 
1358
        }
 
1359
 
 
1360
        free_leaf_list(refs);
 
1361
out:
 
1362
        return ret;
 
1363
}
 
1364
 
 
1365
int iterate_inodes_from_logical(u64 logical, struct btrfs_fs_info *fs_info,
 
1366
                                struct btrfs_path *path,
 
1367
                                iterate_extent_inodes_t *iterate, void *ctx)
 
1368
{
 
1369
        int ret;
 
1370
        u64 extent_item_pos;
 
1371
        u64 flags = 0;
 
1372
        struct btrfs_key found_key;
 
1373
        int search_commit_root = 0;
 
1374
 
 
1375
        ret = extent_from_logical(fs_info, logical, path, &found_key, &flags);
 
1376
        btrfs_release_path(path);
 
1377
        if (ret < 0)
 
1378
                return ret;
 
1379
        if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK)
 
1380
                return -EINVAL;
 
1381
 
 
1382
        extent_item_pos = logical - found_key.objectid;
 
1383
        ret = iterate_extent_inodes(fs_info, found_key.objectid,
 
1384
                                        extent_item_pos, search_commit_root,
 
1385
                                        iterate, ctx);
 
1386
 
 
1387
        return ret;
 
1388
}
 
1389
 
 
1390
typedef int (iterate_irefs_t)(u64 parent, u32 name_len, unsigned long name_off,
 
1391
                              struct extent_buffer *eb, void *ctx);
 
1392
 
 
1393
static int iterate_inode_refs(u64 inum, struct btrfs_root *fs_root,
 
1394
                              struct btrfs_path *path,
 
1395
                              iterate_irefs_t *iterate, void *ctx)
 
1396
{
 
1397
        int ret = 0;
 
1398
        int slot;
 
1399
        u32 cur;
 
1400
        u32 len;
 
1401
        u32 name_len;
 
1402
        u64 parent = 0;
 
1403
        int found = 0;
 
1404
        struct extent_buffer *eb;
 
1405
        struct btrfs_item *item;
 
1406
        struct btrfs_inode_ref *iref;
 
1407
        struct btrfs_key found_key;
 
1408
 
 
1409
        while (!ret) {
 
1410
                ret = inode_ref_info(inum, parent ? parent+1 : 0, fs_root, path,
 
1411
                                     &found_key);
 
1412
                if (ret < 0)
 
1413
                        break;
 
1414
                if (ret) {
 
1415
                        ret = found ? 0 : -ENOENT;
 
1416
                        break;
 
1417
                }
 
1418
                ++found;
 
1419
 
 
1420
                parent = found_key.offset;
 
1421
                slot = path->slots[0];
 
1422
                eb = btrfs_clone_extent_buffer(path->nodes[0]);
 
1423
                if (!eb) {
 
1424
                        ret = -ENOMEM;
 
1425
                        break;
 
1426
                }
 
1427
                extent_buffer_get(eb);
 
1428
                btrfs_release_path(path);
 
1429
 
 
1430
                item = btrfs_item_nr(slot);
 
1431
                iref = btrfs_item_ptr(eb, slot, struct btrfs_inode_ref);
 
1432
 
 
1433
                for (cur = 0; cur < btrfs_item_size(eb, item); cur += len) {
 
1434
                        name_len = btrfs_inode_ref_name_len(eb, iref);
 
1435
                        /* path must be released before calling iterate()! */
 
1436
                        pr_debug("following ref at offset %u for inode %llu in "
 
1437
                                 "tree %llu\n", cur, found_key.objectid,
 
1438
                                 fs_root->objectid);
 
1439
                        ret = iterate(parent, name_len,
 
1440
                                      (unsigned long)(iref + 1), eb, ctx);
 
1441
                        if (ret)
 
1442
                                break;
 
1443
                        len = sizeof(*iref) + name_len;
 
1444
                        iref = (struct btrfs_inode_ref *)((char *)iref + len);
 
1445
                }
 
1446
                free_extent_buffer(eb);
 
1447
        }
 
1448
 
 
1449
        btrfs_release_path(path);
 
1450
 
 
1451
        return ret;
 
1452
}
 
1453
 
 
1454
static int iterate_inode_extrefs(u64 inum, struct btrfs_root *fs_root,
 
1455
                                 struct btrfs_path *path,
 
1456
                                 iterate_irefs_t *iterate, void *ctx)
 
1457
{
 
1458
        int ret;
 
1459
        int slot;
 
1460
        u64 offset = 0;
 
1461
        u64 parent;
 
1462
        int found = 0;
 
1463
        struct extent_buffer *eb;
 
1464
        struct btrfs_inode_extref *extref;
 
1465
        struct extent_buffer *leaf;
 
1466
        u32 item_size;
 
1467
        u32 cur_offset;
 
1468
        unsigned long ptr;
 
1469
 
 
1470
        while (1) {
 
1471
                ret = btrfs_find_one_extref(fs_root, inum, offset, path, &extref,
 
1472
                                            &offset);
 
1473
                if (ret < 0)
 
1474
                        break;
 
1475
                if (ret) {
 
1476
                        ret = found ? 0 : -ENOENT;
 
1477
                        break;
 
1478
                }
 
1479
                ++found;
 
1480
 
 
1481
                slot = path->slots[0];
 
1482
                eb = btrfs_clone_extent_buffer(path->nodes[0]);
 
1483
                if (!eb) {
 
1484
                        ret = -ENOMEM;
 
1485
                        break;
 
1486
                }
 
1487
                extent_buffer_get(eb);
 
1488
 
 
1489
                btrfs_release_path(path);
 
1490
 
 
1491
                leaf = path->nodes[0];
 
1492
                item_size = btrfs_item_size_nr(leaf, slot);
 
1493
                ptr = btrfs_item_ptr_offset(leaf, slot);
 
1494
                cur_offset = 0;
 
1495
 
 
1496
                while (cur_offset < item_size) {
 
1497
                        u32 name_len;
 
1498
 
 
1499
                        extref = (struct btrfs_inode_extref *)(ptr + cur_offset);
 
1500
                        parent = btrfs_inode_extref_parent(eb, extref);
 
1501
                        name_len = btrfs_inode_extref_name_len(eb, extref);
 
1502
                        ret = iterate(parent, name_len,
 
1503
                                      (unsigned long)&extref->name, eb, ctx);
 
1504
                        if (ret)
 
1505
                                break;
 
1506
 
 
1507
                        cur_offset += btrfs_inode_extref_name_len(leaf, extref);
 
1508
                        cur_offset += sizeof(*extref);
 
1509
                }
 
1510
                free_extent_buffer(eb);
 
1511
 
 
1512
                offset++;
 
1513
        }
 
1514
 
 
1515
        btrfs_release_path(path);
 
1516
 
 
1517
        return ret;
 
1518
}
 
1519
 
 
1520
static int iterate_irefs(u64 inum, struct btrfs_root *fs_root,
 
1521
                         struct btrfs_path *path, iterate_irefs_t *iterate,
 
1522
                         void *ctx)
 
1523
{
 
1524
        int ret;
 
1525
        int found_refs = 0;
 
1526
 
 
1527
        ret = iterate_inode_refs(inum, fs_root, path, iterate, ctx);
 
1528
        if (!ret)
 
1529
                ++found_refs;
 
1530
        else if (ret != -ENOENT)
 
1531
                return ret;
 
1532
 
 
1533
        ret = iterate_inode_extrefs(inum, fs_root, path, iterate, ctx);
 
1534
        if (ret == -ENOENT && found_refs)
 
1535
                return 0;
 
1536
 
 
1537
        return ret;
 
1538
}
 
1539
 
 
1540
/*
 
1541
 * returns 0 if the path could be dumped (probably truncated)
 
1542
 * returns <0 in case of an error
 
1543
 */
 
1544
static int inode_to_path(u64 inum, u32 name_len, unsigned long name_off,
 
1545
                         struct extent_buffer *eb, void *ctx)
 
1546
{
 
1547
        struct inode_fs_paths *ipath = ctx;
 
1548
        char *fspath;
 
1549
        char *fspath_min;
 
1550
        int i = ipath->fspath->elem_cnt;
 
1551
        const int s_ptr = sizeof(char *);
 
1552
        u32 bytes_left;
 
1553
 
 
1554
        bytes_left = ipath->fspath->bytes_left > s_ptr ?
 
1555
                                        ipath->fspath->bytes_left - s_ptr : 0;
 
1556
 
 
1557
        fspath_min = (char *)ipath->fspath->val + (i + 1) * s_ptr;
 
1558
        fspath = btrfs_ref_to_path(ipath->fs_root, ipath->btrfs_path, name_len,
 
1559
                                   name_off, eb, inum, fspath_min, bytes_left);
 
1560
        if (IS_ERR(fspath))
 
1561
                return PTR_ERR(fspath);
 
1562
 
 
1563
        if (fspath > fspath_min) {
 
1564
                ipath->fspath->val[i] = (u64)(unsigned long)fspath;
 
1565
                ++ipath->fspath->elem_cnt;
 
1566
                ipath->fspath->bytes_left = fspath - fspath_min;
 
1567
        } else {
 
1568
                ++ipath->fspath->elem_missed;
 
1569
                ipath->fspath->bytes_missing += fspath_min - fspath;
 
1570
                ipath->fspath->bytes_left = 0;
 
1571
        }
 
1572
 
 
1573
        return 0;
 
1574
}
 
1575
 
 
1576
/*
 
1577
 * this dumps all file system paths to the inode into the ipath struct, provided
 
1578
 * is has been created large enough. each path is zero-terminated and accessed
 
1579
 * from ipath->fspath->val[i].
 
1580
 * when it returns, there are ipath->fspath->elem_cnt number of paths available
 
1581
 * in ipath->fspath->val[]. when the allocated space wasn't sufficient, the
 
1582
 * number of missed paths in recored in ipath->fspath->elem_missed, otherwise,
 
1583
 * it's zero. ipath->fspath->bytes_missing holds the number of bytes that would
 
1584
 * have been needed to return all paths.
 
1585
 */
 
1586
int paths_from_inode(u64 inum, struct inode_fs_paths *ipath)
 
1587
{
 
1588
        return iterate_irefs(inum, ipath->fs_root, ipath->btrfs_path,
 
1589
                             inode_to_path, ipath);
 
1590
}
 
1591
 
 
1592
struct btrfs_data_container *init_data_container(u32 total_bytes)
 
1593
{
 
1594
        struct btrfs_data_container *data;
 
1595
        size_t alloc_bytes;
 
1596
 
 
1597
        alloc_bytes = max_t(size_t, total_bytes, sizeof(*data));
 
1598
        data = vmalloc(alloc_bytes);
 
1599
        if (!data)
 
1600
                return ERR_PTR(-ENOMEM);
 
1601
 
 
1602
        if (total_bytes >= sizeof(*data)) {
 
1603
                data->bytes_left = total_bytes - sizeof(*data);
 
1604
                data->bytes_missing = 0;
 
1605
        } else {
 
1606
                data->bytes_missing = sizeof(*data) - total_bytes;
 
1607
                data->bytes_left = 0;
 
1608
        }
 
1609
 
 
1610
        data->elem_cnt = 0;
 
1611
        data->elem_missed = 0;
 
1612
 
 
1613
        return data;
 
1614
}
 
1615
 
 
1616
/*
 
1617
 * allocates space to return multiple file system paths for an inode.
 
1618
 * total_bytes to allocate are passed, note that space usable for actual path
 
1619
 * information will be total_bytes - sizeof(struct inode_fs_paths).
 
1620
 * the returned pointer must be freed with free_ipath() in the end.
 
1621
 */
 
1622
struct inode_fs_paths *init_ipath(s32 total_bytes, struct btrfs_root *fs_root,
 
1623
                                        struct btrfs_path *path)
 
1624
{
 
1625
        struct inode_fs_paths *ifp;
 
1626
        struct btrfs_data_container *fspath;
 
1627
 
 
1628
        fspath = init_data_container(total_bytes);
 
1629
        if (IS_ERR(fspath))
 
1630
                return (void *)fspath;
 
1631
 
 
1632
        ifp = kmalloc(sizeof(*ifp), GFP_NOFS);
 
1633
        if (!ifp) {
 
1634
                kfree(fspath);
 
1635
                return ERR_PTR(-ENOMEM);
 
1636
        }
 
1637
 
 
1638
        ifp->btrfs_path = path;
 
1639
        ifp->fspath = fspath;
 
1640
        ifp->fs_root = fs_root;
 
1641
 
 
1642
        return ifp;
 
1643
}
 
1644
 
 
1645
void free_ipath(struct inode_fs_paths *ipath)
 
1646
{
 
1647
        if (!ipath)
 
1648
                return;
 
1649
        vfree(ipath->fspath);
 
1650
        kfree(ipath);
 
1651
}