0001
0002
0003 #include <linux/init.h>
0004 #include <linux/fs.h>
0005 #include <linux/slab.h>
0006 #include <linux/rwsem.h>
0007 #include <linux/xattr.h>
0008 #include <linux/security.h>
0009 #include <linux/posix_acl_xattr.h>
0010 #include <linux/iversion.h>
0011 #include <linux/fsverity.h>
0012 #include <linux/sched/mm.h>
0013 #include "ctree.h"
0014 #include "btrfs_inode.h"
0015 #include "transaction.h"
0016 #include "disk-io.h"
0017 #include "locking.h"
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063 #define MERKLE_START_ALIGN 65536
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080 static loff_t merkle_file_pos(const struct inode *inode)
0081 {
0082 u64 sz = inode->i_size;
0083 u64 rounded = round_up(sz, MERKLE_START_ALIGN);
0084
0085 if (rounded > inode->i_sb->s_maxbytes)
0086 return -EFBIG;
0087
0088 return rounded;
0089 }
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103 static int drop_verity_items(struct btrfs_inode *inode, u8 key_type)
0104 {
0105 struct btrfs_trans_handle *trans;
0106 struct btrfs_root *root = inode->root;
0107 struct btrfs_path *path;
0108 struct btrfs_key key;
0109 int count = 0;
0110 int ret;
0111
0112 path = btrfs_alloc_path();
0113 if (!path)
0114 return -ENOMEM;
0115
0116 while (1) {
0117
0118 trans = btrfs_start_transaction(root, 1);
0119 if (IS_ERR(trans)) {
0120 ret = PTR_ERR(trans);
0121 goto out;
0122 }
0123
0124
0125
0126
0127
0128 key.objectid = btrfs_ino(inode);
0129 key.type = key_type;
0130 key.offset = (u64)-1;
0131
0132 ret = btrfs_search_slot(trans, root, &key, path, -1, 1);
0133 if (ret > 0) {
0134 ret = 0;
0135
0136 if (path->slots[0] == 0)
0137 break;
0138 path->slots[0]--;
0139 } else if (ret < 0) {
0140 btrfs_end_transaction(trans);
0141 goto out;
0142 }
0143
0144 btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
0145
0146
0147 if (key.objectid != btrfs_ino(inode) || key.type != key_type)
0148 break;
0149
0150
0151
0152
0153
0154
0155
0156 ret = btrfs_del_items(trans, root, path, path->slots[0], 1);
0157 if (ret) {
0158 btrfs_end_transaction(trans);
0159 goto out;
0160 }
0161 count++;
0162 btrfs_release_path(path);
0163 btrfs_end_transaction(trans);
0164 }
0165 ret = count;
0166 btrfs_end_transaction(trans);
0167 out:
0168 btrfs_free_path(path);
0169 return ret;
0170 }
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182 int btrfs_drop_verity_items(struct btrfs_inode *inode)
0183 {
0184 int ret;
0185
0186 ret = drop_verity_items(inode, BTRFS_VERITY_DESC_ITEM_KEY);
0187 if (ret < 0)
0188 return ret;
0189 ret = drop_verity_items(inode, BTRFS_VERITY_MERKLE_ITEM_KEY);
0190 if (ret < 0)
0191 return ret;
0192
0193 return 0;
0194 }
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211 static int write_key_bytes(struct btrfs_inode *inode, u8 key_type, u64 offset,
0212 const char *src, u64 len)
0213 {
0214 struct btrfs_trans_handle *trans;
0215 struct btrfs_path *path;
0216 struct btrfs_root *root = inode->root;
0217 struct extent_buffer *leaf;
0218 struct btrfs_key key;
0219 unsigned long copy_bytes;
0220 unsigned long src_offset = 0;
0221 void *data;
0222 int ret = 0;
0223
0224 path = btrfs_alloc_path();
0225 if (!path)
0226 return -ENOMEM;
0227
0228 while (len > 0) {
0229
0230 trans = btrfs_start_transaction(root, 1);
0231 if (IS_ERR(trans)) {
0232 ret = PTR_ERR(trans);
0233 break;
0234 }
0235
0236 key.objectid = btrfs_ino(inode);
0237 key.type = key_type;
0238 key.offset = offset;
0239
0240
0241
0242
0243
0244 copy_bytes = min_t(u64, len, 2048);
0245
0246 ret = btrfs_insert_empty_item(trans, root, path, &key, copy_bytes);
0247 if (ret) {
0248 btrfs_end_transaction(trans);
0249 break;
0250 }
0251
0252 leaf = path->nodes[0];
0253
0254 data = btrfs_item_ptr(leaf, path->slots[0], void);
0255 write_extent_buffer(leaf, src + src_offset,
0256 (unsigned long)data, copy_bytes);
0257 offset += copy_bytes;
0258 src_offset += copy_bytes;
0259 len -= copy_bytes;
0260
0261 btrfs_release_path(path);
0262 btrfs_end_transaction(trans);
0263 }
0264
0265 btrfs_free_path(path);
0266 return ret;
0267 }
0268
0269
0270
0271
0272
0273
0274
0275
0276
0277
0278
0279
0280
0281
0282
0283
0284
0285
0286
0287
0288
0289
0290
0291 static int read_key_bytes(struct btrfs_inode *inode, u8 key_type, u64 offset,
0292 char *dest, u64 len, struct page *dest_page)
0293 {
0294 struct btrfs_path *path;
0295 struct btrfs_root *root = inode->root;
0296 struct extent_buffer *leaf;
0297 struct btrfs_key key;
0298 u64 item_end;
0299 u64 copy_end;
0300 int copied = 0;
0301 u32 copy_offset;
0302 unsigned long copy_bytes;
0303 unsigned long dest_offset = 0;
0304 void *data;
0305 char *kaddr = dest;
0306 int ret;
0307
0308 path = btrfs_alloc_path();
0309 if (!path)
0310 return -ENOMEM;
0311
0312 if (dest_page)
0313 path->reada = READA_FORWARD;
0314
0315 key.objectid = btrfs_ino(inode);
0316 key.type = key_type;
0317 key.offset = offset;
0318
0319 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
0320 if (ret < 0) {
0321 goto out;
0322 } else if (ret > 0) {
0323 ret = 0;
0324 if (path->slots[0] == 0)
0325 goto out;
0326 path->slots[0]--;
0327 }
0328
0329 while (len > 0) {
0330 leaf = path->nodes[0];
0331 btrfs_item_key_to_cpu(leaf, &key, path->slots[0]);
0332
0333 if (key.objectid != btrfs_ino(inode) || key.type != key_type)
0334 break;
0335
0336 item_end = btrfs_item_size(leaf, path->slots[0]) + key.offset;
0337
0338 if (copied > 0) {
0339
0340
0341
0342
0343 if (key.offset != offset)
0344 break;
0345 } else {
0346
0347
0348
0349
0350 if (key.offset > offset)
0351 break;
0352 if (item_end <= offset)
0353 break;
0354 }
0355
0356
0357 if (!dest)
0358 copy_end = item_end;
0359 else
0360 copy_end = min(offset + len, item_end);
0361
0362
0363 copy_bytes = copy_end - offset;
0364
0365
0366 copy_offset = offset - key.offset;
0367
0368 if (dest) {
0369 if (dest_page)
0370 kaddr = kmap_local_page(dest_page);
0371
0372 data = btrfs_item_ptr(leaf, path->slots[0], void);
0373 read_extent_buffer(leaf, kaddr + dest_offset,
0374 (unsigned long)data + copy_offset,
0375 copy_bytes);
0376
0377 if (dest_page)
0378 kunmap_local(kaddr);
0379 }
0380
0381 offset += copy_bytes;
0382 dest_offset += copy_bytes;
0383 len -= copy_bytes;
0384 copied += copy_bytes;
0385
0386 path->slots[0]++;
0387 if (path->slots[0] >= btrfs_header_nritems(path->nodes[0])) {
0388
0389
0390
0391
0392 ret = btrfs_next_leaf(root, path);
0393 if (ret < 0) {
0394 break;
0395 } else if (ret > 0) {
0396 ret = 0;
0397 break;
0398 }
0399 }
0400 }
0401 out:
0402 btrfs_free_path(path);
0403 if (!ret)
0404 ret = copied;
0405 return ret;
0406 }
0407
0408
0409
0410
0411
0412
0413
0414
0415
0416
0417
0418
0419
0420 static int del_orphan(struct btrfs_trans_handle *trans, struct btrfs_inode *inode)
0421 {
0422 struct btrfs_root *root = inode->root;
0423 int ret;
0424
0425
0426
0427
0428
0429
0430
0431
0432 if (!inode->vfs_inode.i_nlink)
0433 return 0;
0434
0435 ret = btrfs_del_orphan_item(trans, root, btrfs_ino(inode));
0436 if (ret == -ENOENT)
0437 ret = 0;
0438 return ret;
0439 }
0440
0441
0442
0443
0444
0445
0446
0447
0448
0449
0450
0451
0452 static int rollback_verity(struct btrfs_inode *inode)
0453 {
0454 struct btrfs_trans_handle *trans = NULL;
0455 struct btrfs_root *root = inode->root;
0456 int ret;
0457
0458 ASSERT(inode_is_locked(&inode->vfs_inode));
0459 truncate_inode_pages(inode->vfs_inode.i_mapping, inode->vfs_inode.i_size);
0460 clear_bit(BTRFS_INODE_VERITY_IN_PROGRESS, &inode->runtime_flags);
0461 ret = btrfs_drop_verity_items(inode);
0462 if (ret) {
0463 btrfs_handle_fs_error(root->fs_info, ret,
0464 "failed to drop verity items in rollback %llu",
0465 (u64)inode->vfs_inode.i_ino);
0466 goto out;
0467 }
0468
0469
0470
0471
0472
0473 trans = btrfs_start_transaction(root, 2);
0474 if (IS_ERR(trans)) {
0475 ret = PTR_ERR(trans);
0476 trans = NULL;
0477 btrfs_handle_fs_error(root->fs_info, ret,
0478 "failed to start transaction in verity rollback %llu",
0479 (u64)inode->vfs_inode.i_ino);
0480 goto out;
0481 }
0482 inode->ro_flags &= ~BTRFS_INODE_RO_VERITY;
0483 btrfs_sync_inode_flags_to_i_flags(&inode->vfs_inode);
0484 ret = btrfs_update_inode(trans, root, inode);
0485 if (ret) {
0486 btrfs_abort_transaction(trans, ret);
0487 goto out;
0488 }
0489 ret = del_orphan(trans, inode);
0490 if (ret) {
0491 btrfs_abort_transaction(trans, ret);
0492 goto out;
0493 }
0494 out:
0495 if (trans)
0496 btrfs_end_transaction(trans);
0497 return ret;
0498 }
0499
0500
0501
0502
0503
0504
0505
0506
0507
0508
0509
0510
0511
0512
0513
0514
0515
0516
0517
0518 static int finish_verity(struct btrfs_inode *inode, const void *desc,
0519 size_t desc_size)
0520 {
0521 struct btrfs_trans_handle *trans = NULL;
0522 struct btrfs_root *root = inode->root;
0523 struct btrfs_verity_descriptor_item item;
0524 int ret;
0525
0526
0527 memset(&item, 0, sizeof(item));
0528 btrfs_set_stack_verity_descriptor_size(&item, desc_size);
0529 ret = write_key_bytes(inode, BTRFS_VERITY_DESC_ITEM_KEY, 0,
0530 (const char *)&item, sizeof(item));
0531 if (ret)
0532 goto out;
0533
0534
0535 ret = write_key_bytes(inode, BTRFS_VERITY_DESC_ITEM_KEY, 1,
0536 desc, desc_size);
0537 if (ret)
0538 goto out;
0539
0540
0541
0542
0543
0544 trans = btrfs_start_transaction(root, 2);
0545 if (IS_ERR(trans)) {
0546 ret = PTR_ERR(trans);
0547 goto out;
0548 }
0549 inode->ro_flags |= BTRFS_INODE_RO_VERITY;
0550 btrfs_sync_inode_flags_to_i_flags(&inode->vfs_inode);
0551 ret = btrfs_update_inode(trans, root, inode);
0552 if (ret)
0553 goto end_trans;
0554 ret = del_orphan(trans, inode);
0555 if (ret)
0556 goto end_trans;
0557 clear_bit(BTRFS_INODE_VERITY_IN_PROGRESS, &inode->runtime_flags);
0558 btrfs_set_fs_compat_ro(root->fs_info, VERITY);
0559 end_trans:
0560 btrfs_end_transaction(trans);
0561 out:
0562 return ret;
0563
0564 }
0565
0566
0567
0568
0569
0570
0571
0572
0573
0574
0575
0576 static int btrfs_begin_enable_verity(struct file *filp)
0577 {
0578 struct btrfs_inode *inode = BTRFS_I(file_inode(filp));
0579 struct btrfs_root *root = inode->root;
0580 struct btrfs_trans_handle *trans;
0581 int ret;
0582
0583 ASSERT(inode_is_locked(file_inode(filp)));
0584
0585 if (test_bit(BTRFS_INODE_VERITY_IN_PROGRESS, &inode->runtime_flags))
0586 return -EBUSY;
0587
0588
0589
0590
0591
0592
0593
0594 ret = btrfs_drop_verity_items(inode);
0595 if (ret)
0596 return ret;
0597
0598
0599 trans = btrfs_start_transaction(root, 1);
0600 if (IS_ERR(trans))
0601 return PTR_ERR(trans);
0602
0603 ret = btrfs_orphan_add(trans, inode);
0604 if (!ret)
0605 set_bit(BTRFS_INODE_VERITY_IN_PROGRESS, &inode->runtime_flags);
0606 btrfs_end_transaction(trans);
0607
0608 return 0;
0609 }
0610
0611
0612
0613
0614
0615
0616
0617
0618
0619
0620
0621
0622
0623
0624 static int btrfs_end_enable_verity(struct file *filp, const void *desc,
0625 size_t desc_size, u64 merkle_tree_size)
0626 {
0627 struct btrfs_inode *inode = BTRFS_I(file_inode(filp));
0628 int ret = 0;
0629 int rollback_ret;
0630
0631 ASSERT(inode_is_locked(file_inode(filp)));
0632
0633 if (desc == NULL)
0634 goto rollback;
0635
0636 ret = finish_verity(inode, desc, desc_size);
0637 if (ret)
0638 goto rollback;
0639 return ret;
0640
0641 rollback:
0642 rollback_ret = rollback_verity(inode);
0643 if (rollback_ret)
0644 btrfs_err(inode->root->fs_info,
0645 "failed to rollback verity items: %d", rollback_ret);
0646 return ret;
0647 }
0648
0649
0650
0651
0652
0653
0654
0655
0656
0657
0658
0659
0660
0661
0662 static int btrfs_get_verity_descriptor(struct inode *inode, void *buf,
0663 size_t buf_size)
0664 {
0665 u64 true_size;
0666 int ret = 0;
0667 struct btrfs_verity_descriptor_item item;
0668
0669 memset(&item, 0, sizeof(item));
0670 ret = read_key_bytes(BTRFS_I(inode), BTRFS_VERITY_DESC_ITEM_KEY, 0,
0671 (char *)&item, sizeof(item), NULL);
0672 if (ret < 0)
0673 return ret;
0674
0675 if (item.reserved[0] != 0 || item.reserved[1] != 0)
0676 return -EUCLEAN;
0677
0678 true_size = btrfs_stack_verity_descriptor_size(&item);
0679 if (true_size > INT_MAX)
0680 return -EUCLEAN;
0681
0682 if (buf_size == 0)
0683 return true_size;
0684 if (buf_size < true_size)
0685 return -ERANGE;
0686
0687 ret = read_key_bytes(BTRFS_I(inode), BTRFS_VERITY_DESC_ITEM_KEY, 1,
0688 buf, buf_size, NULL);
0689 if (ret < 0)
0690 return ret;
0691 if (ret != true_size)
0692 return -EIO;
0693
0694 return true_size;
0695 }
0696
0697
0698
0699
0700
0701
0702
0703
0704
0705
0706
0707
0708
0709 static struct page *btrfs_read_merkle_tree_page(struct inode *inode,
0710 pgoff_t index,
0711 unsigned long num_ra_pages)
0712 {
0713 struct page *page;
0714 u64 off = (u64)index << PAGE_SHIFT;
0715 loff_t merkle_pos = merkle_file_pos(inode);
0716 int ret;
0717
0718 if (merkle_pos < 0)
0719 return ERR_PTR(merkle_pos);
0720 if (merkle_pos > inode->i_sb->s_maxbytes - off - PAGE_SIZE)
0721 return ERR_PTR(-EFBIG);
0722 index += merkle_pos >> PAGE_SHIFT;
0723 again:
0724 page = find_get_page_flags(inode->i_mapping, index, FGP_ACCESSED);
0725 if (page) {
0726 if (PageUptodate(page))
0727 return page;
0728
0729 lock_page(page);
0730
0731
0732
0733
0734 if (!PageUptodate(page)) {
0735 unlock_page(page);
0736 put_page(page);
0737 return ERR_PTR(-EIO);
0738 }
0739 unlock_page(page);
0740 return page;
0741 }
0742
0743 page = __page_cache_alloc(mapping_gfp_constraint(inode->i_mapping, ~__GFP_FS));
0744 if (!page)
0745 return ERR_PTR(-ENOMEM);
0746
0747
0748
0749
0750
0751
0752
0753 ret = read_key_bytes(BTRFS_I(inode), BTRFS_VERITY_MERKLE_ITEM_KEY, off,
0754 page_address(page), PAGE_SIZE, page);
0755 if (ret < 0) {
0756 put_page(page);
0757 return ERR_PTR(ret);
0758 }
0759 if (ret < PAGE_SIZE)
0760 memzero_page(page, ret, PAGE_SIZE - ret);
0761
0762 SetPageUptodate(page);
0763 ret = add_to_page_cache_lru(page, inode->i_mapping, index, GFP_NOFS);
0764
0765 if (!ret) {
0766
0767 unlock_page(page);
0768 } else {
0769 put_page(page);
0770
0771 if (ret == -EEXIST)
0772 goto again;
0773 page = ERR_PTR(ret);
0774 }
0775 return page;
0776 }
0777
0778
0779
0780
0781
0782
0783
0784
0785
0786
0787
0788
0789
0790
0791 static int btrfs_write_merkle_tree_block(struct inode *inode, const void *buf,
0792 u64 index, int log_blocksize)
0793 {
0794 u64 off = index << log_blocksize;
0795 u64 len = 1ULL << log_blocksize;
0796 loff_t merkle_pos = merkle_file_pos(inode);
0797
0798 if (merkle_pos < 0)
0799 return merkle_pos;
0800 if (merkle_pos > inode->i_sb->s_maxbytes - off - len)
0801 return -EFBIG;
0802
0803 return write_key_bytes(BTRFS_I(inode), BTRFS_VERITY_MERKLE_ITEM_KEY,
0804 off, buf, len);
0805 }
0806
0807 const struct fsverity_operations btrfs_verityops = {
0808 .begin_enable_verity = btrfs_begin_enable_verity,
0809 .end_enable_verity = btrfs_end_enable_verity,
0810 .get_verity_descriptor = btrfs_get_verity_descriptor,
0811 .read_merkle_tree_page = btrfs_read_merkle_tree_page,
0812 .write_merkle_tree_block = btrfs_write_merkle_tree_block,
0813 };