All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Marek Behún" <marek.behun@nic.cz>
To: u-boot@lists.denx.de
Cc: "Alberto Sánchez Molero" <alsamolero@gmail.com>,
	"Marek Vasut" <marex@denx.de>,
	"Pierre Bourdon" <delroth@gmail.com>,
	"Simon Glass" <sjg@chromium.org>, "Tom Rini" <trini@konsulko.com>,
	"Yevgeny Popovych" <yevgenyp@pointgrab.com>,
	linux-btrfs@vger.kernel.org, "Qu Wenruo" <wqu@suse.com>,
	"Marek Behún" <marek.behun@nic.cz>
Subject: [PATCH U-BOOT v3 17/30] fs: btrfs: Use btrfs_readlink() to implement __btrfs_readlink()
Date: Wed, 24 Jun 2020 18:03:03 +0200	[thread overview]
Message-ID: <20200624160316.5001-18-marek.behun@nic.cz> (raw)
In-Reply-To: <20200624160316.5001-1-marek.behun@nic.cz>

From: Qu Wenruo <wqu@suse.com>

The existing __btrfs_readlink() can be easily re-implemented using the
extent buffer based btrfs_readlink().

This is the first step to re-implement U-Boot's btrfs code.

Signed-off-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: Marek Behún <marek.behun@nic.cz>
---
 fs/btrfs/btrfs.h |   1 +
 fs/btrfs/inode.c | 101 ++++++++++++++++++++++++++++++-----------------
 2 files changed, 65 insertions(+), 37 deletions(-)

diff --git a/fs/btrfs/btrfs.h b/fs/btrfs/btrfs.h
index e8197391a2..53d53f310b 100644
--- a/fs/btrfs/btrfs.h
+++ b/fs/btrfs/btrfs.h
@@ -60,6 +60,7 @@ u64 __btrfs_lookup_inode_ref(struct __btrfs_root *, u64, struct btrfs_inode_ref
 int __btrfs_lookup_inode(const struct __btrfs_root *, struct btrfs_key *,
 		        struct btrfs_inode_item *, struct __btrfs_root *);
 int __btrfs_readlink(const struct __btrfs_root *, u64, char *);
+int btrfs_readlink(struct btrfs_root *root, u64 ino, char *target);
 u64 __btrfs_lookup_path(struct __btrfs_root *, u64, const char *, u8 *,
 		       struct btrfs_inode_item *, int);
 u64 btrfs_file_read(const struct __btrfs_root *, u64, u64, u64, char *);
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index eb34f546b5..007cf32c16 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -5,8 +5,9 @@
  * 2017 Marek Behun, CZ.NIC, marek.behun@nic.cz
  */
 
-#include "btrfs.h"
 #include <malloc.h>
+#include "btrfs.h"
+#include "disk-io.h"
 
 u64 __btrfs_lookup_inode_ref(struct __btrfs_root *root, u64 inr,
 			   struct btrfs_inode_ref *refp, char *name)
@@ -83,56 +84,82 @@ out:
 	return res;
 }
 
-int __btrfs_readlink(const struct __btrfs_root *root, u64 inr, char *target)
+/*
+ * Read the content of symlink inode @ino of @root, into @target.
+ * NOTE: @target will not be \0 termiated, caller should handle it properly.
+ *
+ * Return the number of read data.
+ * Return <0 for error.
+ */
+int btrfs_readlink(struct btrfs_root *root, u64 ino, char *target)
 {
-	struct __btrfs_path path;
+	struct btrfs_path path;
 	struct btrfs_key key;
-	struct btrfs_file_extent_item *extent;
-	const char *data_ptr;
-	int res = -1;
+	struct btrfs_file_extent_item *fi;
+	int ret;
 
-	key.objectid = inr;
+	key.objectid = ino;
 	key.type = BTRFS_EXTENT_DATA_KEY;
 	key.offset = 0;
+	btrfs_init_path(&path);
 
-	if (btrfs_search_tree(root, &key, &path))
-		return -1;
-
-	if (__btrfs_comp_keys(&key, btrfs_path_leaf_key(&path)))
-		goto out;
-
-	extent = btrfs_path_item_ptr(&path, struct btrfs_file_extent_item);
-	if (extent->type != BTRFS_FILE_EXTENT_INLINE) {
-		printf("%s: Extent for symlink %llu not of INLINE type\n",
-		       __func__, inr);
+	ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
+	if (ret < 0)
+		return ret;
+	if (ret > 0) {
+		ret = -ENOENT;
 		goto out;
 	}
-
-	btrfs_file_extent_item_to_cpu_inl(extent);
-
-	if (extent->compression != BTRFS_COMPRESS_NONE) {
-		printf("%s: Symlink %llu extent data compressed!\n", __func__,
-		       inr);
+	fi = btrfs_item_ptr(path.nodes[0], path.slots[0],
+			    struct btrfs_file_extent_item);
+	if (btrfs_file_extent_type(path.nodes[0], fi) !=
+	    BTRFS_FILE_EXTENT_INLINE) {
+		ret = -EUCLEAN;
+		error("Extent for symlink %llu must be INLINE type!", ino);
 		goto out;
-	} else if (extent->encryption != 0) {
-		printf("%s: Symlink %llu extent data encrypted!\n", __func__,
-		       inr);
+	}
+	if (btrfs_file_extent_compression(path.nodes[0], fi) !=
+	    BTRFS_COMPRESS_NONE) {
+		ret = -EUCLEAN;
+		error("Extent for symlink %llu must not be compressed!", ino);
 		goto out;
-	} else if (extent->ram_bytes >= btrfs_info.sb.sectorsize) {
-		printf("%s: Symlink %llu extent data too long (%llu)!\n",
-		       __func__, inr, extent->ram_bytes);
+	}
+	if (btrfs_file_extent_ram_bytes(path.nodes[0], fi) >=
+	    root->fs_info->sectorsize) {
+		ret = -EUCLEAN;
+		error("Symlink %llu extent data too large (%llu)!\n",
+			ino, btrfs_file_extent_ram_bytes(path.nodes[0], fi));
 		goto out;
 	}
+	read_extent_buffer(path.nodes[0], target,
+			btrfs_file_extent_inline_start(fi),
+			btrfs_file_extent_ram_bytes(path.nodes[0], fi));
+	ret = btrfs_file_extent_ram_bytes(path.nodes[0], fi);
+out:
+	btrfs_release_path(&path);
+	return ret;
+}
 
-	data_ptr = (const char *) extent
-		   + offsetof(struct btrfs_file_extent_item, disk_bytenr);
+int __btrfs_readlink(const struct __btrfs_root *root, u64 inr, char *target)
+{
+	struct btrfs_root *subvolume;
+	struct btrfs_fs_info *fs_info = current_fs_info;
+	struct btrfs_key key;
+	int ret;
+
+	ASSERT(fs_info);
+	key.objectid = root->objectid;
+	key.type = BTRFS_ROOT_ITEM_KEY;
+	key.offset = (u64)-1;
+	subvolume = btrfs_read_fs_root(fs_info, &key);
+	if (IS_ERR(subvolume))
+		return -1;
 
-	memcpy(target, data_ptr, extent->ram_bytes);
-	target[extent->ram_bytes] = '\0';
-	res = 0;
-out:
-	__btrfs_free_path(&path);
-	return res;
+	ret = btrfs_readlink(subvolume, inr, target);
+	if (ret < 0)
+		return -1;
+	target[ret] = '\0';
+	return 0;
 }
 
 /* inr must be a directory (for regular files with multiple hard links this
-- 
2.26.2


WARNING: multiple messages have this Message-ID (diff)
From: "Marek Behún" <marek.behun@nic.cz>
To: u-boot@lists.denx.de
Subject: [PATCH U-BOOT v3 17/30] fs: btrfs: Use btrfs_readlink() to implement __btrfs_readlink()
Date: Wed, 24 Jun 2020 18:03:03 +0200	[thread overview]
Message-ID: <20200624160316.5001-18-marek.behun@nic.cz> (raw)
In-Reply-To: <20200624160316.5001-1-marek.behun@nic.cz>

From: Qu Wenruo <wqu@suse.com>

The existing __btrfs_readlink() can be easily re-implemented using the
extent buffer based btrfs_readlink().

This is the first step to re-implement U-Boot's btrfs code.

Signed-off-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: Marek Beh?n <marek.behun@nic.cz>
---
 fs/btrfs/btrfs.h |   1 +
 fs/btrfs/inode.c | 101 ++++++++++++++++++++++++++++++-----------------
 2 files changed, 65 insertions(+), 37 deletions(-)

diff --git a/fs/btrfs/btrfs.h b/fs/btrfs/btrfs.h
index e8197391a2..53d53f310b 100644
--- a/fs/btrfs/btrfs.h
+++ b/fs/btrfs/btrfs.h
@@ -60,6 +60,7 @@ u64 __btrfs_lookup_inode_ref(struct __btrfs_root *, u64, struct btrfs_inode_ref
 int __btrfs_lookup_inode(const struct __btrfs_root *, struct btrfs_key *,
 		        struct btrfs_inode_item *, struct __btrfs_root *);
 int __btrfs_readlink(const struct __btrfs_root *, u64, char *);
+int btrfs_readlink(struct btrfs_root *root, u64 ino, char *target);
 u64 __btrfs_lookup_path(struct __btrfs_root *, u64, const char *, u8 *,
 		       struct btrfs_inode_item *, int);
 u64 btrfs_file_read(const struct __btrfs_root *, u64, u64, u64, char *);
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index eb34f546b5..007cf32c16 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -5,8 +5,9 @@
  * 2017 Marek Behun, CZ.NIC, marek.behun at nic.cz
  */
 
-#include "btrfs.h"
 #include <malloc.h>
+#include "btrfs.h"
+#include "disk-io.h"
 
 u64 __btrfs_lookup_inode_ref(struct __btrfs_root *root, u64 inr,
 			   struct btrfs_inode_ref *refp, char *name)
@@ -83,56 +84,82 @@ out:
 	return res;
 }
 
-int __btrfs_readlink(const struct __btrfs_root *root, u64 inr, char *target)
+/*
+ * Read the content of symlink inode @ino of @root, into @target.
+ * NOTE: @target will not be \0 termiated, caller should handle it properly.
+ *
+ * Return the number of read data.
+ * Return <0 for error.
+ */
+int btrfs_readlink(struct btrfs_root *root, u64 ino, char *target)
 {
-	struct __btrfs_path path;
+	struct btrfs_path path;
 	struct btrfs_key key;
-	struct btrfs_file_extent_item *extent;
-	const char *data_ptr;
-	int res = -1;
+	struct btrfs_file_extent_item *fi;
+	int ret;
 
-	key.objectid = inr;
+	key.objectid = ino;
 	key.type = BTRFS_EXTENT_DATA_KEY;
 	key.offset = 0;
+	btrfs_init_path(&path);
 
-	if (btrfs_search_tree(root, &key, &path))
-		return -1;
-
-	if (__btrfs_comp_keys(&key, btrfs_path_leaf_key(&path)))
-		goto out;
-
-	extent = btrfs_path_item_ptr(&path, struct btrfs_file_extent_item);
-	if (extent->type != BTRFS_FILE_EXTENT_INLINE) {
-		printf("%s: Extent for symlink %llu not of INLINE type\n",
-		       __func__, inr);
+	ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
+	if (ret < 0)
+		return ret;
+	if (ret > 0) {
+		ret = -ENOENT;
 		goto out;
 	}
-
-	btrfs_file_extent_item_to_cpu_inl(extent);
-
-	if (extent->compression != BTRFS_COMPRESS_NONE) {
-		printf("%s: Symlink %llu extent data compressed!\n", __func__,
-		       inr);
+	fi = btrfs_item_ptr(path.nodes[0], path.slots[0],
+			    struct btrfs_file_extent_item);
+	if (btrfs_file_extent_type(path.nodes[0], fi) !=
+	    BTRFS_FILE_EXTENT_INLINE) {
+		ret = -EUCLEAN;
+		error("Extent for symlink %llu must be INLINE type!", ino);
 		goto out;
-	} else if (extent->encryption != 0) {
-		printf("%s: Symlink %llu extent data encrypted!\n", __func__,
-		       inr);
+	}
+	if (btrfs_file_extent_compression(path.nodes[0], fi) !=
+	    BTRFS_COMPRESS_NONE) {
+		ret = -EUCLEAN;
+		error("Extent for symlink %llu must not be compressed!", ino);
 		goto out;
-	} else if (extent->ram_bytes >= btrfs_info.sb.sectorsize) {
-		printf("%s: Symlink %llu extent data too long (%llu)!\n",
-		       __func__, inr, extent->ram_bytes);
+	}
+	if (btrfs_file_extent_ram_bytes(path.nodes[0], fi) >=
+	    root->fs_info->sectorsize) {
+		ret = -EUCLEAN;
+		error("Symlink %llu extent data too large (%llu)!\n",
+			ino, btrfs_file_extent_ram_bytes(path.nodes[0], fi));
 		goto out;
 	}
+	read_extent_buffer(path.nodes[0], target,
+			btrfs_file_extent_inline_start(fi),
+			btrfs_file_extent_ram_bytes(path.nodes[0], fi));
+	ret = btrfs_file_extent_ram_bytes(path.nodes[0], fi);
+out:
+	btrfs_release_path(&path);
+	return ret;
+}
 
-	data_ptr = (const char *) extent
-		   + offsetof(struct btrfs_file_extent_item, disk_bytenr);
+int __btrfs_readlink(const struct __btrfs_root *root, u64 inr, char *target)
+{
+	struct btrfs_root *subvolume;
+	struct btrfs_fs_info *fs_info = current_fs_info;
+	struct btrfs_key key;
+	int ret;
+
+	ASSERT(fs_info);
+	key.objectid = root->objectid;
+	key.type = BTRFS_ROOT_ITEM_KEY;
+	key.offset = (u64)-1;
+	subvolume = btrfs_read_fs_root(fs_info, &key);
+	if (IS_ERR(subvolume))
+		return -1;
 
-	memcpy(target, data_ptr, extent->ram_bytes);
-	target[extent->ram_bytes] = '\0';
-	res = 0;
-out:
-	__btrfs_free_path(&path);
-	return res;
+	ret = btrfs_readlink(subvolume, inr, target);
+	if (ret < 0)
+		return -1;
+	target[ret] = '\0';
+	return 0;
 }
 
 /* inr must be a directory (for regular files with multiple hard links this
-- 
2.26.2

  parent reply	other threads:[~2020-06-24 16:03 UTC|newest]

Thread overview: 84+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-24 16:02 [PATCH U-BOOT v3 00/30] PLEASE TEST fs: btrfs: Re-implement btrfs support using code from btrfs-progs Marek Behún
2020-06-24 16:02 ` Marek Behún
2020-06-24 16:02 ` [PATCH U-BOOT v3 01/30] fs: btrfs: Sync btrfs_btree.h from kernel Marek Behún
2020-06-24 16:02   ` Marek Behún
2020-06-24 16:02 ` [PATCH U-BOOT v3 02/30] fs: btrfs: Add more checksum algorithms Marek Behún
2020-06-24 16:02   ` Marek Behún
2020-06-24 16:02 ` [PATCH U-BOOT v3 03/30] fs: btrfs: Crossport btrfs_read_dev_super() from btrfs-progs Marek Behún
2020-06-24 16:02   ` Marek Behún
2020-09-07 22:26   ` Tom Rini
2020-09-07 22:26     ` Tom Rini
2020-09-07 23:58     ` Marek Behun
2020-09-07 23:58       ` Marek Behun
2020-06-24 16:02 ` [PATCH U-BOOT v3 04/30] fs: btrfs: Crossport rbtree-utils " Marek Behún
2020-06-24 16:02   ` Marek Behún
2020-06-24 16:02 ` [PATCH U-BOOT v3 05/30] fs: btrfs: Crossport extent-cache.[ch] " Marek Behún
2020-06-24 16:02   ` Marek Behún
2020-06-24 16:02 ` [PATCH U-BOOT v3 06/30] fs: btrfs: Crossport extent-io.[ch] " Marek Behún
2020-06-24 16:02   ` Marek Behún
2020-06-24 16:02 ` [PATCH U-BOOT v3 07/30] fs: btrfs: Crossport structure accessor into ctree.h Marek Behún
2020-06-24 16:02   ` Marek Behún
2020-06-24 16:02 ` [PATCH U-BOOT v3 08/30] fs: btrfs: Crossport volumes.[ch] from btrfs-progs Marek Behún
2020-06-24 16:02   ` Marek Behún
2020-06-24 16:02 ` [PATCH U-BOOT v3 09/30] fs: btrfs: Crossport read_tree_block() " Marek Behún
2020-06-24 16:02   ` Marek Behún
2020-06-24 16:02 ` [PATCH U-BOOT v3 10/30] fs: btrfs: Rename struct btrfs_path to struct __btrfs_path Marek Behún
2020-06-24 16:02   ` Marek Behún
2020-06-24 16:02 ` [PATCH U-BOOT v3 11/30] fs: btrfs: Rename btrfs_root to __btrfs_root Marek Behún
2020-06-24 16:02   ` Marek Behún
2020-06-24 16:02 ` [PATCH U-BOOT v3 12/30] fs: btrfs: Crossport struct btrfs_root to ctree.h Marek Behún
2020-06-24 16:02   ` Marek Behún
2020-06-24 16:02 ` [PATCH U-BOOT v3 13/30] fs: btrfs: Crossport btrfs_search_slot() from btrfs-progs Marek Behún
2020-06-24 16:02   ` Marek Behún
2020-06-24 16:03 ` [PATCH U-BOOT v3 14/30] fs: btrfs: Crossport btrfs_read_sys_array() and btrfs_read_chunk_tree() Marek Behún
2020-06-24 16:03   ` Marek Behún
2020-06-24 16:03 ` [PATCH U-BOOT v3 15/30] fs: btrfs: Crossport open_ctree_fs_info() from btrfs-progs Marek Behún
2020-06-24 16:03   ` Marek Behún
2020-06-24 16:03 ` [PATCH U-BOOT v3 16/30] fs: btrfs: Rename path resolve related functions to avoid name conflicts Marek Behún
2020-06-24 16:03   ` Marek Behún
2020-06-24 16:03 ` Marek Behún [this message]
2020-06-24 16:03   ` [PATCH U-BOOT v3 17/30] fs: btrfs: Use btrfs_readlink() to implement __btrfs_readlink() Marek Behún
2020-06-24 16:03 ` [PATCH U-BOOT v3 18/30] fs: btrfs: inode: Allow next_length() to return value > BTRFS_NAME_LEN Marek Behún
2020-06-24 16:03   ` Marek Behún
2020-06-24 16:03 ` [PATCH U-BOOT v3 19/30] fs: btrfs: Implement btrfs_lookup_path() Marek Behún
2020-06-24 16:03   ` Marek Behún
2020-06-24 16:03 ` [PATCH U-BOOT v3 20/30] fs: btrfs: Use btrfs_iter_dir() to replace btrfs_readdir() Marek Behún
2020-06-24 16:03   ` Marek Behún
2020-06-24 16:03 ` [PATCH U-BOOT v3 21/30] fs: btrfs: Use btrfs_lookup_path() to implement btrfs_exists() and btrfs_size() Marek Behún
2020-06-24 16:03   ` Marek Behún
2020-06-24 16:03 ` [PATCH U-BOOT v3 22/30] fs: btrfs: Rename btrfs_file_read() and its callees to avoid name conflicts Marek Behún
2020-06-24 16:03   ` Marek Behún
2020-06-24 16:03 ` [PATCH U-BOOT v3 23/30] fs: btrfs: Introduce btrfs_read_extent_inline() and btrfs_read_extent_reg() Marek Behún
2020-06-24 16:03   ` Marek Behún
2020-06-24 16:03 ` [PATCH U-BOOT v3 24/30] fs: btrfs: Introduce lookup_data_extent() for later use Marek Behún
2020-06-24 16:03   ` Marek Behún
2020-06-24 16:03 ` [PATCH U-BOOT v3 25/30] fs: btrfs: Implement btrfs_file_read() Marek Behún
2020-06-24 16:03   ` Marek Behún
2020-09-07 22:35   ` Tom Rini
2020-09-07 22:35     ` Tom Rini
2020-09-08  0:26     ` Qu Wenruo
2020-09-08  0:26       ` Qu Wenruo
2020-09-08  0:56       ` Tom Rini
2020-09-08  0:56         ` Tom Rini
2020-09-08  0:59         ` Qu Wenruo
2020-09-08  0:59           ` Qu Wenruo
2020-06-24 16:03 ` [PATCH U-BOOT v3 26/30] fs: btrfs: Introduce function to resolve path in one subvolume Marek Behún
2020-06-24 16:03   ` Marek Behún
2020-06-24 16:03 ` [PATCH U-BOOT v3 27/30] fs: btrfs: Introduce function to resolve the path of " Marek Behún
2020-06-24 16:03   ` Marek Behún
2020-06-24 16:03 ` [PATCH U-BOOT v3 28/30] fs: btrfs: Imeplement btrfs_list_subvols() using new infrastructure Marek Behún
2020-06-24 16:03   ` Marek Behún
2020-06-24 16:03 ` [PATCH U-BOOT v3 29/30] fs: btrfs: Cleanup the old implementation Marek Behún
2020-06-24 16:03   ` Marek Behún
2020-06-24 16:03 ` [PATCH U-BOOT v3 30/30] MAINTAINERS: Add btrfs mailing list and myself as reviewer Marek Behún
2020-06-24 16:03   ` Marek Behún
2020-06-24 16:11 ` [PATCH U-BOOT v3 00/30] PLEASE TEST fs: btrfs: Re-implement btrfs support using code from btrfs-progs Marek Behún
2020-06-24 16:11   ` Marek Behún
2020-06-26  1:43 ` Simon Glass
2020-06-26  1:43   ` Simon Glass
2020-06-26 13:36   ` Tom Rini
2020-06-26 13:36     ` Tom Rini
2020-06-29 17:26     ` Simon Glass
2020-06-29 17:26       ` Simon Glass
2020-09-08 18:18 ` Tom Rini
2020-09-08 18:18   ` Tom Rini

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=20200624160316.5001-18-marek.behun@nic.cz \
    --to=marek.behun@nic.cz \
    --cc=alsamolero@gmail.com \
    --cc=delroth@gmail.com \
    --cc=linux-btrfs@vger.kernel.org \
    --cc=marex@denx.de \
    --cc=sjg@chromium.org \
    --cc=trini@konsulko.com \
    --cc=u-boot@lists.denx.de \
    --cc=wqu@suse.com \
    --cc=yevgenyp@pointgrab.com \
    /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: link
Be 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.