From f8efe9f724c08b5f855ce48a1129653642b7415b Mon Sep 17 00:00:00 2001 From: Josef Bacik Date: Wed, 19 Apr 2023 17:17:17 -0400 Subject: [PATCH] btrfs-progs: sync file-item.h into progs This patch syncs file-item.h into btrfs-progs. This carries with it an API change for btrfs_del_csums, which takes a root argument in the kernel, so all callsites have been updated accordingly. I didn't sync file-item.c because it carries with it a bunch of bio related helpers which are difficult to adapt to the kernel. Additionally there's a few helpers in the local copy of file-item.c that aren't in the kernel that are required for different tools. This requires more cleanups in both the kernel and progs in order to sync file-item.c, so for now just do file-item.h in order to pull things out of ctree.h. Signed-off-by: Josef Bacik Signed-off-by: David Sterba --- btrfs-corrupt-block.c | 3 +- check/clear-cache.c | 7 ++- check/main.c | 1 + check/mode-common.c | 6 ++- check/mode-lowmem.c | 1 + cmds/inspect-tree-stats.c | 1 + cmds/restore.c | 1 + convert/main.c | 1 + convert/source-ext2.c | 1 + convert/source-reiserfs.c | 1 + image/main.c | 1 + kernel-shared/ctree.h | 45 ------------------- kernel-shared/extent-tree.c | 9 +++- kernel-shared/file-item.c | 13 +++--- kernel-shared/file-item.h | 89 +++++++++++++++++++++++++++++++++++++ kernel-shared/file.c | 1 + kernel-shared/print-tree.c | 1 + mkfs/rootdir.c | 1 + 18 files changed, 126 insertions(+), 57 deletions(-) create mode 100644 kernel-shared/file-item.h diff --git a/btrfs-corrupt-block.c b/btrfs-corrupt-block.c index 91e5c7dd..35933854 100644 --- a/btrfs-corrupt-block.c +++ b/btrfs-corrupt-block.c @@ -28,6 +28,7 @@ #include "kernel-shared/disk-io.h" #include "kernel-shared/transaction.h" #include "kernel-shared/extent_io.h" +#include "kernel-shared/file-item.h" #include "common/utils.h" #include "common/help.h" #include "common/extent-cache.h" @@ -1098,7 +1099,7 @@ static int delete_csum(struct btrfs_root *root, u64 bytenr, u64 bytes) return ret; } - ret = btrfs_del_csums(trans, bytenr, bytes); + ret = btrfs_del_csums(trans, root, bytenr, bytes); if (ret) error("error deleting csums %d", ret); btrfs_commit_transaction(trans, root); diff --git a/check/clear-cache.c b/check/clear-cache.c index 877c1c9a..49e2bc09 100644 --- a/check/clear-cache.c +++ b/check/clear-cache.c @@ -21,6 +21,7 @@ #include "kernel-shared/free-space-tree.h" #include "kernel-shared/volumes.h" #include "kernel-shared/transaction.h" +#include "kernel-shared/file-item.h" #include "common/internal.h" #include "common/messages.h" #include "check/common.h" @@ -465,6 +466,7 @@ int truncate_free_ino_items(struct btrfs_root *root) while (1) { struct extent_buffer *leaf; struct btrfs_file_extent_item *fi; + struct btrfs_root *csum_root; struct btrfs_key found_key; u8 found_type; @@ -523,7 +525,10 @@ int truncate_free_ino_items(struct btrfs_root *root) goto out; } - ret = btrfs_del_csums(trans, extent_disk_bytenr, + csum_root = btrfs_csum_root(trans->fs_info, + extent_disk_bytenr); + ret = btrfs_del_csums(trans, csum_root, + extent_disk_bytenr, extent_num_bytes); if (ret < 0) { btrfs_abort_transaction(trans, ret); diff --git a/check/main.c b/check/main.c index 8474bcd8..200e7ec6 100644 --- a/check/main.c +++ b/check/main.c @@ -42,6 +42,7 @@ #include "kernel-shared/free-space-tree.h" #include "kernel-shared/backref.h" #include "kernel-shared/ulist.h" +#include "kernel-shared/file-item.h" #include "common/defs.h" #include "common/extent-cache.h" #include "common/internal.h" diff --git a/check/mode-common.c b/check/mode-common.c index 412a9fd5..120165aa 100644 --- a/check/mode-common.c +++ b/check/mode-common.c @@ -28,6 +28,7 @@ #include "kernel-shared/volumes.h" #include "kernel-shared/backref.h" #include "kernel-shared/compression.h" +#include "kernel-shared/file-item.h" #include "common/internal.h" #include "common/messages.h" #include "common/utils.h" @@ -1311,7 +1312,7 @@ static int fill_csum_tree_from_one_fs_root(struct btrfs_trans_handle *trans, if (type == BTRFS_FILE_EXTENT_PREALLOC) { start += btrfs_file_extent_offset(node, fi); len = btrfs_file_extent_num_bytes(node, fi); - ret = btrfs_del_csums(trans, start, len); + ret = btrfs_del_csums(trans, csum_root, start, len); if (ret < 0) goto out; } @@ -1473,7 +1474,8 @@ static int remove_csum_for_file_extent(u64 ino, u64 offset, u64 rootid, void *ct btrfs_release_path(&path); /* Now delete the csum for the preallocated or nodatasum range */ - ret = btrfs_del_csums(trans, disk_bytenr, disk_len); + root = btrfs_csum_root(fs_info, disk_bytenr); + ret = btrfs_del_csums(trans, root, disk_bytenr, disk_len); out: btrfs_release_path(&path); return ret; diff --git a/check/mode-lowmem.c b/check/mode-lowmem.c index 18eac047..237e0fdb 100644 --- a/check/mode-lowmem.c +++ b/check/mode-lowmem.c @@ -30,6 +30,7 @@ #include "kernel-shared/backref.h" #include "kernel-shared/compression.h" #include "kernel-shared/volumes.h" +#include "kernel-shared/file-item.h" #include "common/messages.h" #include "common/internal.h" #include "common/utils.h" diff --git a/cmds/inspect-tree-stats.c b/cmds/inspect-tree-stats.c index ca48096a..31120df4 100644 --- a/cmds/inspect-tree-stats.c +++ b/cmds/inspect-tree-stats.c @@ -28,6 +28,7 @@ #include "kernel-shared/ctree.h" #include "kernel-shared/disk-io.h" #include "kernel-shared/extent_io.h" +#include "kernel-shared/file-item.h" #include "common/utils.h" #include "common/help.h" #include "common/messages.h" diff --git a/cmds/restore.c b/cmds/restore.c index da5bafd1..c38cb541 100644 --- a/cmds/restore.c +++ b/cmds/restore.c @@ -44,6 +44,7 @@ #include "kernel-shared/volumes.h" #include "kernel-shared/extent_io.h" #include "kernel-shared/compression.h" +#include "kernel-shared/file-item.h" #include "common/utils.h" #include "common/help.h" #include "common/open-utils.h" diff --git a/convert/main.c b/convert/main.c index 16520914..941b5ce3 100644 --- a/convert/main.c +++ b/convert/main.c @@ -99,6 +99,7 @@ #include "kernel-shared/disk-io.h" #include "kernel-shared/volumes.h" #include "kernel-shared/transaction.h" +#include "kernel-shared/file-item.h" #include "crypto/hash.h" #include "common/defs.h" #include "common/extent-cache.h" diff --git a/convert/source-ext2.c b/convert/source-ext2.c index 02f1d68b..cfffc9e2 100644 --- a/convert/source-ext2.c +++ b/convert/source-ext2.c @@ -27,6 +27,7 @@ #include #include "kernel-lib/sizes.h" #include "kernel-shared/transaction.h" +#include "kernel-shared/file-item.h" #include "common/extent-cache.h" #include "common/messages.h" #include "convert/common.h" diff --git a/convert/source-reiserfs.c b/convert/source-reiserfs.c index b38e866d..ceb50b6a 100644 --- a/convert/source-reiserfs.c +++ b/convert/source-reiserfs.c @@ -31,6 +31,7 @@ #include "kernel-shared/disk-io.h" #include "kernel-shared/transaction.h" #include "kernel-shared/extent_io.h" +#include "kernel-shared/file-item.h" #include "common/extent-cache.h" #include "common/internal.h" #include "common/messages.h" diff --git a/image/main.c b/image/main.c index f028be4e..2f66ac53 100644 --- a/image/main.c +++ b/image/main.c @@ -40,6 +40,7 @@ #include "kernel-shared/transaction.h" #include "kernel-shared/volumes.h" #include "kernel-shared/extent_io.h" +#include "kernel-shared/file-item.h" #include "crypto/crc32c.h" #include "crypto/hash.h" #include "common/internal.h" diff --git a/kernel-shared/ctree.h b/kernel-shared/ctree.h index 793b774a..b5e3932e 100644 --- a/kernel-shared/ctree.h +++ b/kernel-shared/ctree.h @@ -431,14 +431,6 @@ static inline u32 BTRFS_NODEPTRS_PER_EXTENT_BUFFER(const struct extent_buffer *e return BTRFS_LEAF_DATA_SIZE(eb->fs_info) / sizeof(struct btrfs_key_ptr); } -#define BTRFS_FILE_EXTENT_INLINE_DATA_START \ - (offsetof(struct btrfs_file_extent_item, disk_bytenr)) -static inline u32 BTRFS_MAX_INLINE_DATA_SIZE(const struct btrfs_fs_info *info) -{ - return BTRFS_MAX_ITEM_SIZE(info) - - BTRFS_FILE_EXTENT_INLINE_DATA_START; -} - static inline u32 BTRFS_MAX_XATTR_SIZE(const struct btrfs_fs_info *info) { return BTRFS_MAX_ITEM_SIZE(info) - sizeof(struct btrfs_dir_item); @@ -719,19 +711,6 @@ static inline u8 *btrfs_dev_extent_chunk_tree_uuid(struct btrfs_dev_extent *dev) return (u8 *)((unsigned long)dev + ptr); } -static inline unsigned long btrfs_file_extent_inline_start(struct - btrfs_file_extent_item *e) -{ - unsigned long offset = (unsigned long)e; - offset += offsetof(struct btrfs_file_extent_item, disk_bytenr); - return offset; -} - -static inline u32 btrfs_file_extent_calc_inline_size(u32 datasize) -{ - return offsetof(struct btrfs_file_extent_item, disk_bytenr) + datasize; -} - static inline u64 btrfs_dev_stats_value(const struct extent_buffer *eb, const struct btrfs_dev_stats_item *ptr, int index) @@ -745,17 +724,6 @@ static inline u64 btrfs_dev_stats_value(const struct extent_buffer *eb, return val; } -/* - * this returns the number of bytes used by the item on disk, minus the - * size of any extent headers. If a file is compressed on disk, this is - * the compressed size - */ -static inline u32 btrfs_file_extent_inline_item_len(struct extent_buffer *eb, - int nr) -{ - return btrfs_item_size(eb, nr) - BTRFS_FILE_EXTENT_INLINE_DATA_START; -} - /* struct btrfs_ioctl_search_header */ static inline u64 btrfs_search_header_transid(struct btrfs_ioctl_search_header *sh) { @@ -1091,19 +1059,6 @@ int btrfs_del_inode_ref(struct btrfs_trans_handle *trans, struct btrfs_root *root, const char *name, int name_len, u64 ino, u64 parent_ino, u64 *index); -/* file-item.c */ -int btrfs_del_csums(struct btrfs_trans_handle *trans, u64 bytenr, u64 len); -int btrfs_insert_file_extent(struct btrfs_trans_handle *trans, - struct btrfs_root *root, - u64 objectid, u64 pos, u64 offset, - u64 disk_num_bytes, - u64 num_bytes); -int btrfs_insert_inline_extent(struct btrfs_trans_handle *trans, - struct btrfs_root *root, u64 objectid, - u64 offset, const char *buffer, size_t size); -int btrfs_csum_file_block(struct btrfs_trans_handle *trans, u64 alloc_end, - u64 bytenr, char *data, size_t len); - /* uuid-tree.c, interface for mounted mounted filesystem */ int btrfs_lookup_uuid_subvol_item(int fd, const u8 *uuid, u64 *subvol_id); int btrfs_lookup_uuid_received_subvol_item(int fd, const u8 *uuid, diff --git a/kernel-shared/extent-tree.c b/kernel-shared/extent-tree.c index c134ce59..ea0a19fe 100644 --- a/kernel-shared/extent-tree.c +++ b/kernel-shared/extent-tree.c @@ -27,11 +27,12 @@ #include "kernel-shared/disk-io.h" #include "kernel-shared/print-tree.h" #include "kernel-shared/transaction.h" -#include "crypto/crc32c.h" #include "kernel-shared/volumes.h" #include "kernel-shared/free-space-cache.h" #include "kernel-shared/free-space-tree.h" #include "kernel-shared/zoned.h" +#include "kernel-shared/file-item.h" +#include "crypto/crc32c.h" #include "common/utils.h" #define PENDING_EXTENT_INSERT 0 @@ -2115,7 +2116,11 @@ static int __free_extent(struct btrfs_trans_handle *trans, btrfs_release_path(path); if (is_data) { - ret = btrfs_del_csums(trans, bytenr, num_bytes); + struct btrfs_root *csum_root; + + csum_root = btrfs_csum_root(trans->fs_info, bytenr); + ret = btrfs_del_csums(trans, csum_root, bytenr, + num_bytes); BUG_ON(ret); } diff --git a/kernel-shared/file-item.c b/kernel-shared/file-item.c index 0a870495..b372cc5e 100644 --- a/kernel-shared/file-item.c +++ b/kernel-shared/file-item.c @@ -23,6 +23,7 @@ #include "kernel-shared/disk-io.h" #include "kernel-shared/transaction.h" #include "kernel-shared/print-tree.h" +#include "kernel-shared/file-item.h" #include "crypto/crc32c.h" #include "common/internal.h" @@ -400,7 +401,8 @@ static noinline int truncate_one_csum(struct btrfs_root *root, * deletes the csum items from the csum tree for a given * range of bytes. */ -int btrfs_del_csums(struct btrfs_trans_handle *trans, u64 bytenr, u64 len) +int btrfs_del_csums(struct btrfs_trans_handle *trans, struct btrfs_root *root, + u64 bytenr, u64 len) { struct btrfs_path *path; struct btrfs_key key; @@ -410,7 +412,6 @@ int btrfs_del_csums(struct btrfs_trans_handle *trans, u64 bytenr, u64 len) int ret; u16 csum_size = trans->fs_info->csum_size; int blocksize = trans->fs_info->sectorsize; - struct btrfs_root *csum_root = btrfs_csum_root(trans->fs_info, bytenr); path = btrfs_alloc_path(); if (!path) @@ -421,7 +422,7 @@ int btrfs_del_csums(struct btrfs_trans_handle *trans, u64 bytenr, u64 len) key.offset = end_byte - 1; key.type = BTRFS_EXTENT_CSUM_KEY; - ret = btrfs_search_slot(trans, csum_root, &key, path, -1, 1); + ret = btrfs_search_slot(trans, root, &key, path, -1, 1); if (ret > 0) { if (path->slots[0] == 0) goto out; @@ -448,7 +449,7 @@ int btrfs_del_csums(struct btrfs_trans_handle *trans, u64 bytenr, u64 len) /* delete the entire item, it is inside our range */ if (key.offset >= bytenr && csum_end <= end_byte) { - ret = btrfs_del_item(trans, csum_root, path); + ret = btrfs_del_item(trans, root, path); BUG_ON(ret); } else if (key.offset < bytenr && csum_end > end_byte) { unsigned long offset; @@ -488,13 +489,13 @@ int btrfs_del_csums(struct btrfs_trans_handle *trans, u64 bytenr, u64 len) * btrfs_split_item returns -EAGAIN when the * item changed size or key */ - ret = btrfs_split_item(trans, csum_root, path, &key, + ret = btrfs_split_item(trans, root, path, &key, offset); BUG_ON(ret && ret != -EAGAIN); key.offset = end_byte - 1; } else { - ret = truncate_one_csum(csum_root, path, &key, bytenr, + ret = truncate_one_csum(root, path, &key, bytenr, len); BUG_ON(ret); } diff --git a/kernel-shared/file-item.h b/kernel-shared/file-item.h new file mode 100644 index 00000000..25dfecca --- /dev/null +++ b/kernel-shared/file-item.h @@ -0,0 +1,89 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifndef BTRFS_FILE_ITEM_H +#define BTRFS_FILE_ITEM_H + +#include "kerncompat.h" +#include "kernel-shared/accessors.h" + +struct bio; +struct inode; +struct btrfs_ordered_sum; +struct btrfs_inode; +struct extent_map; + +#define BTRFS_FILE_EXTENT_INLINE_DATA_START \ + (offsetof(struct btrfs_file_extent_item, disk_bytenr)) + +static inline u32 BTRFS_MAX_INLINE_DATA_SIZE(const struct btrfs_fs_info *info) +{ + return BTRFS_MAX_ITEM_SIZE(info) - + BTRFS_FILE_EXTENT_INLINE_DATA_START; +} + +/* + * Returns the number of bytes used by the item on disk, minus the size of any + * extent headers. If a file is compressed on disk, this is the compressed + * size. + */ +static inline u32 btrfs_file_extent_inline_item_len( + const struct extent_buffer *eb, + int nr) +{ + return btrfs_item_size(eb, nr) - BTRFS_FILE_EXTENT_INLINE_DATA_START; +} + +static inline unsigned long btrfs_file_extent_inline_start( + const struct btrfs_file_extent_item *e) +{ + return (unsigned long)e + BTRFS_FILE_EXTENT_INLINE_DATA_START; +} + +static inline u32 btrfs_file_extent_calc_inline_size(u32 datasize) +{ + return BTRFS_FILE_EXTENT_INLINE_DATA_START + datasize; +} + +int btrfs_del_csums(struct btrfs_trans_handle *trans, + struct btrfs_root *root, u64 bytenr, u64 len); +blk_status_t btrfs_lookup_bio_sums(struct inode *inode, struct bio *bio, u8 *dst); +int btrfs_insert_hole_extent(struct btrfs_trans_handle *trans, + struct btrfs_root *root, u64 objectid, u64 pos, + u64 num_bytes); +int btrfs_lookup_file_extent(struct btrfs_trans_handle *trans, + struct btrfs_root *root, + struct btrfs_path *path, u64 objectid, + u64 bytenr, int mod); +int btrfs_csum_file_blocks(struct btrfs_trans_handle *trans, + struct btrfs_root *root, + struct btrfs_ordered_sum *sums); +blk_status_t btrfs_csum_one_bio(struct btrfs_inode *inode, struct bio *bio, + u64 offset, bool one_ordered); +int btrfs_lookup_csums_range(struct btrfs_root *root, u64 start, u64 end, + struct list_head *list, int search_commit, + bool nowait); +void btrfs_extent_item_to_extent_map(struct btrfs_inode *inode, + const struct btrfs_path *path, + struct btrfs_file_extent_item *fi, + struct extent_map *em); +int btrfs_inode_clear_file_extent_range(struct btrfs_inode *inode, u64 start, + u64 len); +int btrfs_inode_set_file_extent_range(struct btrfs_inode *inode, u64 start, u64 len); +void btrfs_inode_safe_disk_i_size_write(struct btrfs_inode *inode, u64 new_i_size); +u64 btrfs_file_extent_end(const struct btrfs_path *path); + +/* + * MODIFIED: + * - This function doesn't exist in the kernel. + */ +int btrfs_insert_file_extent(struct btrfs_trans_handle *trans, + struct btrfs_root *root, + u64 objectid, u64 pos, u64 offset, + u64 disk_num_bytes, u64 num_bytes); +int btrfs_csum_file_block(struct btrfs_trans_handle *trans, + u64 alloc_end, u64 bytenr, char *data, size_t len); +int btrfs_insert_inline_extent(struct btrfs_trans_handle *trans, + struct btrfs_root *root, u64 objectid, + u64 offset, const char *buffer, size_t size); + +#endif diff --git a/kernel-shared/file.c b/kernel-shared/file.c index 1e5a9e98..100ea31c 100644 --- a/kernel-shared/file.c +++ b/kernel-shared/file.c @@ -22,6 +22,7 @@ #include "kernel-shared/disk-io.h" #include "kernel-shared/transaction.h" #include "kernel-shared/compression.h" +#include "kernel-shared/file-item.h" #include "common/utils.h" /* diff --git a/kernel-shared/print-tree.c b/kernel-shared/print-tree.c index 60e49c9b..87b0a774 100644 --- a/kernel-shared/print-tree.c +++ b/kernel-shared/print-tree.c @@ -27,6 +27,7 @@ #include "kernel-shared/volumes.h" #include "kernel-shared/compression.h" #include "kernel-shared/accessors.h" +#include "kernel-shared/file-item.h" #include "common/utils.h" static void print_dir_item_type(struct extent_buffer *eb, diff --git a/mkfs/rootdir.c b/mkfs/rootdir.c index 1ddc1138..aa2577ad 100644 --- a/mkfs/rootdir.c +++ b/mkfs/rootdir.c @@ -35,6 +35,7 @@ #include "kernel-shared/volumes.h" #include "kernel-shared/disk-io.h" #include "kernel-shared/transaction.h" +#include "kernel-shared/file-item.h" #include "common/internal.h" #include "common/messages.h" #include "common/path-utils.h"