summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2011-12-05 15:19:24 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2011-12-05 15:19:26 +0100
commit35869a211f3f5afc8c7bb16c28d62acea3842161 (patch)
treedda0e83cea01f013dc2c13008f0fdb586f6dbd17 /fs
parent36c47ce426cbe7aea59fab4c0218fe07cd80bdc0 (diff)
downloadbarebox-35869a211f3f5afc8c7bb16c28d62acea3842161.tar.gz
barebox-35869a211f3f5afc8c7bb16c28d62acea3842161.tar.xz
fix cramfs support broken since zlib update
cramfs does not compile since we updated zlib to the kernel version. Fix this by using the kernel version of uncompress.c Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'fs')
-rw-r--r--fs/cramfs/cramfs.c2
-rw-r--r--fs/cramfs/uncompress.c93
2 files changed, 36 insertions, 59 deletions
diff --git a/fs/cramfs/cramfs.c b/fs/cramfs/cramfs.c
index b9ab50f432..bdbb47ecf2 100644
--- a/fs/cramfs/cramfs.c
+++ b/fs/cramfs/cramfs.c
@@ -337,7 +337,7 @@ static int cramfs_read(struct device_d *_dev, FILE *f, void *buf, size_t size)
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 659869bfe4..b7887bd654 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 <common.h>
#include <malloc.h>
-#include <watchdog.h>
-#include <zlib.h>
+#include <linux/kernel.h>
+#include <errno.h>
+#include <linux/zlib.h>
+#include <asm/byteorder.h>
+#include <cramfs/cramfs_fs.h>
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);
+ }
}