From: Jared Hulbert <jaredeh@gmail.com>
To: Linux-kernel@vger.kernel.org, linux-embedded@vger.kernel.org,
linux-mtd <linux-mtd@lists.infradead.org>,
"Jörn Engel" <joern@logfs.org>,
tim.bird@AM.SONY.COM, cotte@d
Subject: [PATCH 10/10] AXFS: axfs_uncompress.c
Date: Wed, 20 Aug 2008 22:46:14 -0700 [thread overview]
Message-ID: <48AD0126.1050609@gmail.com> (raw)
Handles the decompression for axfs, modeled after fs/cramfs/uncompress.c.
Signed-off-by: Jared Hulbert <jaredeh@gmail.com>
---
diff --git a/fs/axfs/axfs_uncompress.c b/fs/axfs/axfs_uncompress.c
new file mode 100644
index 0000000..b7a2060
--- /dev/null
+++ b/fs/axfs/axfs_uncompress.c
@@ -0,0 +1,97 @@
+/*
+ * Advanced XIP File System for Linux - AXFS
+ * Readonly, compressed, and XIP filesystem for Linux systems big and small
+ *
+ * Modified in 2006 by Eric Anderson
+ * from the cramfs sources fs/cramfs/uncompress.c
+ *
+ * (C) Copyright 1999 Linus Torvalds
+ *
+ * axfs_uncompress.c -
+ * axfs interfaces to the uncompression library. There's really just
+ * three entrypoints:
+ *
+ * - axfs_uncompress_init() - called to initialize the thing.
+ * - axfs_uncompress_exit() - tell me when you're done
+ * - axfs_uncompress_block() - uncompress a block.
+ *
+ * NOTE NOTE NOTE! The uncompression is entirely single-threaded. We
+ * only have one stream, and we'll initialize it only once even if it
+ * then is used by multiple filesystems.
+ *
+ */
+
+#include <linux/errno.h>
+#include <linux/vmalloc.h>
+#include <linux/zlib.h>
+#include <linux/mutex.h>
+
+static z_stream stream;
+static int initialized;
+static struct mutex axfs_uncmp_mutex;
+
+int axfs_uncompress_block(void *dst, int dstlen, void *src, int srclen)
+{
+ int err;
+ int out;
+
+ mutex_lock(&axfs_uncmp_mutex);
+
+ stream.next_in = src;
+ stream.avail_in = srclen;
+
+ stream.next_out = dst;
+ stream.avail_out = dstlen;
+
+ err = zlib_inflateReset(&stream);
+ if (err != Z_OK) {
+ printk(KERN_ERR "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;
+
+ out = stream.total_out;
+
+ mutex_unlock(&axfs_uncmp_mutex);
+
+ return out;
+
+err:
+
+ mutex_unlock(&axfs_uncmp_mutex);
+
+ printk(KERN_ERR "Error %d while decompressing!\n", err);
+ printk(KERN_ERR "%p(%d)->%p(%d)\n", src, srclen, dst, dstlen);
+ return 0;
+}
+
+int axfs_uncompress_init(void)
+{
+ if (!initialized++) {
+
+ mutex_init(&axfs_uncmp_mutex);
+
+ stream.workspace = vmalloc(zlib_inflate_workspacesize());
+ if (!stream.workspace) {
+ initialized = 0;
+ return -ENOMEM;
+ }
+ stream.next_in = NULL;
+ stream.avail_in = 0;
+ zlib_inflateInit(&stream);
+ }
+ return 0;
+}
+
+int axfs_uncompress_exit(void)
+{
+ if (!--initialized) {
+ zlib_inflateEnd(&stream);
+ vfree(stream.workspace);
+ }
+ return 0;
+}
WARNING: multiple messages have this Message-ID (diff)
From: Jared Hulbert <jaredeh@gmail.com>
To: Linux-kernel@vger.kernel.org, linux-embedded@vger.kernel.org,
linux-mtd <linux-mtd@lists.infradead.org>,
"Jörn Engel" <joern@logfs.org>,
tim.bird@AM.SONY.COM, cotte@de.ibm.com, nickpiggin@yahoo.com.au
Subject: [PATCH 10/10] AXFS: axfs_uncompress.c
Date: Wed, 20 Aug 2008 22:46:14 -0700 [thread overview]
Message-ID: <48AD0126.1050609@gmail.com> (raw)
Handles the decompression for axfs, modeled after fs/cramfs/uncompress.c.
Signed-off-by: Jared Hulbert <jaredeh@gmail.com>
---
diff --git a/fs/axfs/axfs_uncompress.c b/fs/axfs/axfs_uncompress.c
new file mode 100644
index 0000000..b7a2060
--- /dev/null
+++ b/fs/axfs/axfs_uncompress.c
@@ -0,0 +1,97 @@
+/*
+ * Advanced XIP File System for Linux - AXFS
+ * Readonly, compressed, and XIP filesystem for Linux systems big and small
+ *
+ * Modified in 2006 by Eric Anderson
+ * from the cramfs sources fs/cramfs/uncompress.c
+ *
+ * (C) Copyright 1999 Linus Torvalds
+ *
+ * axfs_uncompress.c -
+ * axfs interfaces to the uncompression library. There's really just
+ * three entrypoints:
+ *
+ * - axfs_uncompress_init() - called to initialize the thing.
+ * - axfs_uncompress_exit() - tell me when you're done
+ * - axfs_uncompress_block() - uncompress a block.
+ *
+ * NOTE NOTE NOTE! The uncompression is entirely single-threaded. We
+ * only have one stream, and we'll initialize it only once even if it
+ * then is used by multiple filesystems.
+ *
+ */
+
+#include <linux/errno.h>
+#include <linux/vmalloc.h>
+#include <linux/zlib.h>
+#include <linux/mutex.h>
+
+static z_stream stream;
+static int initialized;
+static struct mutex axfs_uncmp_mutex;
+
+int axfs_uncompress_block(void *dst, int dstlen, void *src, int srclen)
+{
+ int err;
+ int out;
+
+ mutex_lock(&axfs_uncmp_mutex);
+
+ stream.next_in = src;
+ stream.avail_in = srclen;
+
+ stream.next_out = dst;
+ stream.avail_out = dstlen;
+
+ err = zlib_inflateReset(&stream);
+ if (err != Z_OK) {
+ printk(KERN_ERR "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;
+
+ out = stream.total_out;
+
+ mutex_unlock(&axfs_uncmp_mutex);
+
+ return out;
+
+err:
+
+ mutex_unlock(&axfs_uncmp_mutex);
+
+ printk(KERN_ERR "Error %d while decompressing!\n", err);
+ printk(KERN_ERR "%p(%d)->%p(%d)\n", src, srclen, dst, dstlen);
+ return 0;
+}
+
+int axfs_uncompress_init(void)
+{
+ if (!initialized++) {
+
+ mutex_init(&axfs_uncmp_mutex);
+
+ stream.workspace = vmalloc(zlib_inflate_workspacesize());
+ if (!stream.workspace) {
+ initialized = 0;
+ return -ENOMEM;
+ }
+ stream.next_in = NULL;
+ stream.avail_in = 0;
+ zlib_inflateInit(&stream);
+ }
+ return 0;
+}
+
+int axfs_uncompress_exit(void)
+{
+ if (!--initialized) {
+ zlib_inflateEnd(&stream);
+ vfree(stream.workspace);
+ }
+ return 0;
+}
next reply other threads:[~2008-08-21 5:46 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-08-21 5:46 Jared Hulbert [this message]
2008-08-21 5:46 ` [PATCH 10/10] AXFS: axfs_uncompress.c Jared Hulbert
2008-08-21 9:01 ` Sven Wegener
2008-08-21 9:01 ` Sven Wegener
2008-08-21 14:37 ` Jared Hulbert
2008-08-21 14:37 ` Jared Hulbert
2008-08-21 14:53 ` Sven Wegener
2008-08-21 14:53 ` Sven Wegener
2008-08-21 11:40 ` Artem Bityutskiy
2008-08-21 11:40 ` Artem Bityutskiy
2008-08-21 12:28 ` Geert Uytterhoeven
2008-08-21 12:28 ` Geert Uytterhoeven
2008-08-21 14:35 ` Jared Hulbert
2008-08-21 14:35 ` Jared Hulbert
2008-08-29 13:48 ` Geert Uytterhoeven
2008-08-29 13:48 ` Geert Uytterhoeven
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=48AD0126.1050609@gmail.com \
--to=jaredeh@gmail.com \
--cc=Linux-kernel@vger.kernel.org \
--cc=cotte@d \
--cc=joern@logfs.org \
--cc=linux-embedded@vger.kernel.org \
--cc=linux-mtd@lists.infradead.org \
--cc=tim.bird@AM.SONY.COM \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.