From: Qu Wenruo <wqu@suse.com> To: linux-btrfs@vger.kernel.org, u-boot@lists.denx.de Cc: marek.behun@nic.cz Subject: [PATCH U-BOOT v2 24/30] fs: btrfs: Introduce lookup_data_extent() for later use Date: Mon, 25 May 2020 14:32:51 +0800 [thread overview] Message-ID: <20200525063257.46757-25-wqu@suse.com> (raw) In-Reply-To: <20200525063257.46757-1-wqu@suse.com> Signed-off-by: Qu Wenruo <wqu@suse.com> --- fs/btrfs/inode.c | 101 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 36f6b90b058f..9a1b1d265bdd 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -819,3 +819,104 @@ out: free(dbuf); return ret; } + +/* + * Get the first file extent that covers bytenr @file_offset. + * + * @file_offset must be aligned to sectorsize. + * + * return 0 for found, and path points to the file extent. + * return >0 for not found, and fill @next_offset. + * @next_offset can be 0 if there is no next file extent. + * return <0 for error. + */ +static int lookup_data_extent(struct btrfs_root *root, struct btrfs_path *path, + u64 ino, u64 file_offset, u64 *next_offset) +{ + struct btrfs_key key; + struct btrfs_file_extent_item *fi; + u8 extent_type; + int ret = 0; + + ASSERT(IS_ALIGNED(file_offset, root->fs_info->sectorsize)); + key.objectid = ino; + key.type = BTRFS_EXTENT_DATA_KEY; + key.offset = file_offset; + + ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); + /* Error or we're already at the file extent */ + if (ret <= 0) + return ret; + if (ret > 0) { + /* Check previous file extent */ + ret = btrfs_previous_item(root, path, ino, + BTRFS_EXTENT_DATA_KEY); + if (ret < 0) + return ret; + if (ret > 0) + goto check_next; + } + /* Now the key.offset must be smaller than @file_offset */ + btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]); + if (key.objectid != ino || + key.type != BTRFS_EXTENT_DATA_KEY) + goto check_next; + + fi = btrfs_item_ptr(path->nodes[0], path->slots[0], + struct btrfs_file_extent_item); + extent_type = btrfs_file_extent_type(path->nodes[0], fi); + if (extent_type == BTRFS_FILE_EXTENT_INLINE) { + if (file_offset == 0) + return 0; + /* Inline extent should be the only extent, no next extent. */ + *next_offset = 0; + return 1; + } + + /* This file extent covers @file_offset */ + if (key.offset <= file_offset && key.offset + + btrfs_file_extent_num_bytes(path->nodes[0], fi) > file_offset) + return 0; +check_next: + ret = btrfs_next_item(root, path); + if (ret < 0) + return ret; + if (ret > 0) { + *next_offset = 0; + return 1; + } + + btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]); + fi = btrfs_item_ptr(path->nodes[0], path->slots[0], + struct btrfs_file_extent_item); + /* Next next data extent */ + if (key.objectid != ino || + key.type != BTRFS_EXTENT_DATA_KEY) { + *next_offset = 0; + return 1; + } + /* Current file extent already beyond @file_offset */ + if (key.offset > file_offset) { + *next_offset = key.offset; + return 1; + } + /* This file extent covers @file_offset */ + if (key.offset <= file_offset && key.offset + + btrfs_file_extent_num_bytes(path->nodes[0], fi) > file_offset) + return 0; + /* This file extent ends before @file_offset, check next */ + ret = btrfs_next_item(root, path); + if (ret < 0) + return ret; + if (ret > 0) { + *next_offset = 0; + return 1; + } + btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]); + if (key.type != BTRFS_EXTENT_DATA_KEY || key.objectid != ino) { + *next_offset = 0; + return 1; + } + *next_offset = key.offset; + return 1; +} -- 2.26.2
WARNING: multiple messages have this Message-ID (diff)
From: Qu Wenruo <wqu@suse.com> To: u-boot@lists.denx.de Subject: [PATCH U-BOOT v2 24/30] fs: btrfs: Introduce lookup_data_extent() for later use Date: Mon, 25 May 2020 14:32:51 +0800 [thread overview] Message-ID: <20200525063257.46757-25-wqu@suse.com> (raw) In-Reply-To: <20200525063257.46757-1-wqu@suse.com> Signed-off-by: Qu Wenruo <wqu@suse.com> --- fs/btrfs/inode.c | 101 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 36f6b90b058f..9a1b1d265bdd 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -819,3 +819,104 @@ out: free(dbuf); return ret; } + +/* + * Get the first file extent that covers bytenr @file_offset. + * + * @file_offset must be aligned to sectorsize. + * + * return 0 for found, and path points to the file extent. + * return >0 for not found, and fill @next_offset. + * @next_offset can be 0 if there is no next file extent. + * return <0 for error. + */ +static int lookup_data_extent(struct btrfs_root *root, struct btrfs_path *path, + u64 ino, u64 file_offset, u64 *next_offset) +{ + struct btrfs_key key; + struct btrfs_file_extent_item *fi; + u8 extent_type; + int ret = 0; + + ASSERT(IS_ALIGNED(file_offset, root->fs_info->sectorsize)); + key.objectid = ino; + key.type = BTRFS_EXTENT_DATA_KEY; + key.offset = file_offset; + + ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); + /* Error or we're already at the file extent */ + if (ret <= 0) + return ret; + if (ret > 0) { + /* Check previous file extent */ + ret = btrfs_previous_item(root, path, ino, + BTRFS_EXTENT_DATA_KEY); + if (ret < 0) + return ret; + if (ret > 0) + goto check_next; + } + /* Now the key.offset must be smaller than @file_offset */ + btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]); + if (key.objectid != ino || + key.type != BTRFS_EXTENT_DATA_KEY) + goto check_next; + + fi = btrfs_item_ptr(path->nodes[0], path->slots[0], + struct btrfs_file_extent_item); + extent_type = btrfs_file_extent_type(path->nodes[0], fi); + if (extent_type == BTRFS_FILE_EXTENT_INLINE) { + if (file_offset == 0) + return 0; + /* Inline extent should be the only extent, no next extent. */ + *next_offset = 0; + return 1; + } + + /* This file extent covers @file_offset */ + if (key.offset <= file_offset && key.offset + + btrfs_file_extent_num_bytes(path->nodes[0], fi) > file_offset) + return 0; +check_next: + ret = btrfs_next_item(root, path); + if (ret < 0) + return ret; + if (ret > 0) { + *next_offset = 0; + return 1; + } + + btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]); + fi = btrfs_item_ptr(path->nodes[0], path->slots[0], + struct btrfs_file_extent_item); + /* Next next data extent */ + if (key.objectid != ino || + key.type != BTRFS_EXTENT_DATA_KEY) { + *next_offset = 0; + return 1; + } + /* Current file extent already beyond @file_offset */ + if (key.offset > file_offset) { + *next_offset = key.offset; + return 1; + } + /* This file extent covers @file_offset */ + if (key.offset <= file_offset && key.offset + + btrfs_file_extent_num_bytes(path->nodes[0], fi) > file_offset) + return 0; + /* This file extent ends before @file_offset, check next */ + ret = btrfs_next_item(root, path); + if (ret < 0) + return ret; + if (ret > 0) { + *next_offset = 0; + return 1; + } + btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]); + if (key.type != BTRFS_EXTENT_DATA_KEY || key.objectid != ino) { + *next_offset = 0; + return 1; + } + *next_offset = key.offset; + return 1; +} -- 2.26.2
next prev parent reply other threads:[~2020-05-25 6:34 UTC|newest] Thread overview: 66+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-05-25 6:32 [PATCH U-BOOT v2 00/30] fs: btrfs: Re-implement btrfs support using the more widely used extent buffer base code Qu Wenruo 2020-05-25 6:32 ` Qu Wenruo 2020-05-25 6:32 ` [PATCH U-BOOT v2 01/30] fs: btrfs: Sync btrfs_btree.h from kernel Qu Wenruo 2020-05-25 6:32 ` Qu Wenruo 2020-05-25 6:32 ` [PATCH U-BOOT v2 02/30] fs: btrfs: Add More checksum algorithm support to btrfs Qu Wenruo 2020-05-25 6:32 ` Qu Wenruo 2020-05-25 6:32 ` [PATCH U-BOOT v2 03/30] fs: btrfs: Cross-port btrfs_read_dev_super() from btrfs-progs Qu Wenruo 2020-05-25 6:32 ` Qu Wenruo 2020-05-25 6:32 ` [PATCH U-BOOT v2 04/30] fs: btrfs: Cross-port rbtree-utils " Qu Wenruo 2020-05-25 6:32 ` Qu Wenruo 2020-05-25 6:32 ` [PATCH U-BOOT v2 05/30] fs: btrfs: Cross-port extent-cache.[ch] " Qu Wenruo 2020-05-25 6:32 ` Qu Wenruo 2020-05-25 6:32 ` [PATCH U-BOOT v2 06/30] fs: btrfs: Cross-port extent-io.[ch] " Qu Wenruo 2020-05-25 6:32 ` Qu Wenruo 2020-05-25 6:32 ` [PATCH U-BOOT v2 07/30] fs: btrfs: Cross port structure accessor into ctree.h Qu Wenruo 2020-05-25 6:32 ` Qu Wenruo 2020-05-25 6:32 ` [PATCH U-BOOT v2 08/30] fs: btrfs: Cross port volumes.[ch] from btrfs-progs Qu Wenruo 2020-05-25 6:32 ` Qu Wenruo 2020-05-25 6:32 ` [PATCH U-BOOT v2 09/30] fs: btrfs: Crossport read_tree_block() " Qu Wenruo 2020-05-25 6:32 ` Qu Wenruo 2020-05-25 6:32 ` [PATCH U-BOOT v2 10/30] fs: btrfs: Rename struct btrfs_path to struct __btrfs_path Qu Wenruo 2020-05-25 6:32 ` Qu Wenruo 2020-05-25 6:32 ` [PATCH U-BOOT v2 11/30] fs: btrfs: Rename btrfs_root to __btrfs_root Qu Wenruo 2020-05-25 6:32 ` Qu Wenruo 2020-05-25 6:32 ` [PATCH U-BOOT v2 12/30] fs: btrfs: Cross port struct btrfs_root to ctree.h Qu Wenruo 2020-05-25 6:32 ` Qu Wenruo 2020-05-25 6:32 ` [PATCH U-BOOT v2 13/30] fs: btrfs: Crossport btrfs_search_slot() from btrfs-progs Qu Wenruo 2020-05-25 6:32 ` Qu Wenruo 2020-05-25 6:32 ` [PATCH U-BOOT v2 14/30] fs: btrfs: Crossport btrfs_read_sys_array() and btrfs_read_chunk_tree() Qu Wenruo 2020-05-25 6:32 ` Qu Wenruo 2020-05-25 6:32 ` [PATCH U-BOOT v2 15/30] fs: btrfs: Crossport open_ctree_fs_info() Qu Wenruo 2020-05-25 6:32 ` Qu Wenruo 2020-05-25 6:32 ` [PATCH U-BOOT v2 16/30] fs: btrfs: Rename path resolve related functions to avoid name conflicts Qu Wenruo 2020-05-25 6:32 ` Qu Wenruo 2020-05-25 6:32 ` [PATCH U-BOOT v2 17/30] fs: btrfs: Use btrfs_readlink() to implement __btrfs_readlink() Qu Wenruo 2020-05-25 6:32 ` Qu Wenruo 2020-05-25 6:32 ` [PATCH U-BOOT v2 18/30] fs: btrfs: inode: Allow next_length() to return value > BTRFS_NAME_LEN Qu Wenruo 2020-05-25 6:32 ` Qu Wenruo 2020-05-25 6:32 ` [PATCH U-BOOT v2 19/30] fs: btrfs: Implement btrfs_lookup_path() Qu Wenruo 2020-05-25 6:32 ` Qu Wenruo 2020-05-25 6:32 ` [PATCH U-BOOT v2 20/30] fs: btrfs: Use btrfs_iter_dir() to replace btrfs_readdir() Qu Wenruo 2020-05-25 6:32 ` Qu Wenruo 2020-05-25 6:32 ` [PATCH U-BOOT v2 21/30] fs: btrfs: Use btrfs_lookup_path() to implement btrfs_exists() and btrfs_size() Qu Wenruo 2020-05-25 6:32 ` Qu Wenruo 2020-05-25 6:32 ` [PATCH U-BOOT v2 22/30] fs: btrfs: Rename btrfs_file_read() and its callees to avoid name conflicts Qu Wenruo 2020-05-25 6:32 ` Qu Wenruo 2020-05-25 6:32 ` [PATCH U-BOOT v2 23/30] fs: btrfs: Introduce btrfs_read_extent_inline() and btrfs_read_extent_reg() Qu Wenruo 2020-05-25 6:32 ` Qu Wenruo 2020-05-25 6:32 ` Qu Wenruo [this message] 2020-05-25 6:32 ` [PATCH U-BOOT v2 24/30] fs: btrfs: Introduce lookup_data_extent() for later use Qu Wenruo 2020-05-25 6:32 ` [PATCH U-BOOT v2 25/30] fs: btrfs: Implement btrfs_file_read() Qu Wenruo 2020-05-25 6:32 ` Qu Wenruo 2020-05-25 6:32 ` [PATCH U-BOOT v2 26/30] fs: btrfs: Introduce function to reolve path in one subvolume Qu Wenruo 2020-05-25 6:32 ` Qu Wenruo 2020-05-25 6:32 ` [PATCH U-BOOT v2 27/30] fs: btrfs: Introduce function to resolve the path of " Qu Wenruo 2020-05-25 6:32 ` Qu Wenruo 2020-05-25 6:32 ` [PATCH U-BOOT v2 28/30] fs: btrfs: Imeplement btrfs_list_subvols() using new infrastructure Qu Wenruo 2020-05-25 6:32 ` Qu Wenruo 2020-05-25 6:32 ` [PATCH U-BOOT v2 29/30] fs: btrfs: Cleanup the old implementation Qu Wenruo 2020-05-25 6:32 ` Qu Wenruo 2020-05-25 6:32 ` [PATCH U-BOOT v2 30/30] MAINTAINERS: Add btrfs mail list Qu Wenruo 2020-05-25 6:32 ` Qu Wenruo 2020-06-23 0:50 ` [PATCH U-BOOT v2 00/30] fs: btrfs: Re-implement btrfs support using the more widely used extent buffer base code Qu Wenruo 2020-06-23 0:50 ` Qu Wenruo 2020-06-23 15:05 ` Marek Behún 2020-06-23 15:05 ` Marek Behún
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20200525063257.46757-25-wqu@suse.com \ --to=wqu@suse.com \ --cc=linux-btrfs@vger.kernel.org \ --cc=marek.behun@nic.cz \ --cc=u-boot@lists.denx.de \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.