linux/fs/btrfs/backref.c
<<
>>
Prefs
   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 <linux/vmalloc.h>
  20#include "ctree.h"
  21#include "disk-io.h"
  22#include "backref.h"
  23#include "ulist.h"
  24#include "transaction.h"
  25#include "delayed-ref.h"
  26#include "locking.h"
  27
  28/* Just an arbitrary number so we can be sure this happened */
  29#define BACKREF_FOUND_SHARED 6
  30
  31struct extent_inode_elem {
  32        u64 inum;
  33        u64 offset;
  34        struct extent_inode_elem *next;
  35};
  36
  37static int check_extent_in_eb(struct btrfs_key *key, struct extent_buffer *eb,
  38                                struct btrfs_file_extent_item *fi,
  39                                u64 extent_item_pos,
  40                                struct extent_inode_elem **eie)
  41{
  42        u64 offset = 0;
  43        struct extent_inode_elem *e;
  44
  45        if (!btrfs_file_extent_compression(eb, fi) &&
  46            !btrfs_file_extent_encryption(eb, fi) &&
  47            !btrfs_file_extent_other_encoding(eb, fi)) {
  48                u64 data_offset;
  49                u64 data_len;
  50
  51                data_offset = btrfs_file_extent_offset(eb, fi);
  52                data_len = btrfs_file_extent_num_bytes(eb, fi);
  53
  54                if (extent_item_pos < data_offset ||
  55                    extent_item_pos >= data_offset + data_len)
  56                        return 1;
  57                offset = extent_item_pos - data_offset;
  58        }
  59
  60        e = kmalloc(sizeof(*e), GFP_NOFS);
  61        if (!e)
  62                return -ENOMEM;
  63
  64        e->next = *eie;
  65        e->inum = key->objectid;
  66        e->offset = key->offset + offset;
  67        *eie = e;
  68
  69        return 0;
  70}
  71
  72static void free_inode_elem_list(struct extent_inode_elem *eie)
  73{
  74        struct extent_inode_elem *eie_next;
  75
  76        for (; eie; eie = eie_next) {
  77                eie_next = eie->next;
  78                kfree(eie);
  79        }
  80}
  81
  82static int find_extent_in_eb(struct extent_buffer *eb, u64 wanted_disk_byte,
  83                                u64 extent_item_pos,
  84                                struct extent_inode_elem **eie)
  85{
  86        u64 disk_byte;
  87        struct btrfs_key key;
  88        struct btrfs_file_extent_item *fi;
  89        int slot;
  90        int nritems;
  91        int extent_type;
  92        int ret;
  93
  94        /*
  95         * from the shared data ref, we only have the leaf but we need
  96         * the key. thus, we must look into all items and see that we
  97         * find one (some) with a reference to our extent item.
  98         */
  99        nritems = btrfs_header_nritems(eb);
 100        for (slot = 0; slot < nritems; ++slot) {
 101                btrfs_item_key_to_cpu(eb, &key, slot);
 102                if (key.type != BTRFS_EXTENT_DATA_KEY)
 103                        continue;
 104                fi = btrfs_item_ptr(eb, slot, struct btrfs_file_extent_item);
 105                extent_type = btrfs_file_extent_type(eb, fi);
 106                if (extent_type == BTRFS_FILE_EXTENT_INLINE)
 107                        continue;
 108                /* don't skip BTRFS_FILE_EXTENT_PREALLOC, we can handle that */
 109                disk_byte = btrfs_file_extent_disk_bytenr(eb, fi);
 110                if (disk_byte != wanted_disk_byte)
 111                        continue;
 112
 113                ret = check_extent_in_eb(&key, eb, fi, extent_item_pos, eie);
 114                if (ret < 0)
 115                        return ret;
 116        }
 117
 118        return 0;
 119}
 120
 121/*
 122 * this structure records all encountered refs on the way up to the root
 123 */
 124struct __prelim_ref {
 125        struct list_head list;
 126        u64 root_id;
 127        struct btrfs_key key_for_search;
 128        int level;
 129        int count;
 130        struct extent_inode_elem *inode_list;
 131        u64 parent;
 132        u64 wanted_disk_byte;
 133};
 134
 135static struct kmem_cache *btrfs_prelim_ref_cache;
 136
 137int __init btrfs_prelim_ref_init(void)
 138{
 139        btrfs_prelim_ref_cache = kmem_cache_create("btrfs_prelim_ref",
 140                                        sizeof(struct __prelim_ref),
 141                                        0,
 142                                        SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD,
 143                                        NULL);
 144        if (!btrfs_prelim_ref_cache)
 145                return -ENOMEM;
 146        return 0;
 147}
 148
 149void btrfs_prelim_ref_exit(void)
 150{
 151        if (btrfs_prelim_ref_cache)
 152                kmem_cache_destroy(btrfs_prelim_ref_cache);
 153}
 154
 155/*
 156 * the rules for all callers of this function are:
 157 * - obtaining the parent is the goal
 158 * - if you add a key, you must know that it is a correct key
 159 * - if you cannot add the parent or a correct key, then we will look into the
 160 *   block later to set a correct key
 161 *
 162 * delayed refs
 163 * ============
 164 *        backref type | shared | indirect | shared | indirect
 165 * information         |   tree |     tree |   data |     data
 166 * --------------------+--------+----------+--------+----------
 167 *      parent logical |    y   |     -    |    -   |     -
 168 *      key to resolve |    -   |     y    |    y   |     y
 169 *  tree block logical |    -   |     -    |    -   |     -
 170 *  root for resolving |    y   |     y    |    y   |     y
 171 *
 172 * - column 1:       we've the parent -> done
 173 * - column 2, 3, 4: we use the key to find the parent
 174 *
 175 * on disk refs (inline or keyed)
 176 * ==============================
 177 *        backref type | shared | indirect | shared | indirect
 178 * information         |   tree |     tree |   data |     data
 179 * --------------------+--------+----------+--------+----------
 180 *      parent logical |    y   |     -    |    y   |     -
 181 *      key to resolve |    -   |     -    |    -   |     y
 182 *  tree block logical |    y   |     y    |    y   |     y
 183 *  root for resolving |    -   |     y    |    y   |     y
 184 *
 185 * - column 1, 3: we've the parent -> done
 186 * - column 2:    we take the first key from the block to find the parent
 187 *                (see __add_missing_keys)
 188 * - column 4:    we use the key to find the parent
 189 *
 190 * additional information that's available but not required to find the parent
 191 * block might help in merging entries to gain some speed.
 192 */
 193
 194static int __add_prelim_ref(struct list_head *head, u64 root_id,
 195                            struct btrfs_key *key, int level,
 196                            u64 parent, u64 wanted_disk_byte, int count,
 197                            gfp_t gfp_mask)
 198{
 199        struct __prelim_ref *ref;
 200
 201        if (root_id == BTRFS_DATA_RELOC_TREE_OBJECTID)
 202                return 0;
 203
 204        ref = kmem_cache_alloc(btrfs_prelim_ref_cache, gfp_mask);
 205        if (!ref)
 206                return -ENOMEM;
 207
 208        ref->root_id = root_id;
 209        if (key) {
 210                ref->key_for_search = *key;
 211                /*
 212                 * We can often find data backrefs with an offset that is too
 213                 * large (>= LLONG_MAX, maximum allowed file offset) due to
 214                 * underflows when subtracting a file's offset with the data
 215                 * offset of its corresponding extent data item. This can
 216                 * happen for example in the clone ioctl.
 217                 * So if we detect such case we set the search key's offset to
 218                 * zero to make sure we will find the matching file extent item
 219                 * at add_all_parents(), otherwise we will miss it because the
 220                 * offset taken form the backref is much larger then the offset
 221                 * of the file extent item. This can make us scan a very large
 222                 * number of file extent items, but at least it will not make
 223                 * us miss any.
 224                 * This is an ugly workaround for a behaviour that should have
 225                 * never existed, but it does and a fix for the clone ioctl
 226                 * would touch a lot of places, cause backwards incompatibility
 227                 * and would not fix the problem for extents cloned with older
 228                 * kernels.
 229                 */
 230                if (ref->key_for_search.type == BTRFS_EXTENT_DATA_KEY &&
 231                    ref->key_for_search.offset >= LLONG_MAX)
 232                        ref->key_for_search.offset = 0;
 233        } else {
 234                memset(&ref->key_for_search, 0, sizeof(ref->key_for_search));
 235        }
 236
 237        ref->inode_list = NULL;
 238        ref->level = level;
 239        ref->count = count;
 240        ref->parent = parent;
 241        ref->wanted_disk_byte = wanted_disk_byte;
 242        list_add_tail(&ref->list, head);
 243
 244        return 0;
 245}
 246
 247static int add_all_parents(struct btrfs_root *root, struct btrfs_path *path,
 248                           struct ulist *parents, struct __prelim_ref *ref,
 249                           int level, u64 time_seq, const u64 *extent_item_pos,
 250                           u64 total_refs)
 251{
 252        int ret = 0;
 253        int slot;
 254        struct extent_buffer *eb;
 255        struct btrfs_key key;
 256        struct btrfs_key *key_for_search = &ref->key_for_search;
 257        struct btrfs_file_extent_item *fi;
 258        struct extent_inode_elem *eie = NULL, *old = NULL;
 259        u64 disk_byte;
 260        u64 wanted_disk_byte = ref->wanted_disk_byte;
 261        u64 count = 0;
 262
 263        if (level != 0) {
 264                eb = path->nodes[level];
 265                ret = ulist_add(parents, eb->start, 0, GFP_NOFS);
 266                if (ret < 0)
 267                        return ret;
 268                return 0;
 269        }
 270
 271        /*
 272         * We normally enter this function with the path already pointing to
 273         * the first item to check. But sometimes, we may enter it with
 274         * slot==nritems. In that case, go to the next leaf before we continue.
 275         */
 276        if (path->slots[0] >= btrfs_header_nritems(path->nodes[0])) {
 277                if (time_seq == (u64)-1)
 278                        ret = btrfs_next_leaf(root, path);
 279                else
 280                        ret = btrfs_next_old_leaf(root, path, time_seq);
 281        }
 282
 283        while (!ret && count < total_refs) {
 284                eb = path->nodes[0];
 285                slot = path->slots[0];
 286
 287                btrfs_item_key_to_cpu(eb, &key, slot);
 288
 289                if (key.objectid != key_for_search->objectid ||
 290                    key.type != BTRFS_EXTENT_DATA_KEY)
 291                        break;
 292
 293                fi = btrfs_item_ptr(eb, slot, struct btrfs_file_extent_item);
 294                disk_byte = btrfs_file_extent_disk_bytenr(eb, fi);
 295
 296                if (disk_byte == wanted_disk_byte) {
 297                        eie = NULL;
 298                        old = NULL;
 299                        count++;
 300                        if (extent_item_pos) {
 301                                ret = check_extent_in_eb(&key, eb, fi,
 302                                                *extent_item_pos,
 303                                                &eie);
 304                                if (ret < 0)
 305                                        break;
 306                        }
 307                        if (ret > 0)
 308                                goto next;
 309                        ret = ulist_add_merge_ptr(parents, eb->start,
 310                                                  eie, (void **)&old, GFP_NOFS);
 311                        if (ret < 0)
 312                                break;
 313                        if (!ret && extent_item_pos) {
 314                                while (old->next)
 315                                        old = old->next;
 316                                old->next = eie;
 317                        }
 318                        eie = NULL;
 319                }
 320next:
 321                if (time_seq == (u64)-1)
 322                        ret = btrfs_next_item(root, path);
 323                else
 324                        ret = btrfs_next_old_item(root, path, time_seq);
 325        }
 326
 327        if (ret > 0)
 328                ret = 0;
 329        else if (ret < 0)
 330                free_inode_elem_list(eie);
 331        return ret;
 332}
 333
 334/*
 335 * resolve an indirect backref in the form (root_id, key, level)
 336 * to a logical address
 337 */
 338static int __resolve_indirect_ref(struct btrfs_fs_info *fs_info,
 339                                  struct btrfs_path *path, u64 time_seq,
 340                                  struct __prelim_ref *ref,
 341                                  struct ulist *parents,
 342                                  const u64 *extent_item_pos, u64 total_refs)
 343{
 344        struct btrfs_root *root;
 345        struct btrfs_key root_key;
 346        struct extent_buffer *eb;
 347        int ret = 0;
 348        int root_level;
 349        int level = ref->level;
 350        int index;
 351
 352        root_key.objectid = ref->root_id;
 353        root_key.type = BTRFS_ROOT_ITEM_KEY;
 354        root_key.offset = (u64)-1;
 355
 356        index = srcu_read_lock(&fs_info->subvol_srcu);
 357
 358        root = btrfs_read_fs_root_no_name(fs_info, &root_key);
 359        if (IS_ERR(root)) {
 360                srcu_read_unlock(&fs_info->subvol_srcu, index);
 361                ret = PTR_ERR(root);
 362                goto out;
 363        }
 364
 365        if (path->search_commit_root)
 366                root_level = btrfs_header_level(root->commit_root);
 367        else if (time_seq == (u64)-1)
 368                root_level = btrfs_header_level(root->node);
 369        else
 370                root_level = btrfs_old_root_level(root, time_seq);
 371
 372        if (root_level + 1 == level) {
 373                srcu_read_unlock(&fs_info->subvol_srcu, index);
 374                goto out;
 375        }
 376
 377        path->lowest_level = level;
 378        if (time_seq == (u64)-1)
 379                ret = btrfs_search_slot(NULL, root, &ref->key_for_search, path,
 380                                        0, 0);
 381        else
 382                ret = btrfs_search_old_slot(root, &ref->key_for_search, path,
 383                                            time_seq);
 384
 385        /* root node has been locked, we can release @subvol_srcu safely here */
 386        srcu_read_unlock(&fs_info->subvol_srcu, index);
 387
 388        pr_debug("search slot in root %llu (level %d, ref count %d) returned "
 389                 "%d for key (%llu %u %llu)\n",
 390                 ref->root_id, level, ref->count, ret,
 391                 ref->key_for_search.objectid, ref->key_for_search.type,
 392                 ref->key_for_search.offset);
 393        if (ret < 0)
 394                goto out;
 395
 396        eb = path->nodes[level];
 397        while (!eb) {
 398                if (WARN_ON(!level)) {
 399                        ret = 1;
 400                        goto out;
 401                }
 402                level--;
 403                eb = path->nodes[level];
 404        }
 405
 406        ret = add_all_parents(root, path, parents, ref, level, time_seq,
 407                              extent_item_pos, total_refs);
 408out:
 409        path->lowest_level = 0;
 410        btrfs_release_path(path);
 411        return ret;
 412}
 413
 414/*
 415 * resolve all indirect backrefs from the list
 416 */
 417static int __resolve_indirect_refs(struct btrfs_fs_info *fs_info,
 418                                   struct btrfs_path *path, u64 time_seq,
 419                                   struct list_head *head,
 420                                   const u64 *extent_item_pos, u64 total_refs,
 421                                   u64 root_objectid)
 422{
 423        int err;
 424        int ret = 0;
 425        struct __prelim_ref *ref;
 426        struct __prelim_ref *ref_safe;
 427        struct __prelim_ref *new_ref;
 428        struct ulist *parents;
 429        struct ulist_node *node;
 430        struct ulist_iterator uiter;
 431
 432        parents = ulist_alloc(GFP_NOFS);
 433        if (!parents)
 434                return -ENOMEM;
 435
 436        /*
 437         * _safe allows us to insert directly after the current item without
 438         * iterating over the newly inserted items.
 439         * we're also allowed to re-assign ref during iteration.
 440         */
 441        list_for_each_entry_safe(ref, ref_safe, head, list) {
 442                if (ref->parent)        /* already direct */
 443                        continue;
 444                if (ref->count == 0)
 445                        continue;
 446                if (root_objectid && ref->root_id != root_objectid) {
 447                        ret = BACKREF_FOUND_SHARED;
 448                        goto out;
 449                }
 450                err = __resolve_indirect_ref(fs_info, path, time_seq, ref,
 451                                             parents, extent_item_pos,
 452                                             total_refs);
 453                /*
 454                 * we can only tolerate ENOENT,otherwise,we should catch error
 455                 * and return directly.
 456                 */
 457                if (err == -ENOENT) {
 458                        continue;
 459                } else if (err) {
 460                        ret = err;
 461                        goto out;
 462                }
 463
 464                /* we put the first parent into the ref at hand */
 465                ULIST_ITER_INIT(&uiter);
 466                node = ulist_next(parents, &uiter);
 467                ref->parent = node ? node->val : 0;
 468                ref->inode_list = node ?
 469                        (struct extent_inode_elem *)(uintptr_t)node->aux : NULL;
 470
 471                /* additional parents require new refs being added here */
 472                while ((node = ulist_next(parents, &uiter))) {
 473                        new_ref = kmem_cache_alloc(btrfs_prelim_ref_cache,
 474                                                   GFP_NOFS);
 475                        if (!new_ref) {
 476                                ret = -ENOMEM;
 477                                goto out;
 478                        }
 479                        memcpy(new_ref, ref, sizeof(*ref));
 480                        new_ref->parent = node->val;
 481                        new_ref->inode_list = (struct extent_inode_elem *)
 482                                                        (uintptr_t)node->aux;
 483                        list_add(&new_ref->list, &ref->list);
 484                }
 485                ulist_reinit(parents);
 486        }
 487out:
 488        ulist_free(parents);
 489        return ret;
 490}
 491
 492static inline int ref_for_same_block(struct __prelim_ref *ref1,
 493                                     struct __prelim_ref *ref2)
 494{
 495        if (ref1->level != ref2->level)
 496                return 0;
 497        if (ref1->root_id != ref2->root_id)
 498                return 0;
 499        if (ref1->key_for_search.type != ref2->key_for_search.type)
 500                return 0;
 501        if (ref1->key_for_search.objectid != ref2->key_for_search.objectid)
 502                return 0;
 503        if (ref1->key_for_search.offset != ref2->key_for_search.offset)
 504                return 0;
 505        if (ref1->parent != ref2->parent)
 506                return 0;
 507
 508        return 1;
 509}
 510
 511/*
 512 * read tree blocks and add keys where required.
 513 */
 514static int __add_missing_keys(struct btrfs_fs_info *fs_info,
 515                              struct list_head *head)
 516{
 517        struct list_head *pos;
 518        struct extent_buffer *eb;
 519
 520        list_for_each(pos, head) {
 521                struct __prelim_ref *ref;
 522                ref = list_entry(pos, struct __prelim_ref, list);
 523
 524                if (ref->parent)
 525                        continue;
 526                if (ref->key_for_search.type)
 527                        continue;
 528                BUG_ON(!ref->wanted_disk_byte);
 529                eb = read_tree_block(fs_info->tree_root, ref->wanted_disk_byte,
 530                                     0);
 531                if (IS_ERR(eb)) {
 532                        return PTR_ERR(eb);
 533                } else if (!extent_buffer_uptodate(eb)) {
 534                        free_extent_buffer(eb);
 535                        return -EIO;
 536                }
 537                btrfs_tree_read_lock(eb);
 538                if (btrfs_header_level(eb) == 0)
 539                        btrfs_item_key_to_cpu(eb, &ref->key_for_search, 0);
 540                else
 541                        btrfs_node_key_to_cpu(eb, &ref->key_for_search, 0);
 542                btrfs_tree_read_unlock(eb);
 543                free_extent_buffer(eb);
 544        }
 545        return 0;
 546}
 547
 548/*
 549 * merge backrefs and adjust counts accordingly
 550 *
 551 * mode = 1: merge identical keys, if key is set
 552 *    FIXME: if we add more keys in __add_prelim_ref, we can merge more here.
 553 *           additionally, we could even add a key range for the blocks we
 554 *           looked into to merge even more (-> replace unresolved refs by those
 555 *           having a parent).
 556 * mode = 2: merge identical parents
 557 */
 558static void __merge_refs(struct list_head *head, int mode)
 559{
 560        struct list_head *pos1;
 561
 562        list_for_each(pos1, head) {
 563                struct list_head *n2;
 564                struct list_head *pos2;
 565                struct __prelim_ref *ref1;
 566
 567                ref1 = list_entry(pos1, struct __prelim_ref, list);
 568
 569                for (pos2 = pos1->next, n2 = pos2->next; pos2 != head;
 570                     pos2 = n2, n2 = pos2->next) {
 571                        struct __prelim_ref *ref2;
 572                        struct __prelim_ref *xchg;
 573                        struct extent_inode_elem *eie;
 574
 575                        ref2 = list_entry(pos2, struct __prelim_ref, list);
 576
 577                        if (!ref_for_same_block(ref1, ref2))
 578                                continue;
 579                        if (mode == 1) {
 580                                if (!ref1->parent && ref2->parent) {
 581                                        xchg = ref1;
 582                                        ref1 = ref2;
 583                                        ref2 = xchg;
 584                                }
 585                        } else {
 586                                if (ref1->parent != ref2->parent)
 587                                        continue;
 588                        }
 589
 590                        eie = ref1->inode_list;
 591                        while (eie && eie->next)
 592                                eie = eie->next;
 593                        if (eie)
 594                                eie->next = ref2->inode_list;
 595                        else
 596                                ref1->inode_list = ref2->inode_list;
 597                        ref1->count += ref2->count;
 598
 599                        list_del(&ref2->list);
 600                        kmem_cache_free(btrfs_prelim_ref_cache, ref2);
 601                }
 602
 603        }
 604}
 605
 606/*
 607 * add all currently queued delayed refs from this head whose seq nr is
 608 * smaller or equal that seq to the list
 609 */
 610static int __add_delayed_refs(struct btrfs_delayed_ref_head *head, u64 seq,
 611                              struct list_head *prefs, u64 *total_refs,
 612                              u64 inum)
 613{
 614        struct btrfs_delayed_ref_node *node;
 615        struct btrfs_delayed_extent_op *extent_op = head->extent_op;
 616        struct btrfs_key key;
 617        struct btrfs_key op_key = {0};
 618        int sgn;
 619        int ret = 0;
 620
 621        if (extent_op && extent_op->update_key)
 622                btrfs_disk_key_to_cpu(&op_key, &extent_op->key);
 623
 624        spin_lock(&head->lock);
 625        list_for_each_entry(node, &head->ref_list, list) {
 626                if (node->seq > seq)
 627                        continue;
 628
 629                switch (node->action) {
 630                case BTRFS_ADD_DELAYED_EXTENT:
 631                case BTRFS_UPDATE_DELAYED_HEAD:
 632                        WARN_ON(1);
 633                        continue;
 634                case BTRFS_ADD_DELAYED_REF:
 635                        sgn = 1;
 636                        break;
 637                case BTRFS_DROP_DELAYED_REF:
 638                        sgn = -1;
 639                        break;
 640                default:
 641                        BUG_ON(1);
 642                }
 643                *total_refs += (node->ref_mod * sgn);
 644                switch (node->type) {
 645                case BTRFS_TREE_BLOCK_REF_KEY: {
 646                        struct btrfs_delayed_tree_ref *ref;
 647
 648                        ref = btrfs_delayed_node_to_tree_ref(node);
 649                        ret = __add_prelim_ref(prefs, ref->root, &op_key,
 650                                               ref->level + 1, 0, node->bytenr,
 651                                               node->ref_mod * sgn, GFP_ATOMIC);
 652                        break;
 653                }
 654                case BTRFS_SHARED_BLOCK_REF_KEY: {
 655                        struct btrfs_delayed_tree_ref *ref;
 656
 657                        ref = btrfs_delayed_node_to_tree_ref(node);
 658                        ret = __add_prelim_ref(prefs, 0, NULL,
 659                                               ref->level + 1, ref->parent,
 660                                               node->bytenr,
 661                                               node->ref_mod * sgn, GFP_ATOMIC);
 662                        break;
 663                }
 664                case BTRFS_EXTENT_DATA_REF_KEY: {
 665                        struct btrfs_delayed_data_ref *ref;
 666                        ref = btrfs_delayed_node_to_data_ref(node);
 667
 668                        key.objectid = ref->objectid;
 669                        key.type = BTRFS_EXTENT_DATA_KEY;
 670                        key.offset = ref->offset;
 671
 672                        /*
 673                         * Found a inum that doesn't match our known inum, we
 674                         * know it's shared.
 675                         */
 676                        if (inum && ref->objectid != inum) {
 677                                ret = BACKREF_FOUND_SHARED;
 678                                break;
 679                        }
 680
 681                        ret = __add_prelim_ref(prefs, ref->root, &key, 0, 0,
 682                                               node->bytenr,
 683                                               node->ref_mod * sgn, GFP_ATOMIC);
 684                        break;
 685                }
 686                case BTRFS_SHARED_DATA_REF_KEY: {
 687                        struct btrfs_delayed_data_ref *ref;
 688
 689                        ref = btrfs_delayed_node_to_data_ref(node);
 690                        ret = __add_prelim_ref(prefs, 0, NULL, 0,
 691                                               ref->parent, node->bytenr,
 692                                               node->ref_mod * sgn, GFP_ATOMIC);
 693                        break;
 694                }
 695                default:
 696                        WARN_ON(1);
 697                }
 698                if (ret)
 699                        break;
 700        }
 701        spin_unlock(&head->lock);
 702        return ret;
 703}
 704
 705/*
 706 * add all inline backrefs for bytenr to the list
 707 */
 708static int __add_inline_refs(struct btrfs_fs_info *fs_info,
 709                             struct btrfs_path *path, u64 bytenr,
 710                             int *info_level, struct list_head *prefs,
 711                             u64 *total_refs, u64 inum)
 712{
 713        int ret = 0;
 714        int slot;
 715        struct extent_buffer *leaf;
 716        struct btrfs_key key;
 717        struct btrfs_key found_key;
 718        unsigned long ptr;
 719        unsigned long end;
 720        struct btrfs_extent_item *ei;
 721        u64 flags;
 722        u64 item_size;
 723
 724        /*
 725         * enumerate all inline refs
 726         */
 727        leaf = path->nodes[0];
 728        slot = path->slots[0];
 729
 730        item_size = btrfs_item_size_nr(leaf, slot);
 731        BUG_ON(item_size < sizeof(*ei));
 732
 733        ei = btrfs_item_ptr(leaf, slot, struct btrfs_extent_item);
 734        flags = btrfs_extent_flags(leaf, ei);
 735        *total_refs += btrfs_extent_refs(leaf, ei);
 736        btrfs_item_key_to_cpu(leaf, &found_key, slot);
 737
 738        ptr = (unsigned long)(ei + 1);
 739        end = (unsigned long)ei + item_size;
 740
 741        if (found_key.type == BTRFS_EXTENT_ITEM_KEY &&
 742            flags & BTRFS_EXTENT_FLAG_TREE_BLOCK) {
 743                struct btrfs_tree_block_info *info;
 744
 745                info = (struct btrfs_tree_block_info *)ptr;
 746                *info_level = btrfs_tree_block_level(leaf, info);
 747                ptr += sizeof(struct btrfs_tree_block_info);
 748                BUG_ON(ptr > end);
 749        } else if (found_key.type == BTRFS_METADATA_ITEM_KEY) {
 750                *info_level = found_key.offset;
 751        } else {
 752                BUG_ON(!(flags & BTRFS_EXTENT_FLAG_DATA));
 753        }
 754
 755        while (ptr < end) {
 756                struct btrfs_extent_inline_ref *iref;
 757                u64 offset;
 758                int type;
 759
 760                iref = (struct btrfs_extent_inline_ref *)ptr;
 761                type = btrfs_extent_inline_ref_type(leaf, iref);
 762                offset = btrfs_extent_inline_ref_offset(leaf, iref);
 763
 764                switch (type) {
 765                case BTRFS_SHARED_BLOCK_REF_KEY:
 766                        ret = __add_prelim_ref(prefs, 0, NULL,
 767                                                *info_level + 1, offset,
 768                                                bytenr, 1, GFP_NOFS);
 769                        break;
 770                case BTRFS_SHARED_DATA_REF_KEY: {
 771                        struct btrfs_shared_data_ref *sdref;
 772                        int count;
 773
 774                        sdref = (struct btrfs_shared_data_ref *)(iref + 1);
 775                        count = btrfs_shared_data_ref_count(leaf, sdref);
 776                        ret = __add_prelim_ref(prefs, 0, NULL, 0, offset,
 777                                               bytenr, count, GFP_NOFS);
 778                        break;
 779                }
 780                case BTRFS_TREE_BLOCK_REF_KEY:
 781                        ret = __add_prelim_ref(prefs, offset, NULL,
 782                                               *info_level + 1, 0,
 783                                               bytenr, 1, GFP_NOFS);
 784                        break;
 785                case BTRFS_EXTENT_DATA_REF_KEY: {
 786                        struct btrfs_extent_data_ref *dref;
 787                        int count;
 788                        u64 root;
 789
 790                        dref = (struct btrfs_extent_data_ref *)(&iref->offset);
 791                        count = btrfs_extent_data_ref_count(leaf, dref);
 792                        key.objectid = btrfs_extent_data_ref_objectid(leaf,
 793                                                                      dref);
 794                        key.type = BTRFS_EXTENT_DATA_KEY;
 795                        key.offset = btrfs_extent_data_ref_offset(leaf, dref);
 796
 797                        if (inum && key.objectid != inum) {
 798                                ret = BACKREF_FOUND_SHARED;
 799                                break;
 800                        }
 801
 802                        root = btrfs_extent_data_ref_root(leaf, dref);
 803                        ret = __add_prelim_ref(prefs, root, &key, 0, 0,
 804                                               bytenr, count, GFP_NOFS);
 805                        break;
 806                }
 807                default:
 808                        WARN_ON(1);
 809                }
 810                if (ret)
 811                        return ret;
 812                ptr += btrfs_extent_inline_ref_size(type);
 813        }
 814
 815        return 0;
 816}
 817
 818/*
 819 * add all non-inline backrefs for bytenr to the list
 820 */
 821static int __add_keyed_refs(struct btrfs_fs_info *fs_info,
 822                            struct btrfs_path *path, u64 bytenr,
 823                            int info_level, struct list_head *prefs, u64 inum)
 824{
 825        struct btrfs_root *extent_root = fs_info->extent_root;
 826        int ret;
 827        int slot;
 828        struct extent_buffer *leaf;
 829        struct btrfs_key key;
 830
 831        while (1) {
 832                ret = btrfs_next_item(extent_root, path);
 833                if (ret < 0)
 834                        break;
 835                if (ret) {
 836                        ret = 0;
 837                        break;
 838                }
 839
 840                slot = path->slots[0];
 841                leaf = path->nodes[0];
 842                btrfs_item_key_to_cpu(leaf, &key, slot);
 843
 844                if (key.objectid != bytenr)
 845                        break;
 846                if (key.type < BTRFS_TREE_BLOCK_REF_KEY)
 847                        continue;
 848                if (key.type > BTRFS_SHARED_DATA_REF_KEY)
 849                        break;
 850
 851                switch (key.type) {
 852                case BTRFS_SHARED_BLOCK_REF_KEY:
 853                        ret = __add_prelim_ref(prefs, 0, NULL,
 854                                                info_level + 1, key.offset,
 855                                                bytenr, 1, GFP_NOFS);
 856                        break;
 857                case BTRFS_SHARED_DATA_REF_KEY: {
 858                        struct btrfs_shared_data_ref *sdref;
 859                        int count;
 860
 861                        sdref = btrfs_item_ptr(leaf, slot,
 862                                              struct btrfs_shared_data_ref);
 863                        count = btrfs_shared_data_ref_count(leaf, sdref);
 864                        ret = __add_prelim_ref(prefs, 0, NULL, 0, key.offset,
 865                                                bytenr, count, GFP_NOFS);
 866                        break;
 867                }
 868                case BTRFS_TREE_BLOCK_REF_KEY:
 869                        ret = __add_prelim_ref(prefs, key.offset, NULL,
 870                                               info_level + 1, 0,
 871                                               bytenr, 1, GFP_NOFS);
 872                        break;
 873                case BTRFS_EXTENT_DATA_REF_KEY: {
 874                        struct btrfs_extent_data_ref *dref;
 875                        int count;
 876                        u64 root;
 877
 878                        dref = btrfs_item_ptr(leaf, slot,
 879                                              struct btrfs_extent_data_ref);
 880                        count = btrfs_extent_data_ref_count(leaf, dref);
 881                        key.objectid = btrfs_extent_data_ref_objectid(leaf,
 882                                                                      dref);
 883                        key.type = BTRFS_EXTENT_DATA_KEY;
 884                        key.offset = btrfs_extent_data_ref_offset(leaf, dref);
 885
 886                        if (inum && key.objectid != inum) {
 887                                ret = BACKREF_FOUND_SHARED;
 888                                break;
 889                        }
 890
 891                        root = btrfs_extent_data_ref_root(leaf, dref);
 892                        ret = __add_prelim_ref(prefs, root, &key, 0, 0,
 893                                               bytenr, count, GFP_NOFS);
 894                        break;
 895                }
 896                default:
 897                        WARN_ON(1);
 898                }
 899                if (ret)
 900                        return ret;
 901
 902        }
 903
 904        return ret;
 905}
 906
 907/*
 908 * this adds all existing backrefs (inline backrefs, backrefs and delayed
 909 * refs) for the given bytenr to the refs list, merges duplicates and resolves
 910 * indirect refs to their parent bytenr.
 911 * When roots are found, they're added to the roots list
 912 *
 913 * NOTE: This can return values > 0
 914 *
 915 * If time_seq is set to (u64)-1, it will not search delayed_refs, and behave
 916 * much like trans == NULL case, the difference only lies in it will not
 917 * commit root.
 918 * The special case is for qgroup to search roots in commit_transaction().
 919 *
 920 * FIXME some caching might speed things up
 921 */
 922static int find_parent_nodes(struct btrfs_trans_handle *trans,
 923                             struct btrfs_fs_info *fs_info, u64 bytenr,
 924                             u64 time_seq, struct ulist *refs,
 925                             struct ulist *roots, const u64 *extent_item_pos,
 926                             u64 root_objectid, u64 inum)
 927{
 928        struct btrfs_key key;
 929        struct btrfs_path *path;
 930        struct btrfs_delayed_ref_root *delayed_refs = NULL;
 931        struct btrfs_delayed_ref_head *head;
 932        int info_level = 0;
 933        int ret;
 934        struct list_head prefs_delayed;
 935        struct list_head prefs;
 936        struct __prelim_ref *ref;
 937        struct extent_inode_elem *eie = NULL;
 938        u64 total_refs = 0;
 939
 940        INIT_LIST_HEAD(&prefs);
 941        INIT_LIST_HEAD(&prefs_delayed);
 942
 943        key.objectid = bytenr;
 944        key.offset = (u64)-1;
 945        if (btrfs_fs_incompat(fs_info, SKINNY_METADATA))
 946                key.type = BTRFS_METADATA_ITEM_KEY;
 947        else
 948                key.type = BTRFS_EXTENT_ITEM_KEY;
 949
 950        path = btrfs_alloc_path();
 951        if (!path)
 952                return -ENOMEM;
 953        if (!trans) {
 954                path->search_commit_root = 1;
 955                path->skip_locking = 1;
 956        }
 957
 958        if (time_seq == (u64)-1)
 959                path->skip_locking = 1;
 960
 961        /*
 962         * grab both a lock on the path and a lock on the delayed ref head.
 963         * We need both to get a consistent picture of how the refs look
 964         * at a specified point in time
 965         */
 966again:
 967        head = NULL;
 968
 969        ret = btrfs_search_slot(trans, fs_info->extent_root, &key, path, 0, 0);
 970        if (ret < 0)
 971                goto out;
 972        BUG_ON(ret == 0);
 973
 974#ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS
 975        if (trans && likely(trans->type != __TRANS_DUMMY) &&
 976            time_seq != (u64)-1) {
 977#else
 978        if (trans && time_seq != (u64)-1) {
 979#endif
 980                /*
 981                 * look if there are updates for this ref queued and lock the
 982                 * head
 983                 */
 984                delayed_refs = &trans->transaction->delayed_refs;
 985                spin_lock(&delayed_refs->lock);
 986                head = btrfs_find_delayed_ref_head(trans, bytenr);
 987                if (head) {
 988                        if (!mutex_trylock(&head->mutex)) {
 989                                atomic_inc(&head->node.refs);
 990                                spin_unlock(&delayed_refs->lock);
 991
 992                                btrfs_release_path(path);
 993
 994                                /*
 995                                 * Mutex was contended, block until it's
 996                                 * released and try again
 997                                 */
 998                                mutex_lock(&head->mutex);
 999                                mutex_unlock(&head->mutex);
1000                                btrfs_put_delayed_ref(&head->node);
1001                                goto again;
1002                        }
1003                        spin_unlock(&delayed_refs->lock);
1004                        ret = __add_delayed_refs(head, time_seq,
1005                                                 &prefs_delayed, &total_refs,
1006                                                 inum);
1007                        mutex_unlock(&head->mutex);
1008                        if (ret)
1009                                goto out;
1010                } else {
1011                        spin_unlock(&delayed_refs->lock);
1012                }
1013        }
1014
1015        if (path->slots[0]) {
1016                struct extent_buffer *leaf;
1017                int slot;
1018
1019                path->slots[0]--;
1020                leaf = path->nodes[0];
1021                slot = path->slots[0];
1022                btrfs_item_key_to_cpu(leaf, &key, slot);
1023                if (key.objectid == bytenr &&
1024                    (key.type == BTRFS_EXTENT_ITEM_KEY ||
1025                     key.type == BTRFS_METADATA_ITEM_KEY)) {
1026                        ret = __add_inline_refs(fs_info, path, bytenr,
1027                                                &info_level, &prefs,
1028                                                &total_refs, inum);
1029                        if (ret)
1030                                goto out;
1031                        ret = __add_keyed_refs(fs_info, path, bytenr,
1032                                               info_level, &prefs, inum);
1033                        if (ret)
1034                                goto out;
1035                }
1036        }
1037        btrfs_release_path(path);
1038
1039        list_splice_init(&prefs_delayed, &prefs);
1040
1041        ret = __add_missing_keys(fs_info, &prefs);
1042        if (ret)
1043                goto out;
1044
1045        __merge_refs(&prefs, 1);
1046
1047        ret = __resolve_indirect_refs(fs_info, path, time_seq, &prefs,
1048                                      extent_item_pos, total_refs,
1049                                      root_objectid);
1050        if (ret)
1051                goto out;
1052
1053        __merge_refs(&prefs, 2);
1054
1055        while (!list_empty(&prefs)) {
1056                ref = list_first_entry(&prefs, struct __prelim_ref, list);
1057                WARN_ON(ref->count < 0);
1058                if (roots && ref->count && ref->root_id && ref->parent == 0) {
1059                        if (root_objectid && ref->root_id != root_objectid) {
1060                                ret = BACKREF_FOUND_SHARED;
1061                                goto out;
1062                        }
1063
1064                        /* no parent == root of tree */
1065                        ret = ulist_add(roots, ref->root_id, 0, GFP_NOFS);
1066                        if (ret < 0)
1067                                goto out;
1068                }
1069                if (ref->count && ref->parent) {
1070                        if (extent_item_pos && !ref->inode_list &&
1071                            ref->level == 0) {
1072                                struct extent_buffer *eb;
1073
1074                                eb = read_tree_block(fs_info->extent_root,
1075                                                           ref->parent, 0);
1076                                if (IS_ERR(eb)) {
1077                                        ret = PTR_ERR(eb);
1078                                        goto out;
1079                                } else if (!extent_buffer_uptodate(eb)) {
1080                                        free_extent_buffer(eb);
1081                                        ret = -EIO;
1082                                        goto out;
1083                                }
1084                                btrfs_tree_read_lock(eb);
1085                                btrfs_set_lock_blocking_rw(eb, BTRFS_READ_LOCK);
1086                                ret = find_extent_in_eb(eb, bytenr,
1087                                                        *extent_item_pos, &eie);
1088                                btrfs_tree_read_unlock_blocking(eb);
1089                                free_extent_buffer(eb);
1090                                if (ret < 0)
1091                                        goto out;
1092                                ref->inode_list = eie;
1093                        }
1094                        ret = ulist_add_merge_ptr(refs, ref->parent,
1095                                                  ref->inode_list,
1096                                                  (void **)&eie, GFP_NOFS);
1097                        if (ret < 0)
1098                                goto out;
1099                        if (!ret && extent_item_pos) {
1100                                /*
1101                                 * we've recorded that parent, so we must extend
1102                                 * its inode list here
1103                                 */
1104                                BUG_ON(!eie);
1105                                while (eie->next)
1106                                        eie = eie->next;
1107                                eie->next = ref->inode_list;
1108                        }
1109                        eie = NULL;
1110                }
1111                list_del(&ref->list);
1112                kmem_cache_free(btrfs_prelim_ref_cache, ref);
1113        }
1114
1115out:
1116        btrfs_free_path(path);
1117        while (!list_empty(&prefs)) {
1118                ref = list_first_entry(&prefs, struct __prelim_ref, list);
1119                list_del(&ref->list);
1120                kmem_cache_free(btrfs_prelim_ref_cache, ref);
1121        }
1122        while (!list_empty(&prefs_delayed)) {
1123                ref = list_first_entry(&prefs_delayed, struct __prelim_ref,
1124                                       list);
1125                list_del(&ref->list);
1126                kmem_cache_free(btrfs_prelim_ref_cache, ref);
1127        }
1128        if (ret < 0)
1129                free_inode_elem_list(eie);
1130        return ret;
1131}
1132
1133static void free_leaf_list(struct ulist *blocks)
1134{
1135        struct ulist_node *node = NULL;
1136        struct extent_inode_elem *eie;
1137        struct ulist_iterator uiter;
1138
1139        ULIST_ITER_INIT(&uiter);
1140        while ((node = ulist_next(blocks, &uiter))) {
1141                if (!node->aux)
1142                        continue;
1143                eie = (struct extent_inode_elem *)(uintptr_t)node->aux;
1144                free_inode_elem_list(eie);
1145                node->aux = 0;
1146        }
1147
1148        ulist_free(blocks);
1149}
1150
1151/*
1152 * Finds all leafs with a reference to the specified combination of bytenr and
1153 * offset. key_list_head will point to a list of corresponding keys (caller must
1154 * free each list element). The leafs will be stored in the leafs ulist, which
1155 * must be freed with ulist_free.
1156 *
1157 * returns 0 on success, <0 on error
1158 */
1159static int btrfs_find_all_leafs(struct btrfs_trans_handle *trans,
1160                                struct btrfs_fs_info *fs_info, u64 bytenr,
1161                                u64 time_seq, struct ulist **leafs,
1162                                const u64 *extent_item_pos)
1163{
1164        int ret;
1165
1166        *leafs = ulist_alloc(GFP_NOFS);
1167        if (!*leafs)
1168                return -ENOMEM;
1169
1170        ret = find_parent_nodes(trans, fs_info, bytenr,
1171                                time_seq, *leafs, NULL, extent_item_pos, 0, 0);
1172        if (ret < 0 && ret != -ENOENT) {
1173                free_leaf_list(*leafs);
1174                return ret;
1175        }
1176
1177        return 0;
1178}
1179
1180/*
1181 * walk all backrefs for a given extent to find all roots that reference this
1182 * extent. Walking a backref means finding all extents that reference this
1183 * extent and in turn walk the backrefs of those, too. Naturally this is a
1184 * recursive process, but here it is implemented in an iterative fashion: We
1185 * find all referencing extents for the extent in question and put them on a
1186 * list. In turn, we find all referencing extents for those, further appending
1187 * to the list. The way we iterate the list allows adding more elements after
1188 * the current while iterating. The process stops when we reach the end of the
1189 * list. Found roots are added to the roots list.
1190 *
1191 * returns 0 on success, < 0 on error.
1192 */
1193static int __btrfs_find_all_roots(struct btrfs_trans_handle *trans,
1194                                  struct btrfs_fs_info *fs_info, u64 bytenr,
1195                                  u64 time_seq, struct ulist **roots)
1196{
1197        struct ulist *tmp;
1198        struct ulist_node *node = NULL;
1199        struct ulist_iterator uiter;
1200        int ret;
1201
1202        tmp = ulist_alloc(GFP_NOFS);
1203        if (!tmp)
1204                return -ENOMEM;
1205        *roots = ulist_alloc(GFP_NOFS);
1206        if (!*roots) {
1207                ulist_free(tmp);
1208                return -ENOMEM;
1209        }
1210
1211        ULIST_ITER_INIT(&uiter);
1212        while (1) {
1213                ret = find_parent_nodes(trans, fs_info, bytenr,
1214                                        time_seq, tmp, *roots, NULL, 0, 0);
1215                if (ret < 0 && ret != -ENOENT) {
1216                        ulist_free(tmp);
1217                        ulist_free(*roots);
1218                        return ret;
1219                }
1220                node = ulist_next(tmp, &uiter);
1221                if (!node)
1222                        break;
1223                bytenr = node->val;
1224                cond_resched();
1225        }
1226
1227        ulist_free(tmp);
1228        return 0;
1229}
1230
1231int btrfs_find_all_roots(struct btrfs_trans_handle *trans,
1232                         struct btrfs_fs_info *fs_info, u64 bytenr,
1233                         u64 time_seq, struct ulist **roots)
1234{
1235        int ret;
1236
1237        if (!trans)
1238                down_read(&fs_info->commit_root_sem);
1239        ret = __btrfs_find_all_roots(trans, fs_info, bytenr, time_seq, roots);
1240        if (!trans)
1241                up_read(&fs_info->commit_root_sem);
1242        return ret;
1243}
1244
1245/**
1246 * btrfs_check_shared - tell us whether an extent is shared
1247 *
1248 * @trans: optional trans handle
1249 *
1250 * btrfs_check_shared uses the backref walking code but will short
1251 * circuit as soon as it finds a root or inode that doesn't match the
1252 * one passed in. This provides a significant performance benefit for
1253 * callers (such as fiemap) which want to know whether the extent is
1254 * shared but do not need a ref count.
1255 *
1256 * Return: 0 if extent is not shared, 1 if it is shared, < 0 on error.
1257 */
1258int btrfs_check_shared(struct btrfs_trans_handle *trans,
1259                       struct btrfs_fs_info *fs_info, u64 root_objectid,
1260                       u64 inum, u64 bytenr)
1261{
1262        struct ulist *tmp = NULL;
1263        struct ulist *roots = NULL;
1264        struct ulist_iterator uiter;
1265        struct ulist_node *node;
1266        struct seq_list elem = SEQ_LIST_INIT(elem);
1267        int ret = 0;
1268
1269        tmp = ulist_alloc(GFP_NOFS);
1270        roots = ulist_alloc(GFP_NOFS);
1271        if (!tmp || !roots) {
1272                ulist_free(tmp);
1273                ulist_free(roots);
1274                return -ENOMEM;
1275        }
1276
1277        if (trans)
1278                btrfs_get_tree_mod_seq(fs_info, &elem);
1279        else
1280                down_read(&fs_info->commit_root_sem);
1281        ULIST_ITER_INIT(&uiter);
1282        while (1) {
1283                ret = find_parent_nodes(trans, fs_info, bytenr, elem.seq, tmp,
1284                                        roots, NULL, root_objectid, inum);
1285                if (ret == BACKREF_FOUND_SHARED) {
1286                        /* this is the only condition under which we return 1 */
1287                        ret = 1;
1288                        break;
1289                }
1290                if (ret < 0 && ret != -ENOENT)
1291                        break;
1292                ret = 0;
1293                node = ulist_next(tmp, &uiter);
1294                if (!node)
1295                        break;
1296                bytenr = node->val;
1297                cond_resched();
1298        }
1299        if (trans)
1300                btrfs_put_tree_mod_seq(fs_info, &elem);
1301        else
1302                up_read(&fs_info->commit_root_sem);
1303        ulist_free(tmp);
1304        ulist_free(roots);
1305        return ret;
1306}
1307
1308int btrfs_find_one_extref(struct btrfs_root *root, u64 inode_objectid,
1309                          u64 start_off, struct btrfs_path *path,
1310                          struct btrfs_inode_extref **ret_extref,
1311                          u64 *found_off)
1312{
1313        int ret, slot;
1314        struct btrfs_key key;
1315        struct btrfs_key found_key;
1316        struct btrfs_inode_extref *extref;
1317        struct extent_buffer *leaf;
1318        unsigned long ptr;
1319
1320        key.objectid = inode_objectid;
1321        key.type = BTRFS_INODE_EXTREF_KEY;
1322        key.offset = start_off;
1323
1324        ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
1325        if (ret < 0)
1326                return ret;
1327
1328        while (1) {
1329                leaf = path->nodes[0];
1330                slot = path->slots[0];
1331                if (slot >= btrfs_header_nritems(leaf)) {
1332                        /*
1333                         * If the item at offset is not found,
1334                         * btrfs_search_slot will point us to the slot
1335                         * where it should be inserted. In our case
1336                         * that will be the slot directly before the
1337                         * next INODE_REF_KEY_V2 item. In the case
1338                         * that we're pointing to the last slot in a
1339                         * leaf, we must move one leaf over.
1340                         */
1341                        ret = btrfs_next_leaf(root, path);
1342                        if (ret) {
1343                                if (ret >= 1)
1344                                        ret = -ENOENT;
1345                                break;
1346                        }
1347                        continue;
1348                }
1349
1350                btrfs_item_key_to_cpu(leaf, &found_key, slot);
1351
1352                /*
1353                 * Check that we're still looking at an extended ref key for
1354                 * this particular objectid. If we have different
1355                 * objectid or type then there are no more to be found
1356                 * in the tree and we can exit.
1357                 */
1358                ret = -ENOENT;
1359                if (found_key.objectid != inode_objectid)
1360                        break;
1361                if (found_key.type != BTRFS_INODE_EXTREF_KEY)
1362                        break;
1363
1364                ret = 0;
1365                ptr = btrfs_item_ptr_offset(leaf, path->slots[0]);
1366                extref = (struct btrfs_inode_extref *)ptr;
1367                *ret_extref = extref;
1368                if (found_off)
1369                        *found_off = found_key.offset;
1370                break;
1371        }
1372
1373        return ret;
1374}
1375
1376/*
1377 * this iterates to turn a name (from iref/extref) into a full filesystem path.
1378 * Elements of the path are separated by '/' and the path is guaranteed to be
1379 * 0-terminated. the path is only given within the current file system.
1380 * Therefore, it never starts with a '/'. the caller is responsible to provide
1381 * "size" bytes in "dest". the dest buffer will be filled backwards. finally,
1382 * the start point of the resulting string is returned. this pointer is within
1383 * dest, normally.
1384 * in case the path buffer would overflow, the pointer is decremented further
1385 * as if output was written to the buffer, though no more output is actually
1386 * generated. that way, the caller can determine how much space would be
1387 * required for the path to fit into the buffer. in that case, the returned
1388 * value will be smaller than dest. callers must check this!
1389 */
1390char *btrfs_ref_to_path(struct btrfs_root *fs_root, struct btrfs_path *path,
1391                        u32 name_len, unsigned long name_off,
1392                        struct extent_buffer *eb_in, u64 parent,
1393                        char *dest, u32 size)
1394{
1395        int slot;
1396        u64 next_inum;
1397        int ret;
1398        s64 bytes_left = ((s64)size) - 1;
1399        struct extent_buffer *eb = eb_in;
1400        struct btrfs_key found_key;
1401        int leave_spinning = path->leave_spinning;
1402        struct btrfs_inode_ref *iref;
1403
1404        if (bytes_left >= 0)
1405                dest[bytes_left] = '\0';
1406
1407        path->leave_spinning = 1;
1408        while (1) {
1409                bytes_left -= name_len;
1410                if (bytes_left >= 0)
1411                        read_extent_buffer(eb, dest + bytes_left,
1412                                           name_off, name_len);
1413                if (eb != eb_in) {
1414                        btrfs_tree_read_unlock_blocking(eb);
1415                        free_extent_buffer(eb);
1416                }
1417                ret = btrfs_find_item(fs_root, path, parent, 0,
1418                                BTRFS_INODE_REF_KEY, &found_key);
1419                if (ret > 0)
1420                        ret = -ENOENT;
1421                if (ret)
1422                        break;
1423
1424                next_inum = found_key.offset;
1425
1426                /* regular exit ahead */
1427                if (parent == next_inum)
1428                        break;
1429
1430                slot = path->slots[0];
1431                eb = path->nodes[0];
1432                /* make sure we can use eb after releasing the path */
1433                if (eb != eb_in) {
1434                        atomic_inc(&eb->refs);
1435                        btrfs_tree_read_lock(eb);
1436                        btrfs_set_lock_blocking_rw(eb, BTRFS_READ_LOCK);
1437                }
1438                btrfs_release_path(path);
1439                iref = btrfs_item_ptr(eb, slot, struct btrfs_inode_ref);
1440
1441                name_len = btrfs_inode_ref_name_len(eb, iref);
1442                name_off = (unsigned long)(iref + 1);
1443
1444                parent = next_inum;
1445                --bytes_left;
1446                if (bytes_left >= 0)
1447                        dest[bytes_left] = '/';
1448        }
1449
1450        btrfs_release_path(path);
1451        path->leave_spinning = leave_spinning;
1452
1453        if (ret)
1454                return ERR_PTR(ret);
1455
1456        return dest + bytes_left;
1457}
1458
1459/*
1460 * this makes the path point to (logical EXTENT_ITEM *)
1461 * returns BTRFS_EXTENT_FLAG_DATA for data, BTRFS_EXTENT_FLAG_TREE_BLOCK for
1462 * tree blocks and <0 on error.
1463 */
1464int extent_from_logical(struct btrfs_fs_info *fs_info, u64 logical,
1465                        struct btrfs_path *path, struct btrfs_key *found_key,
1466                        u64 *flags_ret)
1467{
1468        int ret;
1469        u64 flags;
1470        u64 size = 0;
1471        u32 item_size;
1472        struct extent_buffer *eb;
1473        struct btrfs_extent_item *ei;
1474        struct btrfs_key key;
1475
1476        if (btrfs_fs_incompat(fs_info, SKINNY_METADATA))
1477                key.type = BTRFS_METADATA_ITEM_KEY;
1478        else
1479                key.type = BTRFS_EXTENT_ITEM_KEY;
1480        key.objectid = logical;
1481        key.offset = (u64)-1;
1482
1483        ret = btrfs_search_slot(NULL, fs_info->extent_root, &key, path, 0, 0);
1484        if (ret < 0)
1485                return ret;
1486
1487        ret = btrfs_previous_extent_item(fs_info->extent_root, path, 0);
1488        if (ret) {
1489                if (ret > 0)
1490                        ret = -ENOENT;
1491                return ret;
1492        }
1493        btrfs_item_key_to_cpu(path->nodes[0], found_key, path->slots[0]);
1494        if (found_key->type == BTRFS_METADATA_ITEM_KEY)
1495                size = fs_info->extent_root->nodesize;
1496        else if (found_key->type == BTRFS_EXTENT_ITEM_KEY)
1497                size = found_key->offset;
1498
1499        if (found_key->objectid > logical ||
1500            found_key->objectid + size <= logical) {
1501                pr_debug("logical %llu is not within any extent\n", logical);
1502                return -ENOENT;
1503        }
1504
1505        eb = path->nodes[0];
1506        item_size = btrfs_item_size_nr(eb, path->slots[0]);
1507        BUG_ON(item_size < sizeof(*ei));
1508
1509        ei = btrfs_item_ptr(eb, path->slots[0], struct btrfs_extent_item);
1510        flags = btrfs_extent_flags(eb, ei);
1511
1512        pr_debug("logical %llu is at position %llu within the extent (%llu "
1513                 "EXTENT_ITEM %llu) flags %#llx size %u\n",
1514                 logical, logical - found_key->objectid, found_key->objectid,
1515                 found_key->offset, flags, item_size);
1516
1517        WARN_ON(!flags_ret);
1518        if (flags_ret) {
1519                if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK)
1520                        *flags_ret = BTRFS_EXTENT_FLAG_TREE_BLOCK;
1521                else if (flags & BTRFS_EXTENT_FLAG_DATA)
1522                        *flags_ret = BTRFS_EXTENT_FLAG_DATA;
1523                else
1524                        BUG_ON(1);
1525                return 0;
1526        }
1527
1528        return -EIO;
1529}
1530
1531/*
1532 * helper function to iterate extent inline refs. ptr must point to a 0 value
1533 * for the first call and may be modified. it is used to track state.
1534 * if more refs exist, 0 is returned and the next call to
1535 * __get_extent_inline_ref must pass the modified ptr parameter to get the
1536 * next ref. after the last ref was processed, 1 is returned.
1537 * returns <0 on error
1538 */
1539static int __get_extent_inline_ref(unsigned long *ptr, struct extent_buffer *eb,
1540                                   struct btrfs_key *key,
1541                                   struct btrfs_extent_item *ei, u32 item_size,
1542                                   struct btrfs_extent_inline_ref **out_eiref,
1543                                   int *out_type)
1544{
1545        unsigned long end;
1546        u64 flags;
1547        struct btrfs_tree_block_info *info;
1548
1549        if (!*ptr) {
1550                /* first call */
1551                flags = btrfs_extent_flags(eb, ei);
1552                if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK) {
1553                        if (key->type == BTRFS_METADATA_ITEM_KEY) {
1554                                /* a skinny metadata extent */
1555                                *out_eiref =
1556                                     (struct btrfs_extent_inline_ref *)(ei + 1);
1557                        } else {
1558                                WARN_ON(key->type != BTRFS_EXTENT_ITEM_KEY);
1559                                info = (struct btrfs_tree_block_info *)(ei + 1);
1560                                *out_eiref =
1561                                   (struct btrfs_extent_inline_ref *)(info + 1);
1562                        }
1563                } else {
1564                        *out_eiref = (struct btrfs_extent_inline_ref *)(ei + 1);
1565                }
1566                *ptr = (unsigned long)*out_eiref;
1567                if ((unsigned long)(*ptr) >= (unsigned long)ei + item_size)
1568                        return -ENOENT;
1569        }
1570
1571        end = (unsigned long)ei + item_size;
1572        *out_eiref = (struct btrfs_extent_inline_ref *)(*ptr);
1573        *out_type = btrfs_extent_inline_ref_type(eb, *out_eiref);
1574
1575        *ptr += btrfs_extent_inline_ref_size(*out_type);
1576        WARN_ON(*ptr > end);
1577        if (*ptr == end)
1578                return 1; /* last */
1579
1580        return 0;
1581}
1582
1583/*
1584 * reads the tree block backref for an extent. tree level and root are returned
1585 * through out_level and out_root. ptr must point to a 0 value for the first
1586 * call and may be modified (see __get_extent_inline_ref comment).
1587 * returns 0 if data was provided, 1 if there was no more data to provide or
1588 * <0 on error.
1589 */
1590int tree_backref_for_extent(unsigned long *ptr, struct extent_buffer *eb,
1591                            struct btrfs_key *key, struct btrfs_extent_item *ei,
1592                            u32 item_size, u64 *out_root, u8 *out_level)
1593{
1594        int ret;
1595        int type;
1596        struct btrfs_extent_inline_ref *eiref;
1597
1598        if (*ptr == (unsigned long)-1)
1599                return 1;
1600
1601        while (1) {
1602                ret = __get_extent_inline_ref(ptr, eb, key, ei, item_size,
1603                                              &eiref, &type);
1604                if (ret < 0)
1605                        return ret;
1606
1607                if (type == BTRFS_TREE_BLOCK_REF_KEY ||
1608                    type == BTRFS_SHARED_BLOCK_REF_KEY)
1609                        break;
1610
1611                if (ret == 1)
1612                        return 1;
1613        }
1614
1615        /* we can treat both ref types equally here */
1616        *out_root = btrfs_extent_inline_ref_offset(eb, eiref);
1617
1618        if (key->type == BTRFS_EXTENT_ITEM_KEY) {
1619                struct btrfs_tree_block_info *info;
1620
1621                info = (struct btrfs_tree_block_info *)(ei + 1);
1622                *out_level = btrfs_tree_block_level(eb, info);
1623        } else {
1624                ASSERT(key->type == BTRFS_METADATA_ITEM_KEY);
1625                *out_level = (u8)key->offset;
1626        }
1627
1628        if (ret == 1)
1629                *ptr = (unsigned long)-1;
1630
1631        return 0;
1632}
1633
1634static int iterate_leaf_refs(struct extent_inode_elem *inode_list,
1635                                u64 root, u64 extent_item_objectid,
1636                                iterate_extent_inodes_t *iterate, void *ctx)
1637{
1638        struct extent_inode_elem *eie;
1639        int ret = 0;
1640
1641        for (eie = inode_list; eie; eie = eie->next) {
1642                pr_debug("ref for %llu resolved, key (%llu EXTEND_DATA %llu), "
1643                         "root %llu\n", extent_item_objectid,
1644                         eie->inum, eie->offset, root);
1645                ret = iterate(eie->inum, eie->offset, root, ctx);
1646                if (ret) {
1647                        pr_debug("stopping iteration for %llu due to ret=%d\n",
1648                                 extent_item_objectid, ret);
1649                        break;
1650                }
1651        }
1652
1653        return ret;
1654}
1655
1656/*
1657 * calls iterate() for every inode that references the extent identified by
1658 * the given parameters.
1659 * when the iterator function returns a non-zero value, iteration stops.
1660 */
1661int iterate_extent_inodes(struct btrfs_fs_info *fs_info,
1662                                u64 extent_item_objectid, u64 extent_item_pos,
1663                                int search_commit_root,
1664                                iterate_extent_inodes_t *iterate, void *ctx)
1665{
1666        int ret;
1667        struct btrfs_trans_handle *trans = NULL;
1668        struct ulist *refs = NULL;
1669        struct ulist *roots = NULL;
1670        struct ulist_node *ref_node = NULL;
1671        struct ulist_node *root_node = NULL;
1672        struct seq_list tree_mod_seq_elem = SEQ_LIST_INIT(tree_mod_seq_elem);
1673        struct ulist_iterator ref_uiter;
1674        struct ulist_iterator root_uiter;
1675
1676        pr_debug("resolving all inodes for extent %llu\n",
1677                        extent_item_objectid);
1678
1679        if (!search_commit_root) {
1680                trans = btrfs_join_transaction(fs_info->extent_root);
1681                if (IS_ERR(trans))
1682                        return PTR_ERR(trans);
1683                btrfs_get_tree_mod_seq(fs_info, &tree_mod_seq_elem);
1684        } else {
1685                down_read(&fs_info->commit_root_sem);
1686        }
1687
1688        ret = btrfs_find_all_leafs(trans, fs_info, extent_item_objectid,
1689                                   tree_mod_seq_elem.seq, &refs,
1690                                   &extent_item_pos);
1691        if (ret)
1692                goto out;
1693
1694        ULIST_ITER_INIT(&ref_uiter);
1695        while (!ret && (ref_node = ulist_next(refs, &ref_uiter))) {
1696                ret = __btrfs_find_all_roots(trans, fs_info, ref_node->val,
1697                                             tree_mod_seq_elem.seq, &roots);
1698                if (ret)
1699                        break;
1700                ULIST_ITER_INIT(&root_uiter);
1701                while (!ret && (root_node = ulist_next(roots, &root_uiter))) {
1702                        pr_debug("root %llu references leaf %llu, data list "
1703                                 "%#llx\n", root_node->val, ref_node->val,
1704                                 ref_node->aux);
1705                        ret = iterate_leaf_refs((struct extent_inode_elem *)
1706                                                (uintptr_t)ref_node->aux,
1707                                                root_node->val,
1708                                                extent_item_objectid,
1709                                                iterate, ctx);
1710                }
1711                ulist_free(roots);
1712        }
1713
1714        free_leaf_list(refs);
1715out:
1716        if (!search_commit_root) {
1717                btrfs_put_tree_mod_seq(fs_info, &tree_mod_seq_elem);
1718                btrfs_end_transaction(trans, fs_info->extent_root);
1719        } else {
1720                up_read(&fs_info->commit_root_sem);
1721        }
1722
1723        return ret;
1724}
1725
1726int iterate_inodes_from_logical(u64 logical, struct btrfs_fs_info *fs_info,
1727                                struct btrfs_path *path,
1728                                iterate_extent_inodes_t *iterate, void *ctx)
1729{
1730        int ret;
1731        u64 extent_item_pos;
1732        u64 flags = 0;
1733        struct btrfs_key found_key;
1734        int search_commit_root = path->search_commit_root;
1735
1736        ret = extent_from_logical(fs_info, logical, path, &found_key, &flags);
1737        btrfs_release_path(path);
1738        if (ret < 0)
1739                return ret;
1740        if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK)
1741                return -EINVAL;
1742
1743        extent_item_pos = logical - found_key.objectid;
1744        ret = iterate_extent_inodes(fs_info, found_key.objectid,
1745                                        extent_item_pos, search_commit_root,
1746                                        iterate, ctx);
1747
1748        return ret;
1749}
1750
1751typedef int (iterate_irefs_t)(u64 parent, u32 name_len, unsigned long name_off,
1752                              struct extent_buffer *eb, void *ctx);
1753
1754static int iterate_inode_refs(u64 inum, struct btrfs_root *fs_root,
1755                              struct btrfs_path *path,
1756                              iterate_irefs_t *iterate, void *ctx)
1757{
1758        int ret = 0;
1759        int slot;
1760        u32 cur;
1761        u32 len;
1762        u32 name_len;
1763        u64 parent = 0;
1764        int found = 0;
1765        struct extent_buffer *eb;
1766        struct btrfs_item *item;
1767        struct btrfs_inode_ref *iref;
1768        struct btrfs_key found_key;
1769
1770        while (!ret) {
1771                ret = btrfs_find_item(fs_root, path, inum,
1772                                parent ? parent + 1 : 0, BTRFS_INODE_REF_KEY,
1773                                &found_key);
1774
1775                if (ret < 0)
1776                        break;
1777                if (ret) {
1778                        ret = found ? 0 : -ENOENT;
1779                        break;
1780                }
1781                ++found;
1782
1783                parent = found_key.offset;
1784                slot = path->slots[0];
1785                eb = btrfs_clone_extent_buffer(path->nodes[0]);
1786                if (!eb) {
1787                        ret = -ENOMEM;
1788                        break;
1789                }
1790                extent_buffer_get(eb);
1791                btrfs_tree_read_lock(eb);
1792                btrfs_set_lock_blocking_rw(eb, BTRFS_READ_LOCK);
1793                btrfs_release_path(path);
1794
1795                item = btrfs_item_nr(slot);
1796                iref = btrfs_item_ptr(eb, slot, struct btrfs_inode_ref);
1797
1798                for (cur = 0; cur < btrfs_item_size(eb, item); cur += len) {
1799                        name_len = btrfs_inode_ref_name_len(eb, iref);
1800                        /* path must be released before calling iterate()! */
1801                        pr_debug("following ref at offset %u for inode %llu in "
1802                                 "tree %llu\n", cur, found_key.objectid,
1803                                 fs_root->objectid);
1804                        ret = iterate(parent, name_len,
1805                                      (unsigned long)(iref + 1), eb, ctx);
1806                        if (ret)
1807                                break;
1808                        len = sizeof(*iref) + name_len;
1809                        iref = (struct btrfs_inode_ref *)((char *)iref + len);
1810                }
1811                btrfs_tree_read_unlock_blocking(eb);
1812                free_extent_buffer(eb);
1813        }
1814
1815        btrfs_release_path(path);
1816
1817        return ret;
1818}
1819
1820static int iterate_inode_extrefs(u64 inum, struct btrfs_root *fs_root,
1821                                 struct btrfs_path *path,
1822                                 iterate_irefs_t *iterate, void *ctx)
1823{
1824        int ret;
1825        int slot;
1826        u64 offset = 0;
1827        u64 parent;
1828        int found = 0;
1829        struct extent_buffer *eb;
1830        struct btrfs_inode_extref *extref;
1831        u32 item_size;
1832        u32 cur_offset;
1833        unsigned long ptr;
1834
1835        while (1) {
1836                ret = btrfs_find_one_extref(fs_root, inum, offset, path, &extref,
1837                                            &offset);
1838                if (ret < 0)
1839                        break;
1840                if (ret) {
1841                        ret = found ? 0 : -ENOENT;
1842                        break;
1843                }
1844                ++found;
1845
1846                slot = path->slots[0];
1847                eb = btrfs_clone_extent_buffer(path->nodes[0]);
1848                if (!eb) {
1849                        ret = -ENOMEM;
1850                        break;
1851                }
1852                extent_buffer_get(eb);
1853
1854                btrfs_tree_read_lock(eb);
1855                btrfs_set_lock_blocking_rw(eb, BTRFS_READ_LOCK);
1856                btrfs_release_path(path);
1857
1858                item_size = btrfs_item_size_nr(eb, slot);
1859                ptr = btrfs_item_ptr_offset(eb, slot);
1860                cur_offset = 0;
1861
1862                while (cur_offset < item_size) {
1863                        u32 name_len;
1864
1865                        extref = (struct btrfs_inode_extref *)(ptr + cur_offset);
1866                        parent = btrfs_inode_extref_parent(eb, extref);
1867                        name_len = btrfs_inode_extref_name_len(eb, extref);
1868                        ret = iterate(parent, name_len,
1869                                      (unsigned long)&extref->name, eb, ctx);
1870                        if (ret)
1871                                break;
1872
1873                        cur_offset += btrfs_inode_extref_name_len(eb, extref);
1874                        cur_offset += sizeof(*extref);
1875                }
1876                btrfs_tree_read_unlock_blocking(eb);
1877                free_extent_buffer(eb);
1878
1879                offset++;
1880        }
1881
1882        btrfs_release_path(path);
1883
1884        return ret;
1885}
1886
1887static int iterate_irefs(u64 inum, struct btrfs_root *fs_root,
1888                         struct btrfs_path *path, iterate_irefs_t *iterate,
1889                         void *ctx)
1890{
1891        int ret;
1892        int found_refs = 0;
1893
1894        ret = iterate_inode_refs(inum, fs_root, path, iterate, ctx);
1895        if (!ret)
1896                ++found_refs;
1897        else if (ret != -ENOENT)
1898                return ret;
1899
1900        ret = iterate_inode_extrefs(inum, fs_root, path, iterate, ctx);
1901        if (ret == -ENOENT && found_refs)
1902                return 0;
1903
1904        return ret;
1905}
1906
1907/*
1908 * returns 0 if the path could be dumped (probably truncated)
1909 * returns <0 in case of an error
1910 */
1911static int inode_to_path(u64 inum, u32 name_len, unsigned long name_off,
1912                         struct extent_buffer *eb, void *ctx)
1913{
1914        struct inode_fs_paths *ipath = ctx;
1915        char *fspath;
1916        char *fspath_min;
1917        int i = ipath->fspath->elem_cnt;
1918        const int s_ptr = sizeof(char *);
1919        u32 bytes_left;
1920
1921        bytes_left = ipath->fspath->bytes_left > s_ptr ?
1922                                        ipath->fspath->bytes_left - s_ptr : 0;
1923
1924        fspath_min = (char *)ipath->fspath->val + (i + 1) * s_ptr;
1925        fspath = btrfs_ref_to_path(ipath->fs_root, ipath->btrfs_path, name_len,
1926                                   name_off, eb, inum, fspath_min, bytes_left);
1927        if (IS_ERR(fspath))
1928                return PTR_ERR(fspath);
1929
1930        if (fspath > fspath_min) {
1931                ipath->fspath->val[i] = (u64)(unsigned long)fspath;
1932                ++ipath->fspath->elem_cnt;
1933                ipath->fspath->bytes_left = fspath - fspath_min;
1934        } else {
1935                ++ipath->fspath->elem_missed;
1936                ipath->fspath->bytes_missing += fspath_min - fspath;
1937                ipath->fspath->bytes_left = 0;
1938        }
1939
1940        return 0;
1941}
1942
1943/*
1944 * this dumps all file system paths to the inode into the ipath struct, provided
1945 * is has been created large enough. each path is zero-terminated and accessed
1946 * from ipath->fspath->val[i].
1947 * when it returns, there are ipath->fspath->elem_cnt number of paths available
1948 * in ipath->fspath->val[]. when the allocated space wasn't sufficient, the
1949 * number of missed paths in recored in ipath->fspath->elem_missed, otherwise,
1950 * it's zero. ipath->fspath->bytes_missing holds the number of bytes that would
1951 * have been needed to return all paths.
1952 */
1953int paths_from_inode(u64 inum, struct inode_fs_paths *ipath)
1954{
1955        return iterate_irefs(inum, ipath->fs_root, ipath->btrfs_path,
1956                             inode_to_path, ipath);
1957}
1958
1959struct btrfs_data_container *init_data_container(u32 total_bytes)
1960{
1961        struct btrfs_data_container *data;
1962        size_t alloc_bytes;
1963
1964        alloc_bytes = max_t(size_t, total_bytes, sizeof(*data));
1965        data = vmalloc(alloc_bytes);
1966        if (!data)
1967                return ERR_PTR(-ENOMEM);
1968
1969        if (total_bytes >= sizeof(*data)) {
1970                data->bytes_left = total_bytes - sizeof(*data);
1971                data->bytes_missing = 0;
1972        } else {
1973                data->bytes_missing = sizeof(*data) - total_bytes;
1974                data->bytes_left = 0;
1975        }
1976
1977        data->elem_cnt = 0;
1978        data->elem_missed = 0;
1979
1980        return data;
1981}
1982
1983/*
1984 * allocates space to return multiple file system paths for an inode.
1985 * total_bytes to allocate are passed, note that space usable for actual path
1986 * information will be total_bytes - sizeof(struct inode_fs_paths).
1987 * the returned pointer must be freed with free_ipath() in the end.
1988 */
1989struct inode_fs_paths *init_ipath(s32 total_bytes, struct btrfs_root *fs_root,
1990                                        struct btrfs_path *path)
1991{
1992        struct inode_fs_paths *ifp;
1993        struct btrfs_data_container *fspath;
1994
1995        fspath = init_data_container(total_bytes);
1996        if (IS_ERR(fspath))
1997                return (void *)fspath;
1998
1999        ifp = kmalloc(sizeof(*ifp), GFP_NOFS);
2000        if (!ifp) {
2001                kfree(fspath);
2002                return ERR_PTR(-ENOMEM);
2003        }
2004
2005        ifp->btrfs_path = path;
2006        ifp->fspath = fspath;
2007        ifp->fs_root = fs_root;
2008
2009        return ifp;
2010}
2011
2012void free_ipath(struct inode_fs_paths *ipath)
2013{
2014        if (!ipath)
2015                return;
2016        vfree(ipath->fspath);
2017        kfree(ipath);
2018}
2019