]> Gentwo Git Trees - linux/.git/commitdiff
erofs: enable error reporting for z_erofs_stream_switch_bufs()
authorGao Xiang <hsiangkao@linux.alibaba.com>
Thu, 27 Nov 2025 07:31:21 +0000 (15:31 +0800)
committerGao Xiang <hsiangkao@linux.alibaba.com>
Fri, 28 Nov 2025 14:00:08 +0000 (22:00 +0800)
Enable propagation of detailed errors to callers.

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
fs/erofs/compress.h
fs/erofs/decompressor.c
fs/erofs/decompressor_deflate.c
fs/erofs/decompressor_lzma.c
fs/erofs/decompressor_zstd.c

index 1ee4ad934c1fabb8a6eba5045605eed5faeee849..91dbc8bb5ddf34d12dd4893ee66bbb1bd7d32ccc 100644 (file)
@@ -70,8 +70,8 @@ struct z_erofs_stream_dctx {
        bool bounced;                   /* is the bounce buffer used now? */
 };
 
-int z_erofs_stream_switch_bufs(struct z_erofs_stream_dctx *dctx, void **dst,
-                              void **src, struct page **pgpl);
+const char *z_erofs_stream_switch_bufs(struct z_erofs_stream_dctx *dctx,
+                               void **dst, void **src, struct page **pgpl);
 int z_erofs_fixup_insize(struct z_erofs_decompress_req *rq, const char *padbuf,
                         unsigned int padbufsize);
 int __init z_erofs_init_decompressor(void);
index f9d29f43666f69331ea10c457572b874ccaaff74..638b5f87bd0c7f356196905d5bd262db9ad97de0 100644 (file)
@@ -342,19 +342,16 @@ static const char *z_erofs_transform_plain(struct z_erofs_decompress_req *rq,
        return NULL;
 }
 
-int z_erofs_stream_switch_bufs(struct z_erofs_stream_dctx *dctx, void **dst,
-                              void **src, struct page **pgpl)
+const char *z_erofs_stream_switch_bufs(struct z_erofs_stream_dctx *dctx,
+                               void **dst, void **src, struct page **pgpl)
 {
        struct z_erofs_decompress_req *rq = dctx->rq;
-       struct super_block *sb = rq->sb;
        struct page **pgo, *tmppage;
        unsigned int j;
 
        if (!dctx->avail_out) {
-               if (++dctx->no >= rq->outpages || !rq->outputsize) {
-                       erofs_err(sb, "insufficient space for decompressed data");
-                       return -EFSCORRUPTED;
-               }
+               if (++dctx->no >= rq->outpages || !rq->outputsize)
+                       return "insufficient space for decompressed data";
 
                if (dctx->kout)
                        kunmap_local(dctx->kout);
@@ -365,7 +362,7 @@ int z_erofs_stream_switch_bufs(struct z_erofs_stream_dctx *dctx, void **dst,
                        *pgo = erofs_allocpage(pgpl, rq->gfp);
                        if (!*pgo) {
                                dctx->kout = NULL;
-                               return -ENOMEM;
+                               return ERR_PTR(-ENOMEM);
                        }
                        set_page_private(*pgo, Z_EROFS_SHORTLIVED_PAGE);
                }
@@ -379,10 +376,8 @@ int z_erofs_stream_switch_bufs(struct z_erofs_stream_dctx *dctx, void **dst,
        }
 
        if (dctx->inbuf_pos == dctx->inbuf_sz && rq->inputsize) {
-               if (++dctx->ni >= rq->inpages) {
-                       erofs_err(sb, "invalid compressed data");
-                       return -EFSCORRUPTED;
-               }
+               if (++dctx->ni >= rq->inpages)
+                       return "invalid compressed data";
                if (dctx->kout) /* unlike kmap(), take care of the orders */
                        kunmap_local(dctx->kout);
                kunmap_local(dctx->kin);
@@ -417,12 +412,12 @@ int z_erofs_stream_switch_bufs(struct z_erofs_stream_dctx *dctx, void **dst,
                        continue;
                tmppage = erofs_allocpage(pgpl, rq->gfp);
                if (!tmppage)
-                       return -ENOMEM;
+                       return ERR_PTR(-ENOMEM);
                set_page_private(tmppage, Z_EROFS_SHORTLIVED_PAGE);
                copy_highpage(tmppage, rq->in[j]);
                rq->in[j] = tmppage;
        }
-       return 0;
+       return NULL;
 }
 
 const struct z_erofs_decompressor *z_erofs_decomp[] = {
index 46cc1fd19bcebd69dfc1a703c8ba2739a1c2a51c..afc73abd8db50ae7d2f5c2fc12cb6673a6e081fd 100644 (file)
@@ -144,10 +144,10 @@ static const char *__z_erofs_deflate_decompress(struct z_erofs_decompress_req *r
        while (1) {
                dctx.avail_out = strm->z.avail_out;
                dctx.inbuf_sz = strm->z.avail_in;
-               err = z_erofs_stream_switch_bufs(&dctx,
+               reason = z_erofs_stream_switch_bufs(&dctx,
                                        (void **)&strm->z.next_out,
                                        (void **)&strm->z.next_in, pgpl);
-               if (err)
+               if (reason)
                        break;
                strm->z.avail_out = dctx.avail_out;
                strm->z.avail_in = dctx.inbuf_sz;
index 98a8c22cdbdef560f3689bdde4287e68ef860895..0161f3375efd65ab2d68140a27f6efcd3147b5a6 100644 (file)
@@ -189,9 +189,9 @@ static const char *z_erofs_lzma_decompress(struct z_erofs_decompress_req *rq,
                dctx.avail_out = buf.out_size - buf.out_pos;
                dctx.inbuf_sz = buf.in_size;
                dctx.inbuf_pos = buf.in_pos;
-               err = z_erofs_stream_switch_bufs(&dctx, (void **)&buf.out,
-                                                (void **)&buf.in, pgpl);
-               if (err)
+               reason = z_erofs_stream_switch_bufs(&dctx, (void **)&buf.out,
+                                                   (void **)&buf.in, pgpl);
+               if (reason)
                        break;
 
                if (buf.out_size == buf.out_pos) {
index aff6825cacde55b3be731474497f3f2b5368547f..ae51faeb504dc03192d34ba2988059aa1d0111a9 100644 (file)
@@ -175,9 +175,9 @@ static const char *z_erofs_zstd_decompress(struct z_erofs_decompress_req *rq,
        do {
                dctx.inbuf_sz = in_buf.size;
                dctx.inbuf_pos = in_buf.pos;
-               err = z_erofs_stream_switch_bufs(&dctx, &out_buf.dst,
+               reason = z_erofs_stream_switch_bufs(&dctx, &out_buf.dst,
                                                 (void **)&in_buf.src, pgpl);
-               if (err)
+               if (reason)
                        break;
 
                if (out_buf.size == out_buf.pos) {