All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v5] btrfs: improve error reporting in lookup_inline_extent_backref
@ 2022-04-29 14:17 Nikolay Borisov
  2022-05-02  9:30 ` Filipe Manana
  2022-05-02 18:31 ` David Sterba
  0 siblings, 2 replies; 3+ messages in thread
From: Nikolay Borisov @ 2022-04-29 14:17 UTC (permalink / raw)
  To: linux-btrfs; +Cc: Nikolay Borisov

When iterating the backrefs in an extent item if the ptr to the
'current' backref record goes beyond the extent item a warning is
generated and -ENOENT is returned. However what's more appropriate to
debug such cases would be to return EUCLEAN and also print identifying
information about the performed search as well as the current content of
the leaf containing the possibly corrupted extent item.

Signed-off-by: Nikolay Borisov <nborisov@suse.com>
---

V5:
 * Stop printing the key we are searching for as it was both wrong and redundant,
 since we have the slot number printed anyway. (Filipe)

V4:
 * Also print the value of 'parent' as it's pertinent when metadata inline backrefs
 are being searched (Filipe)
 * Print the leaf before printing the error message so that the latter is
 not lost (Filipe)

V3:
 * Fixed format for the btree slot
 * Removed redundant argument passed to format string

 fs/btrfs/extent-tree.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index 963160a0c393..cca89016f2b3 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -895,7 +895,14 @@ int lookup_inline_extent_backref(struct btrfs_trans_handle *trans,
 	err = -ENOENT;
 	while (1) {
 		if (ptr >= end) {
-			WARN_ON(ptr > end);
+			if (ptr > end) {
+				err = -EUCLEAN;
+				btrfs_print_leaf(path->nodes[0]);
+				btrfs_crit(fs_info,
+"overrun extent record at slot %d while looking for inline extent for root %llu owner %llu offset %llu parent %llu",
+				path->slots[0], root_objectid, owner, offset,
+				parent);
+			}
 			break;
 		}
 		iref = (struct btrfs_extent_inline_ref *)ptr;
--
2.25.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH v5] btrfs: improve error reporting in lookup_inline_extent_backref
  2022-04-29 14:17 [PATCH v5] btrfs: improve error reporting in lookup_inline_extent_backref Nikolay Borisov
@ 2022-05-02  9:30 ` Filipe Manana
  2022-05-02 18:31 ` David Sterba
  1 sibling, 0 replies; 3+ messages in thread
From: Filipe Manana @ 2022-05-02  9:30 UTC (permalink / raw)
  To: Nikolay Borisov; +Cc: linux-btrfs

On Fri, Apr 29, 2022 at 05:17:34PM +0300, Nikolay Borisov wrote:
> When iterating the backrefs in an extent item if the ptr to the
> 'current' backref record goes beyond the extent item a warning is
> generated and -ENOENT is returned. However what's more appropriate to
> debug such cases would be to return EUCLEAN and also print identifying
> information about the performed search as well as the current content of
> the leaf containing the possibly corrupted extent item.
> 
> Signed-off-by: Nikolay Borisov <nborisov@suse.com>

Reviewed-by: Filipe Manana <fdmanana@suse.com>

Looks good now, thanks.

> ---
> 
> V5:
>  * Stop printing the key we are searching for as it was both wrong and redundant,
>  since we have the slot number printed anyway. (Filipe)
> 
> V4:
>  * Also print the value of 'parent' as it's pertinent when metadata inline backrefs
>  are being searched (Filipe)
>  * Print the leaf before printing the error message so that the latter is
>  not lost (Filipe)
> 
> V3:
>  * Fixed format for the btree slot
>  * Removed redundant argument passed to format string
> 
>  fs/btrfs/extent-tree.c | 9 ++++++++-
>  1 file changed, 8 insertions(+), 1 deletion(-)
> 
> diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
> index 963160a0c393..cca89016f2b3 100644
> --- a/fs/btrfs/extent-tree.c
> +++ b/fs/btrfs/extent-tree.c
> @@ -895,7 +895,14 @@ int lookup_inline_extent_backref(struct btrfs_trans_handle *trans,
>  	err = -ENOENT;
>  	while (1) {
>  		if (ptr >= end) {
> -			WARN_ON(ptr > end);
> +			if (ptr > end) {
> +				err = -EUCLEAN;
> +				btrfs_print_leaf(path->nodes[0]);
> +				btrfs_crit(fs_info,
> +"overrun extent record at slot %d while looking for inline extent for root %llu owner %llu offset %llu parent %llu",
> +				path->slots[0], root_objectid, owner, offset,
> +				parent);
> +			}
>  			break;
>  		}
>  		iref = (struct btrfs_extent_inline_ref *)ptr;
> --
> 2.25.1
> 

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH v5] btrfs: improve error reporting in lookup_inline_extent_backref
  2022-04-29 14:17 [PATCH v5] btrfs: improve error reporting in lookup_inline_extent_backref Nikolay Borisov
  2022-05-02  9:30 ` Filipe Manana
@ 2022-05-02 18:31 ` David Sterba
  1 sibling, 0 replies; 3+ messages in thread
From: David Sterba @ 2022-05-02 18:31 UTC (permalink / raw)
  To: Nikolay Borisov; +Cc: linux-btrfs

On Fri, Apr 29, 2022 at 05:17:34PM +0300, Nikolay Borisov wrote:
> When iterating the backrefs in an extent item if the ptr to the
> 'current' backref record goes beyond the extent item a warning is
> generated and -ENOENT is returned. However what's more appropriate to
> debug such cases would be to return EUCLEAN and also print identifying
> information about the performed search as well as the current content of
> the leaf containing the possibly corrupted extent item.
> 
> Signed-off-by: Nikolay Borisov <nborisov@suse.com>
> ---
> 
> V5:
>  * Stop printing the key we are searching for as it was both wrong and redundant,
>  since we have the slot number printed anyway. (Filipe)

Added to misc-next, thanks.

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2022-05-02 18:35 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-04-29 14:17 [PATCH v5] btrfs: improve error reporting in lookup_inline_extent_backref Nikolay Borisov
2022-05-02  9:30 ` Filipe Manana
2022-05-02 18:31 ` David Sterba

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.