Re: [PATCH v3 3/6] xfs: report the error that made deferred work shut down the fs

"Darrick J. Wong" <[email protected]>
Newsgroups org.kernel.vger.linux-xfs,org.kernel.vger.linux-kernel
Message-ID <20260811162754.GB3556460@frogsfrogsfrogs>
On Mon, Aug 10, 2026 at 05:06:15PM -0600, Javier Tia wrote:
> When a deferred operation fails and shuts the filesystem down,
> xfs_defer_finish_noroll() reports neither the errno nor which operation
> originated it, so the log cannot tell a transient -ENOSPC from real
> corruption.  Report the operation type, errno and remaining reservation.
> 
> trace_xfs_defer_finish_error() runs after xfs_force_shutdown(), which
> BUGs under fs.xfs.panic_mask and so never fires for the first failure;
> move it ahead of the shutdown and mirror it to xfs_alert() for systems
> without tracing armed.  Capture the op name while the item is live (dfp
> is freed once its work list drains) and suppress the alert once the fs is
> already down.
> 
> Signed-off-by: Javier Tia <[email protected]>
> ---
>  fs/xfs/libxfs/xfs_defer.c | 15 ++++++++++++++-
>  1 file changed, 14 insertions(+), 1 deletion(-)
> 
> diff --git a/fs/xfs/libxfs/xfs_defer.c b/fs/xfs/libxfs/xfs_defer.c
> index 75f0d37914d5..3152acdc335d 100644
> --- a/fs/xfs/libxfs/xfs_defer.c
> +++ b/fs/xfs/libxfs/xfs_defer.c
> @@ -656,6 +656,7 @@ xfs_defer_finish_noroll(
>  	struct xfs_trans		**tp)
>  {
>  	struct xfs_defer_pending	*dfp = NULL;
> +	const char			*what = "chain";
>  	int				error = 0;
>  	LIST_HEAD(dop_pending);
>  	LIST_HEAD(dop_paused);
> @@ -705,9 +706,17 @@ xfs_defer_finish_noroll(
>  				struct xfs_defer_pending, dfp_list);
>  		if (!dfp)
>  			break;
> +		what = dfp->dfp_ops->name;
>  		error = xfs_defer_finish_one(*tp, dfp);
>  		if (error && error != -EAGAIN)
>  			goto out_shutdown;
> +		/*
> +		 * A finished item is no longer a candidate for a later
> +		 * failure.  An -EAGAIN one is not finished, so it keeps the
> +		 * attribution across the roll that completes it.
> +		 */
> +		if (!error)
> +			what = "chain";
>  	}
>  
>  	/* Requeue the paused items in the outgoing transaction. */
> @@ -719,8 +728,12 @@ xfs_defer_finish_noroll(
>  out_shutdown:
>  	list_splice_tail_init(&dop_paused, &dop_pending);
>  	xfs_defer_trans_abort(*tp, &dop_pending);
> -	xfs_force_shutdown((*tp)->t_mountp, SHUTDOWN_CORRUPT_INCORE);
>  	trace_xfs_defer_finish_error(*tp, error);
> +	if (!xfs_is_shutdown((*tp)->t_mountp))
> +		xfs_alert((*tp)->t_mountp,
> +			  "deferred %s work failed, error %d, %u blocks reserved",
> +			  what, error, (*tp)->t_blk_res);

Excellent!  A new logging artifact that (might) tell us *which* deferred
operation produced an error. :)

Reviewed-by: "Darrick J. Wong" <[email protected]>

--D

> +	xfs_force_shutdown((*tp)->t_mountp, SHUTDOWN_CORRUPT_INCORE);
>  	xfs_defer_cancel_list((*tp)->t_mountp, &dop_pending);
>  	xfs_defer_cancel(*tp);
>  	return error;
> -- 
> Javier Tia
> 
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.