Lines Matching +full:key +full:- +full:code
1 // SPDX-License-Identifier: GPL-2.0
16 #include "disk-io.h"
26 * has a lot of careful code around i_size and it seems better to make a new key
35 * fs verity items are stored under two different key types on disk.
43 * the higher level verity code. The most common descriptor size is 256 bytes.
50 * starting at offset 0 for this key type. These are also opaque to btrfs,
54 * linearly with the size of the file (with 4K pages/blocks and SHA-256, it's
71 * fs-verity, it is convenient to do size computations in terms of a file
78 * Returns the file offset on success, negative error code on failure.
82 u64 sz = inode->i_size; in merkle_file_pos()
85 if (rounded > inode->i_sb->s_maxbytes) in merkle_file_pos()
86 return -EFBIG; in merkle_file_pos()
101 * Returns number of dropped items on success, negative error code on failure.
106 struct btrfs_root *root = inode->root; in drop_verity_items()
108 struct btrfs_key key; in drop_verity_items() local
114 return -ENOMEM; in drop_verity_items()
126 * isn't from our key type or objectid in drop_verity_items()
128 key.objectid = btrfs_ino(inode); in drop_verity_items()
129 key.type = key_type; in drop_verity_items()
130 key.offset = (u64)-1; in drop_verity_items()
132 ret = btrfs_search_slot(trans, root, &key, path, -1, 1); in drop_verity_items()
136 if (path->slots[0] == 0) in drop_verity_items()
138 path->slots[0]--; in drop_verity_items()
144 btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]); in drop_verity_items()
147 if (key.objectid != btrfs_ino(inode) || key.type != key_type) in drop_verity_items()
156 ret = btrfs_del_items(trans, root, path, path->slots[0], 1); in drop_verity_items()
180 * Returns: 0 on success, negative error code on failure.
197 * Insert and write inode items with a given key type and offset.
200 * @key_type: key type to insert
206 * The inserted items will have key (ino, key_type, offset + off) where off is
209 * Returns 0 on success and a negative error code on failure.
216 struct btrfs_root *root = inode->root; in write_key_bytes()
218 struct btrfs_key key; in write_key_bytes() local
226 return -ENOMEM; in write_key_bytes()
236 key.objectid = btrfs_ino(inode); in write_key_bytes()
237 key.type = key_type; in write_key_bytes()
238 key.offset = offset; in write_key_bytes()
246 ret = btrfs_insert_empty_item(trans, root, path, &key, copy_bytes); in write_key_bytes()
252 leaf = path->nodes[0]; in write_key_bytes()
254 data = btrfs_item_ptr(leaf, path->slots[0], void); in write_key_bytes()
259 len -= copy_bytes; in write_key_bytes()
270 * Read inode items of the given key type and offset from the btree.
273 * @key_type: key type to read
279 * page and ignore dest, but it must still be non-NULL to avoid the
280 * counting-only behavior.
289 * Returns number of bytes read or a negative error code on failure.
295 struct btrfs_root *root = inode->root; in read_key_bytes()
297 struct btrfs_key key; in read_key_bytes() local
310 return -ENOMEM; in read_key_bytes()
313 path->reada = READA_FORWARD; in read_key_bytes()
315 key.objectid = btrfs_ino(inode); in read_key_bytes()
316 key.type = key_type; in read_key_bytes()
317 key.offset = offset; in read_key_bytes()
319 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); in read_key_bytes()
324 if (path->slots[0] == 0) in read_key_bytes()
326 path->slots[0]--; in read_key_bytes()
330 leaf = path->nodes[0]; in read_key_bytes()
331 btrfs_item_key_to_cpu(leaf, &key, path->slots[0]); in read_key_bytes()
333 if (key.objectid != btrfs_ino(inode) || key.type != key_type) in read_key_bytes()
336 item_end = btrfs_item_size_nr(leaf, path->slots[0]) + key.offset; in read_key_bytes()
343 if (key.offset != offset) in read_key_bytes()
350 if (key.offset > offset) in read_key_bytes()
363 copy_bytes = copy_end - offset; in read_key_bytes()
366 copy_offset = offset - key.offset; in read_key_bytes()
372 data = btrfs_item_ptr(leaf, path->slots[0], void); in read_key_bytes()
383 len -= copy_bytes; in read_key_bytes()
386 path->slots[0]++; in read_key_bytes()
387 if (path->slots[0] >= btrfs_header_nritems(path->nodes[0])) { in read_key_bytes()
418 * Returns zero on success or a negative error code on failure.
422 struct btrfs_root *root = inode->root; in del_orphan()
432 if (!inode->vfs_inode.i_nlink) in del_orphan()
436 if (ret == -ENOENT) in del_orphan()
442 * Rollback in-progress verity if we encounter an error.
450 * Returns 0 on success, negative error code on failure.
455 struct btrfs_root *root = inode->root; in rollback_verity()
458 ASSERT(inode_is_locked(&inode->vfs_inode)); in rollback_verity()
459 truncate_inode_pages(inode->vfs_inode.i_mapping, inode->vfs_inode.i_size); in rollback_verity()
460 clear_bit(BTRFS_INODE_VERITY_IN_PROGRESS, &inode->runtime_flags); in rollback_verity()
463 btrfs_handle_fs_error(root->fs_info, ret, in rollback_verity()
465 (u64)inode->vfs_inode.i_ino); in rollback_verity()
477 btrfs_handle_fs_error(root->fs_info, ret, in rollback_verity()
479 (u64)inode->vfs_inode.i_ino); in rollback_verity()
482 inode->ro_flags &= ~BTRFS_INODE_RO_VERITY; in rollback_verity()
483 btrfs_sync_inode_flags_to_i_flags(&inode->vfs_inode); in rollback_verity()
510 * - write out the descriptor items
511 * - mark the inode with the verity flag
512 * - delete the orphan item
513 * - mark the ro compat bit
514 * - clear the in progress bit
516 * Returns 0 on success, negative error code on failure.
522 struct btrfs_root *root = inode->root; in finish_verity()
549 inode->ro_flags |= BTRFS_INODE_RO_VERITY; in finish_verity()
550 btrfs_sync_inode_flags_to_i_flags(&inode->vfs_inode); in finish_verity()
557 clear_bit(BTRFS_INODE_VERITY_IN_PROGRESS, &inode->runtime_flags); in finish_verity()
558 btrfs_set_fs_compat_ro(root->fs_info, VERITY); in finish_verity()
574 * Returns 0 on success, negative error code on failure.
579 struct btrfs_root *root = inode->root; in btrfs_begin_enable_verity()
585 if (test_bit(BTRFS_INODE_VERITY_IN_PROGRESS, &inode->runtime_flags)) in btrfs_begin_enable_verity()
586 return -EBUSY; in btrfs_begin_enable_verity()
605 set_bit(BTRFS_INODE_VERITY_IN_PROGRESS, &inode->runtime_flags); in btrfs_begin_enable_verity()
622 * Returns 0 on success, negative error code on error.
644 btrfs_err(inode->root->fs_info, in btrfs_end_enable_verity()
660 * Returns the size on success or a negative error code on failure.
676 return -EUCLEAN; in btrfs_get_verity_descriptor()
680 return -EUCLEAN; in btrfs_get_verity_descriptor()
685 return -ERANGE; in btrfs_get_verity_descriptor()
692 return -EIO; in btrfs_get_verity_descriptor()
720 if (merkle_pos > inode->i_sb->s_maxbytes - off - PAGE_SIZE) in btrfs_read_merkle_tree_page()
721 return ERR_PTR(-EFBIG); in btrfs_read_merkle_tree_page()
724 page = find_get_page_flags(inode->i_mapping, index, FGP_ACCESSED); in btrfs_read_merkle_tree_page()
737 return ERR_PTR(-EIO); in btrfs_read_merkle_tree_page()
743 page = __page_cache_alloc(mapping_gfp_constraint(inode->i_mapping, ~__GFP_FS)); in btrfs_read_merkle_tree_page()
745 return ERR_PTR(-ENOMEM); in btrfs_read_merkle_tree_page()
760 memzero_page(page, ret, PAGE_SIZE - ret); in btrfs_read_merkle_tree_page()
763 ret = add_to_page_cache_lru(page, inode->i_mapping, index, GFP_NOFS); in btrfs_read_merkle_tree_page()
771 if (ret == -EEXIST) in btrfs_read_merkle_tree_page()
789 * Returns 0 on success or negative error code on failure
800 if (merkle_pos > inode->i_sb->s_maxbytes - off - len) in btrfs_write_merkle_tree_block()
801 return -EFBIG; in btrfs_write_merkle_tree_block()