From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from out30-100.freemail.mail.aliyun.com (out30-100.freemail.mail.aliyun.com [115.124.30.100]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 154BC31ED88 for ; Thu, 27 Nov 2025 07:31:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=115.124.30.100 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764228696; cv=none; b=l3TQxGvHGNc/m93GPilsB8h+YmkkvuNzw7W3Ahr9SMU/Fg6ICQTzRcbkZtBPv2hSY4y2NnIHrROXs/eo8pc2PP5sou/SOIOMUhpjW4GiLasjjtiIpz1Z9sBdBp3LauhVceXXnr6sNLzVoTX8eFjUtEPlogwg0o5eyts4KGMrfMQ= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764228696; c=relaxed/simple; bh=vsvVGQyyl3b50l4IEhStZ+wlqtJm/JFGgHXGgj7M3BM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=R++mSa+DdP1DWXcXQbTlVKFtfd4VVLaTmK4YB3pi9gtP7c4PfigTVtcQwRfV5tsVhr7XmRGcAifbEmBTm5cU8Bz3QAk5HVc3ZkKeTgj0xFFFeAIqi3CiaeVN3+uZ3eWfOvGzJzgxuJRafQp1l6bsyaF3bzl3T8S2yHv8B8EWWj0= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.alibaba.com; spf=pass smtp.mailfrom=linux.alibaba.com; dkim=pass (1024-bit key) header.d=linux.alibaba.com header.i=@linux.alibaba.com header.b=VN12xFsc; arc=none smtp.client-ip=115.124.30.100 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.alibaba.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.alibaba.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.alibaba.com header.i=@linux.alibaba.com header.b="VN12xFsc" DKIM-Signature:v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.alibaba.com; s=default; t=1764228689; h=From:To:Subject:Date:Message-ID:MIME-Version; bh=PiKulZPrQ+M7JuXQdU84bUWaRfmbV/6y+O/0x/7h4mg=; b=VN12xFsc9uuCYhtbIep1wwoMqf749LzbetwBlbgqyTJdOzopD66Qh1L+usWVUC76pLHvc5j1SdnP2F4KCwT7ZEhWwtRV6mtz6IVT0y9SNhqmpkUFbBL0XzdqUKn6CFSB+IzgoTVjr9oFY9rxTmtn82iAvSUb7LMvzR6LVAtu5vY= Received: from x31i01179.sqa.na131.tbsite.net(mailfrom:hsiangkao@linux.alibaba.com fp:SMTPD_---0WtWGgFg_1764228688 cluster:ay36) by smtp.aliyun-inc.com; Thu, 27 Nov 2025 15:31:29 +0800 From: Gao Xiang To: linux-erofs@lists.ozlabs.org Cc: LKML , Gao Xiang Subject: [PATCH 2/4] erofs: improve Zstd, LZMA and DEFLATE error strings Date: Thu, 27 Nov 2025 15:31:20 +0800 Message-ID: <20251127073122.2542542-2-hsiangkao@linux.alibaba.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20251127073122.2542542-1-hsiangkao@linux.alibaba.com> References: <20251127073122.2542542-1-hsiangkao@linux.alibaba.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Enable better, more detailed, and unique error reporting. Signed-off-by: Gao Xiang --- fs/erofs/decompressor_deflate.c | 16 ++++++++++------ fs/erofs/decompressor_lzma.c | 7 +++++-- fs/erofs/decompressor_zstd.c | 8 +++++--- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/fs/erofs/decompressor_deflate.c b/fs/erofs/decompressor_deflate.c index e9c4b740ef89..46cc1fd19bce 100644 --- a/fs/erofs/decompressor_deflate.c +++ b/fs/erofs/decompressor_deflate.c @@ -97,12 +97,13 @@ static int z_erofs_load_deflate_config(struct super_block *sb, return -ENOMEM; } -static int __z_erofs_deflate_decompress(struct z_erofs_decompress_req *rq, - struct page **pgpl) +static const char *__z_erofs_deflate_decompress(struct z_erofs_decompress_req *rq, + struct page **pgpl) { struct super_block *sb = rq->sb; struct z_erofs_stream_dctx dctx = { .rq = rq, .no = -1, .ni = 0 }; struct z_erofs_deflate *strm; + const char *reason = NULL; int zerr, err; /* 1. get the exact DEFLATE compressed size */ @@ -111,7 +112,7 @@ static int __z_erofs_deflate_decompress(struct z_erofs_decompress_req *rq, min(rq->inputsize, sb->s_blocksize - rq->pageofs_in)); if (err) { kunmap_local(dctx.kin); - return err; + return ERR_PTR(err); } /* 2. get an available DEFLATE context */ @@ -129,7 +130,7 @@ static int __z_erofs_deflate_decompress(struct z_erofs_decompress_req *rq, /* 3. multi-call decompress */ zerr = zlib_inflateInit2(&strm->z, -MAX_WBITS); if (zerr != Z_OK) { - err = -EIO; + err = -EINVAL; goto failed_zinit; } @@ -157,6 +158,9 @@ static int __z_erofs_deflate_decompress(struct z_erofs_decompress_req *rq, break; if (zerr == Z_STREAM_END && !rq->outputsize) break; + reason = (zerr == Z_DATA_ERROR ? + "corrupted compressed data" : + "unexpected end of stream"); err = -EFSCORRUPTED; break; } @@ -173,7 +177,7 @@ static int __z_erofs_deflate_decompress(struct z_erofs_decompress_req *rq, z_erofs_deflate_head = strm; spin_unlock(&z_erofs_deflate_lock); wake_up(&z_erofs_deflate_wq); - return err; + return reason ?: ERR_PTR(err); } static const char *z_erofs_deflate_decompress(struct z_erofs_decompress_req *rq, @@ -189,7 +193,7 @@ static const char *z_erofs_deflate_decompress(struct z_erofs_decompress_req *rq, } #endif - return ERR_PTR(__z_erofs_deflate_decompress(rq, pgpl)); + return __z_erofs_deflate_decompress(rq, pgpl); } const struct z_erofs_decompressor z_erofs_deflate_decomp = { diff --git a/fs/erofs/decompressor_lzma.c b/fs/erofs/decompressor_lzma.c index 7784ced90145..98a8c22cdbde 100644 --- a/fs/erofs/decompressor_lzma.c +++ b/fs/erofs/decompressor_lzma.c @@ -154,6 +154,7 @@ static const char *z_erofs_lzma_decompress(struct z_erofs_decompress_req *rq, struct xz_buf buf = {}; struct z_erofs_lzma *strm; enum xz_ret xz_err; + const char *reason = NULL; int err; /* 1. get the exact LZMA compressed size */ @@ -207,7 +208,9 @@ static const char *z_erofs_lzma_decompress(struct z_erofs_decompress_req *rq, if (xz_err != XZ_OK) { if (xz_err == XZ_STREAM_END && !rq->outputsize) break; - err = -EFSCORRUPTED; + reason = (xz_err == XZ_DATA_ERROR ? + "corrupted compressed data" : + "unexpected end of stream"); break; } } while (1); @@ -221,7 +224,7 @@ static const char *z_erofs_lzma_decompress(struct z_erofs_decompress_req *rq, z_erofs_lzma_head = strm; spin_unlock(&z_erofs_lzma_lock); wake_up(&z_erofs_lzma_wq); - return ERR_PTR(err); + return reason ?: ERR_PTR(err); } const struct z_erofs_decompressor z_erofs_lzma_decomp = { diff --git a/fs/erofs/decompressor_zstd.c b/fs/erofs/decompressor_zstd.c index 50fadff89cbc..aff6825cacde 100644 --- a/fs/erofs/decompressor_zstd.c +++ b/fs/erofs/decompressor_zstd.c @@ -143,6 +143,7 @@ static const char *z_erofs_zstd_decompress(struct z_erofs_decompress_req *rq, zstd_in_buffer in_buf = { NULL, 0, 0 }; zstd_out_buffer out_buf = { NULL, 0, 0 }; struct z_erofs_zstd *strm; + const char *reason = NULL; zstd_dstream *stream; int zerr, err; @@ -161,7 +162,7 @@ static const char *z_erofs_zstd_decompress(struct z_erofs_decompress_req *rq, /* 3. multi-call decompress */ stream = zstd_init_dstream(z_erofs_zstd_max_dictsize, strm->wksp, strm->wkspsz); if (!stream) { - err = -EIO; + err = -ENOMEM; goto failed_zinit; } @@ -191,7 +192,8 @@ static const char *z_erofs_zstd_decompress(struct z_erofs_decompress_req *rq, if (zstd_is_error(zerr) || ((rq->outputsize + dctx.avail_out) && (!zerr || (zerr > 0 && !(rq->inputsize + in_buf.size - in_buf.pos))))) { - err = -EFSCORRUPTED; + reason = zstd_is_error(zerr) ? zstd_get_error_name(zerr) : + "unexpected end of stream"; break; } } while (rq->outputsize + dctx.avail_out); @@ -206,7 +208,7 @@ static const char *z_erofs_zstd_decompress(struct z_erofs_decompress_req *rq, z_erofs_zstd_head = strm; spin_unlock(&z_erofs_zstd_lock); wake_up(&z_erofs_zstd_wq); - return ERR_PTR(err); + return reason ?: ERR_PTR(err); } const struct z_erofs_decompressor z_erofs_zstd_decomp = { -- 2.43.5