linux/fs/btrfs/root-tree.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2007 Oracle.  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/err.h>
  20#include <linux/uuid.h>
  21#include "ctree.h"
  22#include "transaction.h"
  23#include "disk-io.h"
  24#include "print-tree.h"
  25
  26/*
  27 * Read a root item from the tree. In case we detect a root item smaller then
  28 * sizeof(root_item), we know it's an old version of the root structure and
  29 * initialize all new fields to zero. The same happens if we detect mismatching
  30 * generation numbers as then we know the root was once mounted with an older
  31 * kernel that was not aware of the root item structure change.
  32 */
  33static void btrfs_read_root_item(struct extent_buffer *eb, int slot,
  34                                struct btrfs_root_item *item)
  35{
  36        uuid_le uuid;
  37        int len;
  38        int need_reset = 0;
  39
  40        len = btrfs_item_size_nr(eb, slot);
  41        read_extent_buffer(eb, item, btrfs_item_ptr_offset(eb, slot),
  42                        min_t(int, len, (int)sizeof(*item)));
  43        if (len < sizeof(*item))
  44                need_reset = 1;
  45        if (!need_reset && btrfs_root_generation(item)
  46                != btrfs_root_generation_v2(item)) {
  47                if (btrfs_root_generation_v2(item) != 0) {
  48                        btrfs_warn(eb->fs_info,
  49                                        "mismatching generation and generation_v2 found in root item. This root was probably mounted with an older kernel. Resetting all new fields.");
  50                }
  51                need_reset = 1;
  52        }
  53        if (need_reset) {
  54                memset(&item->generation_v2, 0,
  55                        sizeof(*item) - offsetof(struct btrfs_root_item,
  56                                        generation_v2));
  57
  58                uuid_le_gen(&uuid);
  59                memcpy(item->uuid, uuid.b, BTRFS_UUID_SIZE);
  60        }
  61}
  62
  63/*
  64 * btrfs_find_root - lookup the root by the key.
  65 * root: the root of the root tree
  66 * search_key: the key to search
  67 * path: the path we search
  68 * root_item: the root item of the tree we look for
  69 * root_key: the root key of the tree we look for
  70 *
  71 * If ->offset of 'search_key' is -1ULL, it means we are not sure the offset
  72 * of the search key, just lookup the root with the highest offset for a
  73 * given objectid.
  74 *
  75 * If we find something return 0, otherwise > 0, < 0 on error.
  76 */
  77int btrfs_find_root(struct btrfs_root *root, const struct btrfs_key *search_key,
  78                    struct btrfs_path *path, struct btrfs_root_item *root_item,
  79                    struct btrfs_key *root_key)
  80{
  81        struct btrfs_key found_key;
  82        struct extent_buffer *l;
  83        int ret;
  84        int slot;
  85
  86        ret = btrfs_search_slot(NULL, root, search_key, path, 0, 0);
  87        if (ret < 0)
  88                return ret;
  89
  90        if (search_key->offset != -1ULL) {      /* the search key is exact */
  91                if (ret > 0)
  92                        goto out;
  93        } else {
  94                BUG_ON(ret == 0);               /* Logical error */
  95                if (path->slots[0] == 0)
  96                        goto out;
  97                path->slots[0]--;
  98                ret = 0;
  99        }
 100
 101        l = path->nodes[0];
 102        slot = path->slots[0];
 103
 104        btrfs_item_key_to_cpu(l, &found_key, slot);
 105        if (found_key.objectid != search_key->objectid ||
 106            found_key.type != BTRFS_ROOT_ITEM_KEY) {
 107                ret = 1;
 108                goto out;
 109        }
 110
 111        if (root_item)
 112                btrfs_read_root_item(l, slot, root_item);
 113        if (root_key)
 114                memcpy(root_key, &found_key, sizeof(found_key));
 115out:
 116        btrfs_release_path(path);
 117        return ret;
 118}
 119
 120void btrfs_set_root_node(struct btrfs_root_item *item,
 121                         struct extent_buffer *node)
 122{
 123        btrfs_set_root_bytenr(item, node->start);
 124        btrfs_set_root_level(item, btrfs_header_level(node));
 125        btrfs_set_root_generation(item, btrfs_header_generation(node));
 126}
 127
 128/*
 129 * copy the data in 'item' into the btree
 130 */
 131int btrfs_update_root(struct btrfs_trans_handle *trans, struct btrfs_root
 132                      *root, struct btrfs_key *key, struct btrfs_root_item
 133                      *item)
 134{
 135        struct btrfs_fs_info *fs_info = root->fs_info;
 136        struct btrfs_path *path;
 137        struct extent_buffer *l;
 138        int ret;
 139        int slot;
 140        unsigned long ptr;
 141        u32 old_len;
 142
 143        path = btrfs_alloc_path();
 144        if (!path)
 145                return -ENOMEM;
 146
 147        ret = btrfs_search_slot(trans, root, key, path, 0, 1);
 148        if (ret < 0) {
 149                btrfs_abort_transaction(trans, ret);
 150                goto out;
 151        }
 152
 153        if (ret != 0) {
 154                btrfs_print_leaf(fs_info, path->nodes[0]);
 155                btrfs_crit(fs_info, "unable to update root key %llu %u %llu",
 156                           key->objectid, key->type, key->offset);
 157                BUG_ON(1);
 158        }
 159
 160        l = path->nodes[0];
 161        slot = path->slots[0];
 162        ptr = btrfs_item_ptr_offset(l, slot);
 163        old_len = btrfs_item_size_nr(l, slot);
 164
 165        /*
 166         * If this is the first time we update the root item which originated
 167         * from an older kernel, we need to enlarge the item size to make room
 168         * for the added fields.
 169         */
 170        if (old_len < sizeof(*item)) {
 171                btrfs_release_path(path);
 172                ret = btrfs_search_slot(trans, root, key, path,
 173                                -1, 1);
 174                if (ret < 0) {
 175                        btrfs_abort_transaction(trans, ret);
 176                        goto out;
 177                }
 178
 179                ret = btrfs_del_item(trans, root, path);
 180                if (ret < 0) {
 181                        btrfs_abort_transaction(trans, ret);
 182                        goto out;
 183                }
 184                btrfs_release_path(path);
 185                ret = btrfs_insert_empty_item(trans, root, path,
 186                                key, sizeof(*item));
 187                if (ret < 0) {
 188                        btrfs_abort_transaction(trans, ret);
 189                        goto out;
 190                }
 191                l = path->nodes[0];
 192                slot = path->slots[0];
 193                ptr = btrfs_item_ptr_offset(l, slot);
 194        }
 195
 196        /*
 197         * Update generation_v2 so at the next mount we know the new root
 198         * fields are valid.
 199         */
 200        btrfs_set_root_generation_v2(item, btrfs_root_generation(item));
 201
 202        write_extent_buffer(l, item, ptr, sizeof(*item));
 203        btrfs_mark_buffer_dirty(path->nodes[0]);
 204out:
 205        btrfs_free_path(path);
 206        return ret;
 207}
 208
 209int btrfs_insert_root(struct btrfs_trans_handle *trans, struct btrfs_root *root,
 210                      const struct btrfs_key *key, struct btrfs_root_item *item)
 211{
 212        /*
 213         * Make sure generation v1 and v2 match. See update_root for details.
 214         */
 215        btrfs_set_root_generation_v2(item, btrfs_root_generation(item));
 216        return btrfs_insert_item(trans, root, key, item, sizeof(*item));
 217}
 218
 219int btrfs_find_orphan_roots(struct btrfs_fs_info *fs_info)
 220{
 221        struct btrfs_root *tree_root = fs_info->tree_root;
 222        struct extent_buffer *leaf;
 223        struct btrfs_path *path;
 224        struct btrfs_key key;
 225        struct btrfs_key root_key;
 226        struct btrfs_root *root;
 227        int err = 0;
 228        int ret;
 229        bool can_recover = true;
 230
 231        if (fs_info->sb->s_flags & MS_RDONLY)
 232                can_recover = false;
 233
 234        path = btrfs_alloc_path();
 235        if (!path)
 236                return -ENOMEM;
 237
 238        key.objectid = BTRFS_ORPHAN_OBJECTID;
 239        key.type = BTRFS_ORPHAN_ITEM_KEY;
 240        key.offset = 0;
 241
 242        root_key.type = BTRFS_ROOT_ITEM_KEY;
 243        root_key.offset = (u64)-1;
 244
 245        while (1) {
 246                ret = btrfs_search_slot(NULL, tree_root, &key, path, 0, 0);
 247                if (ret < 0) {
 248                        err = ret;
 249                        break;
 250                }
 251
 252                leaf = path->nodes[0];
 253                if (path->slots[0] >= btrfs_header_nritems(leaf)) {
 254                        ret = btrfs_next_leaf(tree_root, path);
 255                        if (ret < 0)
 256                                err = ret;
 257                        if (ret != 0)
 258                                break;
 259                        leaf = path->nodes[0];
 260                }
 261
 262                btrfs_item_key_to_cpu(leaf, &key, path->slots[0]);
 263                btrfs_release_path(path);
 264
 265                if (key.objectid != BTRFS_ORPHAN_OBJECTID ||
 266                    key.type != BTRFS_ORPHAN_ITEM_KEY)
 267                        break;
 268
 269                root_key.objectid = key.offset;
 270                key.offset++;
 271
 272                /*
 273                 * The root might have been inserted already, as before we look
 274                 * for orphan roots, log replay might have happened, which
 275                 * triggers a transaction commit and qgroup accounting, which
 276                 * in turn reads and inserts fs roots while doing backref
 277                 * walking.
 278                 */
 279                root = btrfs_lookup_fs_root(fs_info, root_key.objectid);
 280                if (root) {
 281                        WARN_ON(!test_bit(BTRFS_ROOT_ORPHAN_ITEM_INSERTED,
 282                                          &root->state));
 283                        if (btrfs_root_refs(&root->root_item) == 0)
 284                                btrfs_add_dead_root(root);
 285                        continue;
 286                }
 287
 288                root = btrfs_read_fs_root(tree_root, &root_key);
 289                err = PTR_ERR_OR_ZERO(root);
 290                if (err && err != -ENOENT) {
 291                        break;
 292                } else if (err == -ENOENT) {
 293                        struct btrfs_trans_handle *trans;
 294
 295                        btrfs_release_path(path);
 296
 297                        trans = btrfs_join_transaction(tree_root);
 298                        if (IS_ERR(trans)) {
 299                                err = PTR_ERR(trans);
 300                                btrfs_handle_fs_error(fs_info, err,
 301                                            "Failed to start trans to delete orphan item");
 302                                break;
 303                        }
 304                        err = btrfs_del_orphan_item(trans, tree_root,
 305                                                    root_key.objectid);
 306                        btrfs_end_transaction(trans);
 307                        if (err) {
 308                                btrfs_handle_fs_error(fs_info, err,
 309                                            "Failed to delete root orphan item");
 310                                break;
 311                        }
 312                        continue;
 313                }
 314
 315                err = btrfs_init_fs_root(root);
 316                if (err) {
 317                        btrfs_free_fs_root(root);
 318                        break;
 319                }
 320
 321                set_bit(BTRFS_ROOT_ORPHAN_ITEM_INSERTED, &root->state);
 322
 323                err = btrfs_insert_fs_root(fs_info, root);
 324                if (err) {
 325                        BUG_ON(err == -EEXIST);
 326                        btrfs_free_fs_root(root);
 327                        break;
 328                }
 329
 330                if (btrfs_root_refs(&root->root_item) == 0)
 331                        btrfs_add_dead_root(root);
 332        }
 333
 334        btrfs_free_path(path);
 335        return err;
 336}
 337
 338/* drop the root item for 'key' from 'root' */
 339int btrfs_del_root(struct btrfs_trans_handle *trans, struct btrfs_root *root,
 340                   const struct btrfs_key *key)
 341{
 342        struct btrfs_path *path;
 343        int ret;
 344
 345        path = btrfs_alloc_path();
 346        if (!path)
 347                return -ENOMEM;
 348        ret = btrfs_search_slot(trans, root, key, path, -1, 1);
 349        if (ret < 0)
 350                goto out;
 351
 352        BUG_ON(ret != 0);
 353
 354        ret = btrfs_del_item(trans, root, path);
 355out:
 356        btrfs_free_path(path);
 357        return ret;
 358}
 359
 360int btrfs_del_root_ref(struct btrfs_trans_handle *trans,
 361                       struct btrfs_fs_info *fs_info,
 362                       u64 root_id, u64 ref_id, u64 dirid, u64 *sequence,
 363                       const char *name, int name_len)
 364
 365{
 366        struct btrfs_root *tree_root = fs_info->tree_root;
 367        struct btrfs_path *path;
 368        struct btrfs_root_ref *ref;
 369        struct extent_buffer *leaf;
 370        struct btrfs_key key;
 371        unsigned long ptr;
 372        int err = 0;
 373        int ret;
 374
 375        path = btrfs_alloc_path();
 376        if (!path)
 377                return -ENOMEM;
 378
 379        key.objectid = root_id;
 380        key.type = BTRFS_ROOT_BACKREF_KEY;
 381        key.offset = ref_id;
 382again:
 383        ret = btrfs_search_slot(trans, tree_root, &key, path, -1, 1);
 384        BUG_ON(ret < 0);
 385        if (ret == 0) {
 386                leaf = path->nodes[0];
 387                ref = btrfs_item_ptr(leaf, path->slots[0],
 388                                     struct btrfs_root_ref);
 389
 390                WARN_ON(btrfs_root_ref_dirid(leaf, ref) != dirid);
 391                WARN_ON(btrfs_root_ref_name_len(leaf, ref) != name_len);
 392                ptr = (unsigned long)(ref + 1);
 393                WARN_ON(memcmp_extent_buffer(leaf, name, ptr, name_len));
 394                *sequence = btrfs_root_ref_sequence(leaf, ref);
 395
 396                ret = btrfs_del_item(trans, tree_root, path);
 397                if (ret) {
 398                        err = ret;
 399                        goto out;
 400                }
 401        } else
 402                err = -ENOENT;
 403
 404        if (key.type == BTRFS_ROOT_BACKREF_KEY) {
 405                btrfs_release_path(path);
 406                key.objectid = ref_id;
 407                key.type = BTRFS_ROOT_REF_KEY;
 408                key.offset = root_id;
 409                goto again;
 410        }
 411
 412out:
 413        btrfs_free_path(path);
 414        return err;
 415}
 416
 417/*
 418 * add a btrfs_root_ref item.  type is either BTRFS_ROOT_REF_KEY
 419 * or BTRFS_ROOT_BACKREF_KEY.
 420 *
 421 * The dirid, sequence, name and name_len refer to the directory entry
 422 * that is referencing the root.
 423 *
 424 * For a forward ref, the root_id is the id of the tree referencing
 425 * the root and ref_id is the id of the subvol  or snapshot.
 426 *
 427 * For a back ref the root_id is the id of the subvol or snapshot and
 428 * ref_id is the id of the tree referencing it.
 429 *
 430 * Will return 0, -ENOMEM, or anything from the CoW path
 431 */
 432int btrfs_add_root_ref(struct btrfs_trans_handle *trans,
 433                       struct btrfs_fs_info *fs_info,
 434                       u64 root_id, u64 ref_id, u64 dirid, u64 sequence,
 435                       const char *name, int name_len)
 436{
 437        struct btrfs_root *tree_root = fs_info->tree_root;
 438        struct btrfs_key key;
 439        int ret;
 440        struct btrfs_path *path;
 441        struct btrfs_root_ref *ref;
 442        struct extent_buffer *leaf;
 443        unsigned long ptr;
 444
 445        path = btrfs_alloc_path();
 446        if (!path)
 447                return -ENOMEM;
 448
 449        key.objectid = root_id;
 450        key.type = BTRFS_ROOT_BACKREF_KEY;
 451        key.offset = ref_id;
 452again:
 453        ret = btrfs_insert_empty_item(trans, tree_root, path, &key,
 454                                      sizeof(*ref) + name_len);
 455        if (ret) {
 456                btrfs_abort_transaction(trans, ret);
 457                btrfs_free_path(path);
 458                return ret;
 459        }
 460
 461        leaf = path->nodes[0];
 462        ref = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_root_ref);
 463        btrfs_set_root_ref_dirid(leaf, ref, dirid);
 464        btrfs_set_root_ref_sequence(leaf, ref, sequence);
 465        btrfs_set_root_ref_name_len(leaf, ref, name_len);
 466        ptr = (unsigned long)(ref + 1);
 467        write_extent_buffer(leaf, name, ptr, name_len);
 468        btrfs_mark_buffer_dirty(leaf);
 469
 470        if (key.type == BTRFS_ROOT_BACKREF_KEY) {
 471                btrfs_release_path(path);
 472                key.objectid = ref_id;
 473                key.type = BTRFS_ROOT_REF_KEY;
 474                key.offset = root_id;
 475                goto again;
 476        }
 477
 478        btrfs_free_path(path);
 479        return 0;
 480}
 481
 482/*
 483 * Old btrfs forgets to init root_item->flags and root_item->byte_limit
 484 * for subvolumes. To work around this problem, we steal a bit from
 485 * root_item->inode_item->flags, and use it to indicate if those fields
 486 * have been properly initialized.
 487 */
 488void btrfs_check_and_init_root_item(struct btrfs_root_item *root_item)
 489{
 490        u64 inode_flags = btrfs_stack_inode_flags(&root_item->inode);
 491
 492        if (!(inode_flags & BTRFS_INODE_ROOT_ITEM_INIT)) {
 493                inode_flags |= BTRFS_INODE_ROOT_ITEM_INIT;
 494                btrfs_set_stack_inode_flags(&root_item->inode, inode_flags);
 495                btrfs_set_root_flags(root_item, 0);
 496                btrfs_set_root_limit(root_item, 0);
 497        }
 498}
 499
 500void btrfs_update_root_times(struct btrfs_trans_handle *trans,
 501                             struct btrfs_root *root)
 502{
 503        struct btrfs_root_item *item = &root->root_item;
 504        struct timespec ct;
 505
 506        ktime_get_real_ts(&ct);
 507        spin_lock(&root->root_item_lock);
 508        btrfs_set_root_ctransid(item, trans->transid);
 509        btrfs_set_stack_timespec_sec(&item->ctime, ct.tv_sec);
 510        btrfs_set_stack_timespec_nsec(&item->ctime, ct.tv_nsec);
 511        spin_unlock(&root->root_item_lock);
 512}
 513