root/fs/btrfs/root-tree.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. btrfs_read_root_item
  2. btrfs_find_root
  3. btrfs_set_root_node
  4. btrfs_update_root
  5. btrfs_insert_root
  6. btrfs_find_orphan_roots
  7. btrfs_del_root
  8. btrfs_del_root_ref
  9. btrfs_add_root_ref
  10. btrfs_check_and_init_root_item
  11. btrfs_update_root_times
  12. btrfs_subvolume_reserve_metadata
  13. btrfs_subvolume_release_metadata

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

/* [<][>][^][v][top][bottom][index][help] */