@@ -177,7 +177,7 @@ static int __bio_uncompress(struct bch_fs *c, struct bio *src,
177177 size_t src_len = src -> bi_iter .bi_size ;
178178 size_t dst_len = crc .uncompressed_size << 9 ;
179179 void * workspace ;
180- int ret ;
180+ int ret = 0 , ret2 ;
181181
182182 enum bch_compression_opts opt = bch2_compression_type_to_opt (crc .compression_type );
183183 mempool_t * workspace_pool = & c -> compress_workspace [opt ];
@@ -189,18 +189,18 @@ static int __bio_uncompress(struct bch_fs *c, struct bio *src,
189189 else
190190 ret = - BCH_ERR_compression_workspace_not_initialized ;
191191 if (ret )
192- goto out ;
192+ goto err ;
193193 }
194194
195195 src_data = bio_map_or_bounce (c , src , READ );
196196
197197 switch (crc .compression_type ) {
198198 case BCH_COMPRESSION_TYPE_lz4_old :
199199 case BCH_COMPRESSION_TYPE_lz4 :
200- ret = LZ4_decompress_safe_partial (src_data .b , dst_data ,
201- src_len , dst_len , dst_len );
202- if (ret != dst_len )
203- goto err ;
200+ ret2 = LZ4_decompress_safe_partial (src_data .b , dst_data ,
201+ src_len , dst_len , dst_len );
202+ if (ret2 != dst_len )
203+ ret = - BCH_ERR_decompress_lz4 ;
204204 break ;
205205 case BCH_COMPRESSION_TYPE_gzip : {
206206 z_stream strm = {
@@ -214,45 +214,43 @@ static int __bio_uncompress(struct bch_fs *c, struct bio *src,
214214
215215 zlib_set_workspace (& strm , workspace );
216216 zlib_inflateInit2 (& strm , - MAX_WBITS );
217- ret = zlib_inflate (& strm , Z_FINISH );
217+ ret2 = zlib_inflate (& strm , Z_FINISH );
218218
219219 mempool_free (workspace , workspace_pool );
220220
221- if (ret != Z_STREAM_END )
222- goto err ;
221+ if (ret2 != Z_STREAM_END )
222+ ret = - BCH_ERR_decompress_gzip ;
223223 break ;
224224 }
225225 case BCH_COMPRESSION_TYPE_zstd : {
226226 ZSTD_DCtx * ctx ;
227227 size_t real_src_len = le32_to_cpup (src_data .b );
228228
229- if (real_src_len > src_len - 4 )
229+ if (real_src_len > src_len - 4 ) {
230+ ret = - BCH_ERR_decompress_zstd_src_len_bad ;
230231 goto err ;
232+ }
231233
232234 workspace = mempool_alloc (workspace_pool , GFP_NOFS );
233235 ctx = zstd_init_dctx (workspace , zstd_dctx_workspace_bound ());
234236
235- ret = zstd_decompress_dctx (ctx ,
237+ ret2 = zstd_decompress_dctx (ctx ,
236238 dst_data , dst_len ,
237239 src_data .b + 4 , real_src_len );
238240
239241 mempool_free (workspace , workspace_pool );
240242
241- if (ret != dst_len )
242- goto err ;
243+ if (ret2 != dst_len )
244+ ret = - BCH_ERR_decompress_zstd ;
243245 break ;
244246 }
245247 default :
246248 BUG ();
247249 }
248- ret = 0 ;
250+ err :
249251fsck_err :
250- out :
251252 bio_unmap_or_unbounce (c , src_data );
252253 return ret ;
253- err :
254- ret = - EIO ;
255- goto out ;
256254}
257255
258256int bch2_bio_uncompress_inplace (struct bch_write_op * op ,
@@ -268,18 +266,22 @@ int bch2_bio_uncompress_inplace(struct bch_write_op *op,
268266 BUG_ON (!bio -> bi_vcnt );
269267 BUG_ON (DIV_ROUND_UP (crc -> live_size , PAGE_SECTORS ) > bio -> bi_max_vecs );
270268
271- if (crc -> uncompressed_size << 9 > c -> opts .encoded_extent_max ||
272- crc -> compressed_size << 9 > c -> opts .encoded_extent_max ) {
273- bch2_write_op_error (op , op -> pos .offset , "extent too big to decompress" );
274- return - EIO ;
269+ if (crc -> uncompressed_size << 9 > c -> opts .encoded_extent_max ) {
270+ bch2_write_op_error (op , op -> pos .offset ,
271+ "extent too big to decompress (%u > %u)" ,
272+ crc -> uncompressed_size << 9 , c -> opts .encoded_extent_max );
273+ return - BCH_ERR_decompress_exceeded_max_encoded_extent ;
275274 }
276275
277276 data = __bounce_alloc (c , dst_len , WRITE );
278277
279- if (__bio_uncompress (c , bio , data .b , * crc )) {
280- if (!c -> opts .no_data_io )
281- bch2_write_op_error (op , op -> pos .offset , "decompression error" );
282- ret = - EIO ;
278+ ret = __bio_uncompress (c , bio , data .b , * crc );
279+
280+ if (c -> opts .no_data_io )
281+ ret = 0 ;
282+
283+ if (ret ) {
284+ bch2_write_op_error (op , op -> pos .offset , "%s" , bch2_err_str (ret ));
283285 goto err ;
284286 }
285287
@@ -312,7 +314,7 @@ int bch2_bio_uncompress(struct bch_fs *c, struct bio *src,
312314
313315 if (crc .uncompressed_size << 9 > c -> opts .encoded_extent_max ||
314316 crc .compressed_size << 9 > c -> opts .encoded_extent_max )
315- return - EIO ;
317+ return - BCH_ERR_decompress_exceeded_max_encoded_extent ;
316318
317319 dst_data = dst_len == dst_iter .bi_size
318320 ? __bio_map_or_bounce (c , dst , dst_iter , WRITE )
0 commit comments