diff mbox series

btrfs: send: do not BUG_ON() on unexpected symlink data extent

Message ID f3c6cadc84e001f786b82ef540cf39e9e8ce859e.1686566191.git.fdmanana@suse.com (mailing list archive)
State New, archived
Headers show
Series btrfs: send: do not BUG_ON() on unexpected symlink data extent | expand

Commit Message

Filipe Manana June 12, 2023, 10:40 a.m. UTC
From: Filipe Manana <fdmanana@suse.com>

There's really no need to BUG_ON() if we find a symlink with an extent
that is not inline or is compressed. We can just make send fail with
an error (-EUCLEAN) and log an informative error message, so just do
that instead of BUG_ON().

Signed-off-by: Filipe Manana <fdmanana@suse.com>
---
 fs/btrfs/send.c | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

Comments

Qu Wenruo June 12, 2023, 11:19 a.m. UTC | #1
On 2023/6/12 18:40, fdmanana@kernel.org wrote:
> From: Filipe Manana <fdmanana@suse.com>
>
> There's really no need to BUG_ON() if we find a symlink with an extent
> that is not inline or is compressed. We can just make send fail with
> an error (-EUCLEAN) and log an informative error message, so just do
> that instead of BUG_ON().
>
> Signed-off-by: Filipe Manana <fdmanana@suse.com>

Reviewed-by: Qu Wenruo <wqu@suse.com>

Thanks,
Qu
> ---
>   fs/btrfs/send.c | 16 ++++++++++++++--
>   1 file changed, 14 insertions(+), 2 deletions(-)
>
> diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c
> index af2e153543a5..8bfd44750efe 100644
> --- a/fs/btrfs/send.c
> +++ b/fs/btrfs/send.c
> @@ -1774,9 +1774,21 @@ static int read_symlink(struct btrfs_root *root,
>   	ei = btrfs_item_ptr(path->nodes[0], path->slots[0],
>   			struct btrfs_file_extent_item);
>   	type = btrfs_file_extent_type(path->nodes[0], ei);
> +	if (unlikely(type != BTRFS_FILE_EXTENT_INLINE)) {
> +		ret = -EUCLEAN;
> +		btrfs_crit(root->fs_info,
> +"send: found symlink extent that is not inline, ino %llu root %llu extent type %d",
> +			   ino, btrfs_root_id(root), type);
> +		goto out;
> +	}
>   	compression = btrfs_file_extent_compression(path->nodes[0], ei);
> -	BUG_ON(type != BTRFS_FILE_EXTENT_INLINE);
> -	BUG_ON(compression);
> +	if (unlikely(compression != BTRFS_COMPRESS_NONE)) {
> +		ret = -EUCLEAN;
> +		btrfs_crit(root->fs_info,
> +"send: found symlink extent with compression, ino %llu root %llu compression type %d",
> +			   ino, btrfs_root_id(root), compression);
> +		goto out;
> +	}
>
>   	off = btrfs_file_extent_inline_start(ei);
>   	len = btrfs_file_extent_ram_bytes(path->nodes[0], ei);
David Sterba June 12, 2023, 10:13 p.m. UTC | #2
On Mon, Jun 12, 2023 at 11:40:59AM +0100, fdmanana@kernel.org wrote:
> From: Filipe Manana <fdmanana@suse.com>
> 
> There's really no need to BUG_ON() if we find a symlink with an extent
> that is not inline or is compressed. We can just make send fail with
> an error (-EUCLEAN) and log an informative error message, so just do
> that instead of BUG_ON().
> 
> Signed-off-by: Filipe Manana <fdmanana@suse.com>

Added to misc-next, thanks.
diff mbox series

Patch

diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c
index af2e153543a5..8bfd44750efe 100644
--- a/fs/btrfs/send.c
+++ b/fs/btrfs/send.c
@@ -1774,9 +1774,21 @@  static int read_symlink(struct btrfs_root *root,
 	ei = btrfs_item_ptr(path->nodes[0], path->slots[0],
 			struct btrfs_file_extent_item);
 	type = btrfs_file_extent_type(path->nodes[0], ei);
+	if (unlikely(type != BTRFS_FILE_EXTENT_INLINE)) {
+		ret = -EUCLEAN;
+		btrfs_crit(root->fs_info,
+"send: found symlink extent that is not inline, ino %llu root %llu extent type %d",
+			   ino, btrfs_root_id(root), type);
+		goto out;
+	}
 	compression = btrfs_file_extent_compression(path->nodes[0], ei);
-	BUG_ON(type != BTRFS_FILE_EXTENT_INLINE);
-	BUG_ON(compression);
+	if (unlikely(compression != BTRFS_COMPRESS_NONE)) {
+		ret = -EUCLEAN;
+		btrfs_crit(root->fs_info,
+"send: found symlink extent with compression, ino %llu root %llu compression type %d",
+			   ino, btrfs_root_id(root), compression);
+		goto out;
+	}
 
 	off = btrfs_file_extent_inline_start(ei);
 	len = btrfs_file_extent_ram_bytes(path->nodes[0], ei);