0001
0002
0003
0004
0005
0006 #include <linux/err.h>
0007 #include <linux/uuid.h>
0008 #include "ctree.h"
0009 #include "transaction.h"
0010 #include "disk-io.h"
0011 #include "print-tree.h"
0012 #include "qgroup.h"
0013 #include "space-info.h"
0014
0015
0016
0017
0018
0019
0020
0021
0022 static void btrfs_read_root_item(struct extent_buffer *eb, int slot,
0023 struct btrfs_root_item *item)
0024 {
0025 u32 len;
0026 int need_reset = 0;
0027
0028 len = btrfs_item_size(eb, slot);
0029 read_extent_buffer(eb, item, btrfs_item_ptr_offset(eb, slot),
0030 min_t(u32, len, sizeof(*item)));
0031 if (len < sizeof(*item))
0032 need_reset = 1;
0033 if (!need_reset && btrfs_root_generation(item)
0034 != btrfs_root_generation_v2(item)) {
0035 if (btrfs_root_generation_v2(item) != 0) {
0036 btrfs_warn(eb->fs_info,
0037 "mismatching generation and generation_v2 found in root item. This root was probably mounted with an older kernel. Resetting all new fields.");
0038 }
0039 need_reset = 1;
0040 }
0041 if (need_reset) {
0042
0043 memset_startat(item, 0, generation_v2);
0044 generate_random_guid(item->uuid);
0045 }
0046 }
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062 int btrfs_find_root(struct btrfs_root *root, const struct btrfs_key *search_key,
0063 struct btrfs_path *path, struct btrfs_root_item *root_item,
0064 struct btrfs_key *root_key)
0065 {
0066 struct btrfs_key found_key;
0067 struct extent_buffer *l;
0068 int ret;
0069 int slot;
0070
0071 ret = btrfs_search_slot(NULL, root, search_key, path, 0, 0);
0072 if (ret < 0)
0073 return ret;
0074
0075 if (search_key->offset != -1ULL) {
0076 if (ret > 0)
0077 goto out;
0078 } else {
0079 BUG_ON(ret == 0);
0080 if (path->slots[0] == 0)
0081 goto out;
0082 path->slots[0]--;
0083 ret = 0;
0084 }
0085
0086 l = path->nodes[0];
0087 slot = path->slots[0];
0088
0089 btrfs_item_key_to_cpu(l, &found_key, slot);
0090 if (found_key.objectid != search_key->objectid ||
0091 found_key.type != BTRFS_ROOT_ITEM_KEY) {
0092 ret = 1;
0093 goto out;
0094 }
0095
0096 if (root_item)
0097 btrfs_read_root_item(l, slot, root_item);
0098 if (root_key)
0099 memcpy(root_key, &found_key, sizeof(found_key));
0100 out:
0101 btrfs_release_path(path);
0102 return ret;
0103 }
0104
0105 void btrfs_set_root_node(struct btrfs_root_item *item,
0106 struct extent_buffer *node)
0107 {
0108 btrfs_set_root_bytenr(item, node->start);
0109 btrfs_set_root_level(item, btrfs_header_level(node));
0110 btrfs_set_root_generation(item, btrfs_header_generation(node));
0111 }
0112
0113
0114
0115
0116 int btrfs_update_root(struct btrfs_trans_handle *trans, struct btrfs_root
0117 *root, struct btrfs_key *key, struct btrfs_root_item
0118 *item)
0119 {
0120 struct btrfs_fs_info *fs_info = root->fs_info;
0121 struct btrfs_path *path;
0122 struct extent_buffer *l;
0123 int ret;
0124 int slot;
0125 unsigned long ptr;
0126 u32 old_len;
0127
0128 path = btrfs_alloc_path();
0129 if (!path)
0130 return -ENOMEM;
0131
0132 ret = btrfs_search_slot(trans, root, key, path, 0, 1);
0133 if (ret < 0)
0134 goto out;
0135
0136 if (ret > 0) {
0137 btrfs_crit(fs_info,
0138 "unable to find root key (%llu %u %llu) in tree %llu",
0139 key->objectid, key->type, key->offset,
0140 root->root_key.objectid);
0141 ret = -EUCLEAN;
0142 btrfs_abort_transaction(trans, ret);
0143 goto out;
0144 }
0145
0146 l = path->nodes[0];
0147 slot = path->slots[0];
0148 ptr = btrfs_item_ptr_offset(l, slot);
0149 old_len = btrfs_item_size(l, slot);
0150
0151
0152
0153
0154
0155
0156 if (old_len < sizeof(*item)) {
0157 btrfs_release_path(path);
0158 ret = btrfs_search_slot(trans, root, key, path,
0159 -1, 1);
0160 if (ret < 0) {
0161 btrfs_abort_transaction(trans, ret);
0162 goto out;
0163 }
0164
0165 ret = btrfs_del_item(trans, root, path);
0166 if (ret < 0) {
0167 btrfs_abort_transaction(trans, ret);
0168 goto out;
0169 }
0170 btrfs_release_path(path);
0171 ret = btrfs_insert_empty_item(trans, root, path,
0172 key, sizeof(*item));
0173 if (ret < 0) {
0174 btrfs_abort_transaction(trans, ret);
0175 goto out;
0176 }
0177 l = path->nodes[0];
0178 slot = path->slots[0];
0179 ptr = btrfs_item_ptr_offset(l, slot);
0180 }
0181
0182
0183
0184
0185
0186 btrfs_set_root_generation_v2(item, btrfs_root_generation(item));
0187
0188 write_extent_buffer(l, item, ptr, sizeof(*item));
0189 btrfs_mark_buffer_dirty(path->nodes[0]);
0190 out:
0191 btrfs_free_path(path);
0192 return ret;
0193 }
0194
0195 int btrfs_insert_root(struct btrfs_trans_handle *trans, struct btrfs_root *root,
0196 const struct btrfs_key *key, struct btrfs_root_item *item)
0197 {
0198
0199
0200
0201 btrfs_set_root_generation_v2(item, btrfs_root_generation(item));
0202 return btrfs_insert_item(trans, root, key, item, sizeof(*item));
0203 }
0204
0205 int btrfs_find_orphan_roots(struct btrfs_fs_info *fs_info)
0206 {
0207 struct btrfs_root *tree_root = fs_info->tree_root;
0208 struct extent_buffer *leaf;
0209 struct btrfs_path *path;
0210 struct btrfs_key key;
0211 struct btrfs_root *root;
0212 int err = 0;
0213 int ret;
0214
0215 path = btrfs_alloc_path();
0216 if (!path)
0217 return -ENOMEM;
0218
0219 key.objectid = BTRFS_ORPHAN_OBJECTID;
0220 key.type = BTRFS_ORPHAN_ITEM_KEY;
0221 key.offset = 0;
0222
0223 while (1) {
0224 u64 root_objectid;
0225
0226 ret = btrfs_search_slot(NULL, tree_root, &key, path, 0, 0);
0227 if (ret < 0) {
0228 err = ret;
0229 break;
0230 }
0231
0232 leaf = path->nodes[0];
0233 if (path->slots[0] >= btrfs_header_nritems(leaf)) {
0234 ret = btrfs_next_leaf(tree_root, path);
0235 if (ret < 0)
0236 err = ret;
0237 if (ret != 0)
0238 break;
0239 leaf = path->nodes[0];
0240 }
0241
0242 btrfs_item_key_to_cpu(leaf, &key, path->slots[0]);
0243 btrfs_release_path(path);
0244
0245 if (key.objectid != BTRFS_ORPHAN_OBJECTID ||
0246 key.type != BTRFS_ORPHAN_ITEM_KEY)
0247 break;
0248
0249 root_objectid = key.offset;
0250 key.offset++;
0251
0252 root = btrfs_get_fs_root(fs_info, root_objectid, false);
0253 err = PTR_ERR_OR_ZERO(root);
0254 if (err && err != -ENOENT) {
0255 break;
0256 } else if (err == -ENOENT) {
0257 struct btrfs_trans_handle *trans;
0258
0259 btrfs_release_path(path);
0260
0261 trans = btrfs_join_transaction(tree_root);
0262 if (IS_ERR(trans)) {
0263 err = PTR_ERR(trans);
0264 btrfs_handle_fs_error(fs_info, err,
0265 "Failed to start trans to delete orphan item");
0266 break;
0267 }
0268 err = btrfs_del_orphan_item(trans, tree_root,
0269 root_objectid);
0270 btrfs_end_transaction(trans);
0271 if (err) {
0272 btrfs_handle_fs_error(fs_info, err,
0273 "Failed to delete root orphan item");
0274 break;
0275 }
0276 continue;
0277 }
0278
0279 WARN_ON(!test_bit(BTRFS_ROOT_ORPHAN_ITEM_INSERTED, &root->state));
0280 if (btrfs_root_refs(&root->root_item) == 0) {
0281 struct btrfs_key drop_key;
0282
0283 btrfs_disk_key_to_cpu(&drop_key, &root->root_item.drop_progress);
0284
0285
0286
0287
0288
0289
0290 if (drop_key.objectid != 0 || drop_key.type != 0 ||
0291 drop_key.offset != 0) {
0292 set_bit(BTRFS_FS_UNFINISHED_DROPS, &fs_info->flags);
0293 set_bit(BTRFS_ROOT_UNFINISHED_DROP, &root->state);
0294 }
0295
0296 set_bit(BTRFS_ROOT_DEAD_TREE, &root->state);
0297 btrfs_add_dead_root(root);
0298 }
0299 btrfs_put_root(root);
0300 }
0301
0302 btrfs_free_path(path);
0303 return err;
0304 }
0305
0306
0307 int btrfs_del_root(struct btrfs_trans_handle *trans,
0308 const struct btrfs_key *key)
0309 {
0310 struct btrfs_root *root = trans->fs_info->tree_root;
0311 struct btrfs_path *path;
0312 int ret;
0313
0314 path = btrfs_alloc_path();
0315 if (!path)
0316 return -ENOMEM;
0317 ret = btrfs_search_slot(trans, root, key, path, -1, 1);
0318 if (ret < 0)
0319 goto out;
0320
0321 BUG_ON(ret != 0);
0322
0323 ret = btrfs_del_item(trans, root, path);
0324 out:
0325 btrfs_free_path(path);
0326 return ret;
0327 }
0328
0329 int btrfs_del_root_ref(struct btrfs_trans_handle *trans, u64 root_id,
0330 u64 ref_id, u64 dirid, u64 *sequence, const char *name,
0331 int name_len)
0332
0333 {
0334 struct btrfs_root *tree_root = trans->fs_info->tree_root;
0335 struct btrfs_path *path;
0336 struct btrfs_root_ref *ref;
0337 struct extent_buffer *leaf;
0338 struct btrfs_key key;
0339 unsigned long ptr;
0340 int err = 0;
0341 int ret;
0342
0343 path = btrfs_alloc_path();
0344 if (!path)
0345 return -ENOMEM;
0346
0347 key.objectid = root_id;
0348 key.type = BTRFS_ROOT_BACKREF_KEY;
0349 key.offset = ref_id;
0350 again:
0351 ret = btrfs_search_slot(trans, tree_root, &key, path, -1, 1);
0352 if (ret < 0) {
0353 err = ret;
0354 goto out;
0355 } else if (ret == 0) {
0356 leaf = path->nodes[0];
0357 ref = btrfs_item_ptr(leaf, path->slots[0],
0358 struct btrfs_root_ref);
0359 ptr = (unsigned long)(ref + 1);
0360 if ((btrfs_root_ref_dirid(leaf, ref) != dirid) ||
0361 (btrfs_root_ref_name_len(leaf, ref) != name_len) ||
0362 memcmp_extent_buffer(leaf, name, ptr, name_len)) {
0363 err = -ENOENT;
0364 goto out;
0365 }
0366 *sequence = btrfs_root_ref_sequence(leaf, ref);
0367
0368 ret = btrfs_del_item(trans, tree_root, path);
0369 if (ret) {
0370 err = ret;
0371 goto out;
0372 }
0373 } else
0374 err = -ENOENT;
0375
0376 if (key.type == BTRFS_ROOT_BACKREF_KEY) {
0377 btrfs_release_path(path);
0378 key.objectid = ref_id;
0379 key.type = BTRFS_ROOT_REF_KEY;
0380 key.offset = root_id;
0381 goto again;
0382 }
0383
0384 out:
0385 btrfs_free_path(path);
0386 return err;
0387 }
0388
0389
0390
0391
0392
0393
0394
0395
0396
0397
0398
0399
0400
0401
0402
0403
0404 int btrfs_add_root_ref(struct btrfs_trans_handle *trans, u64 root_id,
0405 u64 ref_id, u64 dirid, u64 sequence, const char *name,
0406 int name_len)
0407 {
0408 struct btrfs_root *tree_root = trans->fs_info->tree_root;
0409 struct btrfs_key key;
0410 int ret;
0411 struct btrfs_path *path;
0412 struct btrfs_root_ref *ref;
0413 struct extent_buffer *leaf;
0414 unsigned long ptr;
0415
0416 path = btrfs_alloc_path();
0417 if (!path)
0418 return -ENOMEM;
0419
0420 key.objectid = root_id;
0421 key.type = BTRFS_ROOT_BACKREF_KEY;
0422 key.offset = ref_id;
0423 again:
0424 ret = btrfs_insert_empty_item(trans, tree_root, path, &key,
0425 sizeof(*ref) + name_len);
0426 if (ret) {
0427 btrfs_abort_transaction(trans, ret);
0428 btrfs_free_path(path);
0429 return ret;
0430 }
0431
0432 leaf = path->nodes[0];
0433 ref = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_root_ref);
0434 btrfs_set_root_ref_dirid(leaf, ref, dirid);
0435 btrfs_set_root_ref_sequence(leaf, ref, sequence);
0436 btrfs_set_root_ref_name_len(leaf, ref, name_len);
0437 ptr = (unsigned long)(ref + 1);
0438 write_extent_buffer(leaf, name, ptr, name_len);
0439 btrfs_mark_buffer_dirty(leaf);
0440
0441 if (key.type == BTRFS_ROOT_BACKREF_KEY) {
0442 btrfs_release_path(path);
0443 key.objectid = ref_id;
0444 key.type = BTRFS_ROOT_REF_KEY;
0445 key.offset = root_id;
0446 goto again;
0447 }
0448
0449 btrfs_free_path(path);
0450 return 0;
0451 }
0452
0453
0454
0455
0456
0457
0458
0459 void btrfs_check_and_init_root_item(struct btrfs_root_item *root_item)
0460 {
0461 u64 inode_flags = btrfs_stack_inode_flags(&root_item->inode);
0462
0463 if (!(inode_flags & BTRFS_INODE_ROOT_ITEM_INIT)) {
0464 inode_flags |= BTRFS_INODE_ROOT_ITEM_INIT;
0465 btrfs_set_stack_inode_flags(&root_item->inode, inode_flags);
0466 btrfs_set_root_flags(root_item, 0);
0467 btrfs_set_root_limit(root_item, 0);
0468 }
0469 }
0470
0471 void btrfs_update_root_times(struct btrfs_trans_handle *trans,
0472 struct btrfs_root *root)
0473 {
0474 struct btrfs_root_item *item = &root->root_item;
0475 struct timespec64 ct;
0476
0477 ktime_get_real_ts64(&ct);
0478 spin_lock(&root->root_item_lock);
0479 btrfs_set_root_ctransid(item, trans->transid);
0480 btrfs_set_stack_timespec_sec(&item->ctime, ct.tv_sec);
0481 btrfs_set_stack_timespec_nsec(&item->ctime, ct.tv_nsec);
0482 spin_unlock(&root->root_item_lock);
0483 }
0484
0485
0486
0487
0488
0489
0490
0491
0492
0493
0494
0495
0496
0497
0498
0499 int btrfs_subvolume_reserve_metadata(struct btrfs_root *root,
0500 struct btrfs_block_rsv *rsv, int items,
0501 bool use_global_rsv)
0502 {
0503 u64 qgroup_num_bytes = 0;
0504 u64 num_bytes;
0505 int ret;
0506 struct btrfs_fs_info *fs_info = root->fs_info;
0507 struct btrfs_block_rsv *global_rsv = &fs_info->global_block_rsv;
0508
0509 if (test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) {
0510
0511 qgroup_num_bytes = 3 * fs_info->nodesize;
0512 ret = btrfs_qgroup_reserve_meta_prealloc(root,
0513 qgroup_num_bytes, true,
0514 false);
0515 if (ret)
0516 return ret;
0517 }
0518
0519 num_bytes = btrfs_calc_insert_metadata_size(fs_info, items);
0520 rsv->space_info = btrfs_find_space_info(fs_info,
0521 BTRFS_BLOCK_GROUP_METADATA);
0522 ret = btrfs_block_rsv_add(fs_info, rsv, num_bytes,
0523 BTRFS_RESERVE_FLUSH_ALL);
0524
0525 if (ret == -ENOSPC && use_global_rsv)
0526 ret = btrfs_block_rsv_migrate(global_rsv, rsv, num_bytes, true);
0527
0528 if (ret && qgroup_num_bytes)
0529 btrfs_qgroup_free_meta_prealloc(root, qgroup_num_bytes);
0530
0531 if (!ret) {
0532 spin_lock(&rsv->lock);
0533 rsv->qgroup_rsv_reserved += qgroup_num_bytes;
0534 spin_unlock(&rsv->lock);
0535 }
0536 return ret;
0537 }
0538
0539 void btrfs_subvolume_release_metadata(struct btrfs_root *root,
0540 struct btrfs_block_rsv *rsv)
0541 {
0542 struct btrfs_fs_info *fs_info = root->fs_info;
0543 u64 qgroup_to_release;
0544
0545 btrfs_block_rsv_release(fs_info, rsv, (u64)-1, &qgroup_to_release);
0546 btrfs_qgroup_convert_reserved_meta(root, qgroup_to_release);
0547 }