[PATCH] fix cramfs support broken since zlib update
Sascha Hauer
s.hauer at pengutronix.de
Mon Dec 5 09:20:16 EST 2011
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 at pengutronix.de>
---
fs/cramfs/cramfs.c | 2 +-
fs/cramfs/uncompress.c | 93 ++++++++++++++++---------------------------
include/cramfs/cramfs_fs.h | 4 +-
3 files changed, 38 insertions(+), 61 deletions(-)
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 @@ 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 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 <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);
+ }
}
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 @@ struct cramfs_super {
#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 */
--
1.7.7.3
More information about the barebox
mailing list