diff --git a/fs/cramfs/cramfs.c b/fs/cramfs/cramfs.c index b9ab50f..bdbb47e 100644 --- a/fs/cramfs/cramfs.c +++ b/fs/cramfs/cramfs.c @@ -337,7 +337,7 @@ if (priv->curr_base < 0 || priv->curr_base != base) { cdev_read(priv->cdev, cramfs_read_buf, 4096, base, 0); - priv->curr_block_len = cramfs_uncompress_block(priv->buf, + priv->curr_block_len = cramfs_uncompress_block(priv->buf, 4096, cramfs_read_buf, 4096); if (priv->curr_block_len <= 0) break; diff --git a/fs/cramfs/uncompress.c b/fs/cramfs/uncompress.c index 659869b..b7887bd 100644 --- a/fs/cramfs/uncompress.c +++ b/fs/cramfs/uncompress.c @@ -1,12 +1,7 @@ /* * uncompress.c * - * Copyright (C) 1999 Linus Torvalds - * Copyright (C) 2000-2002 Transmeta Corporation - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License (Version 2) as - * published by the Free Software Foundation. + * (C) Copyright 1999 Linus Torvalds * * cramfs interfaces to the uncompression library. There's really just * three entrypoints: @@ -22,81 +17,63 @@ #include #include -#include -#include +#include +#include +#include +#include +#include static z_stream stream; - -#define ZALLOC_ALIGNMENT 16 - -static void *zalloc (void *x, unsigned items, unsigned size) -{ - void *p; - - size *= items; - size = (size + ZALLOC_ALIGNMENT - 1) & ~(ZALLOC_ALIGNMENT - 1); - - p = malloc (size); - - return (p); -} - -static void zfree (void *x, void *addr, unsigned nb) -{ - free (addr); -} +static int initialized; /* Returns length of decompressed data. */ -int cramfs_uncompress_block (void *dst, void *src, int srclen) +int cramfs_uncompress_block(void *dst, int dstlen, void *src, int srclen) { int err; - inflateReset (&stream); - stream.next_in = src; stream.avail_in = srclen; stream.next_out = dst; - stream.avail_out = 4096 * 2; + stream.avail_out = dstlen; - err = inflate (&stream, Z_FINISH); + err = zlib_inflateReset(&stream); + if (err != Z_OK) { + printk("zlib_inflateReset error %d\n", err); + zlib_inflateEnd(&stream); + zlib_inflateInit(&stream); + } + err = zlib_inflate(&stream, Z_FINISH); if (err != Z_STREAM_END) goto err; return stream.total_out; - err: - /*printf ("Error %d while decompressing!\n", err); */ - /*printf ("%p(%d)->%p\n", src, srclen, dst); */ - return -1; +err: + printk("Error %d while decompressing!\n", err); + printk("%p(%d)->%p(%d)\n", src, srclen, dst, dstlen); + return -EIO; } -int cramfs_uncompress_init (void) +int cramfs_uncompress_init(void) { - int err; - - stream.zalloc = zalloc; - stream.zfree = zfree; - stream.next_in = 0; - stream.avail_in = 0; - -#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG) - stream.outcb = (cb_func) WATCHDOG_RESET; -#else - stream.outcb = Z_NULL; -#endif /* CONFIG_HW_WATCHDOG */ - - err = inflateInit (&stream); - if (err != Z_OK) { - printf ("Error: inflateInit2() returned %d\n", err); - return -1; + if (!initialized++) { + stream.workspace = malloc(zlib_inflate_workspacesize()); + if ( !stream.workspace ) { + initialized = 0; + return -ENOMEM; + } + stream.next_in = NULL; + stream.avail_in = 0; + zlib_inflateInit(&stream); } - return 0; } -int cramfs_uncompress_exit (void) +void cramfs_uncompress_exit(void) { - inflateEnd (&stream); - return 0; + if (!--initialized) { + zlib_inflateEnd(&stream); + vfree(stream.workspace); + } } diff --git a/include/cramfs/cramfs_fs.h b/include/cramfs/cramfs_fs.h index 3d3c56f..af2940b 100644 --- a/include/cramfs/cramfs_fs.h +++ b/include/cramfs/cramfs_fs.h @@ -119,8 +119,8 @@ #endif /* Uncompression interfaces to the underlying zlib */ -int cramfs_uncompress_block(void *dst, void *src, int srclen); +int cramfs_uncompress_block(void *dst, int dstlen, void *src, int srclen); int cramfs_uncompress_init(void); -int cramfs_uncompress_exit(void); +void cramfs_uncompress_exit(void); #endif /* __CRAMFS_H */