@@ -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);
@@ -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"
@@ -462,6 +463,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;
@@ -520,7 +522,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);
@@ -41,6 +41,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"
@@ -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;
@@ -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"
@@ -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"
@@ -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"
@@ -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"
@@ -27,6 +27,7 @@
#include <string.h>
#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"
@@ -39,6 +39,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"
@@ -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,
@@ -33,6 +33,7 @@
#include "kernel-shared/free-space-tree.h"
#include "kernel-shared/zoned.h"
#include "common/utils.h"
+#include "file-item.h"
#define PENDING_EXTENT_INSERT 0
#define PENDING_EXTENT_DELETE 1
@@ -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);
}
@@ -25,6 +25,7 @@
#include "kernel-shared/print-tree.h"
#include "crypto/crc32c.h"
#include "common/internal.h"
+#include "file-item.h"
#define MAX_CSUM_ITEMS(r, size) ((((BTRFS_LEAF_DATA_SIZE(r->fs_info) - \
sizeof(struct btrfs_item) * 2) / \
@@ -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);
}
new file mode 100644
@@ -0,0 +1,89 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#ifndef BTRFS_FILE_ITEM_H
+#define BTRFS_FILE_ITEM_H
+
+#include "kerncompat.h"
+#include "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
@@ -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"
/*
@@ -28,6 +28,7 @@
#include "kernel-shared/compression.h"
#include "common/utils.h"
#include "accessors.h"
+#include "file-item.h"
static void print_dir_item_type(struct extent_buffer *eb,
struct btrfs_dir_item *di)
@@ -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"
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 <josef@toxicpanda.com> --- 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 + image/main.c | 1 + kernel-shared/ctree.h | 45 ------------------- kernel-shared/extent-tree.c | 7 ++- 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 + 17 files changed, 124 insertions(+), 56 deletions(-) create mode 100644 kernel-shared/file-item.h