packages: kernel/kernel-squashfs-lzma.patch, kernel/kernel.spec - update sq...
arekm
arekm at pld-linux.org
Sun Mar 7 00:16:56 CET 2010
Author: arekm Date: Sat Mar 6 23:16:56 2010 GMT
Module: packages Tag: HEAD
---- Log message:
- update squashfs-lzma
---- Files affected:
packages/kernel:
kernel-squashfs-lzma.patch (1.2 -> 1.3) , kernel.spec (1.762 -> 1.763)
---- Diffs:
================================================================
Index: packages/kernel/kernel-squashfs-lzma.patch
diff -u packages/kernel/kernel-squashfs-lzma.patch:1.2 packages/kernel/kernel-squashfs-lzma.patch:1.3
--- packages/kernel/kernel-squashfs-lzma.patch:1.2 Fri Feb 26 00:09:40 2010
+++ packages/kernel/kernel-squashfs-lzma.patch Sun Mar 7 00:16:51 2010
@@ -1,54 +1,36 @@
-diff --git a/fs/squashfs/Kconfig b/fs/squashfs/Kconfig
-index 25a00d1..7ec5d7e 100644
---- a/fs/squashfs/Kconfig
-+++ b/fs/squashfs/Kconfig
-@@ -26,6 +26,12 @@ config SQUASHFS
-
- If unsure, say N.
-
-+config SQUASHFS_LZMA
-+ bool "Include support for LZMA compressed file systems"
-+ depends on SQUASHFS
-+ select DECOMPRESS_LZMA
-+ select DECOMPRESS_LZMA_NEEDED
-+
- config SQUASHFS_EMBEDDED
-
- bool "Additional option for memory-constrained systems"
-diff --git a/fs/squashfs/Makefile b/fs/squashfs/Makefile
-index 70e3244..45aaefd 100644
+From 6c4419d997d4431bb62e73475cd6b084e83efbd1 Mon Sep 17 00:00:00 2001
+From: Phillip Lougher <phillip at lougher.demon.co.uk>
+Date: Tue, 22 Sep 2009 19:25:24 +0100
+Subject: [PATCH] Squashfs: move zlib decompression wrapper code into a separate file
+
+Signed-off-by: Phillip Lougher <phillip at lougher.demon.co.uk>
+---
+ fs/squashfs/Makefile | 2 +-
+ fs/squashfs/block.c | 74 ++----------------------------
+ fs/squashfs/squashfs.h | 4 ++
+ fs/squashfs/zlib_wrapper.c | 109 ++++++++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 118 insertions(+), 71 deletions(-)
+ create mode 100644 fs/squashfs/zlib_wrapper.c
+
--- a/fs/squashfs/Makefile
+++ b/fs/squashfs/Makefile
-@@ -4,4 +4,5 @@
+@@ -4,4 +4,4 @@
obj-$(CONFIG_SQUASHFS) += squashfs.o
squashfs-y += block.o cache.o dir.o export.o file.o fragment.o id.o inode.o
-squashfs-y += namei.o super.o symlink.o
-+squashfs-y += namei.o super.o symlink.o zlib_wrapper.o decompressor.o
-+squashfs-$(CONFIG_SQUASHFS_LZMA) += lzma_wrapper.o
-diff --git a/fs/squashfs/block.c b/fs/squashfs/block.c
-index 2a79603..6f9914d 100644
++squashfs-y += namei.o super.o symlink.o zlib_wrapper.o
--- a/fs/squashfs/block.c
+++ b/fs/squashfs/block.c
-@@ -29,16 +29,14 @@
+@@ -29,7 +29,6 @@
#include <linux/fs.h>
#include <linux/vfs.h>
#include <linux/slab.h>
-#include <linux/mutex.h>
#include <linux/string.h>
#include <linux/buffer_head.h>
--#include <linux/zlib.h>
-
- #include "squashfs_fs.h"
- #include "squashfs_fs_sb.h"
- #include "squashfs_fs_i.h"
- #include "squashfs.h"
--
-+#include "decompressor.h"
- /*
- * Read the metadata block length, this is stored in the first two
- * bytes of the metadata block.
-@@ -153,72 +151,10 @@ int squashfs_read_data(struct super_block *sb, void **buffer, u64 index,
+ #include <linux/zlib.h>
+@@ -153,72 +152,10 @@ int squashfs_read_data(struct super_bloc
}
if (compressed) {
@@ -118,14 +100,14 @@
- }
- length = msblk->stream.total_out;
- mutex_unlock(&msblk->read_data_mutex);
-+ length = squashfs_decompress(msblk, buffer, bh, b, offset,
-+ length, srclength, pages);
++ length = zlib_uncompress(msblk, buffer, bh, b, offset, length,
++ srclength, pages);
+ if (length < 0)
+ goto read_failure;
} else {
/*
* Block is uncompressed.
-@@ -255,9 +191,6 @@ int squashfs_read_data(struct super_block *sb, void **buffer, u64 index,
+@@ -255,9 +192,6 @@ int squashfs_read_data(struct super_bloc
kfree(bh);
return length;
@@ -135,24 +117,22 @@
block_release:
for (; k < b; k++)
put_bh(bh[k]);
-diff --git a/fs/squashfs/cache.c b/fs/squashfs/cache.c
-index 40c98fa..57314be 100644
---- a/fs/squashfs/cache.c
-+++ b/fs/squashfs/cache.c
-@@ -51,7 +51,6 @@
- #include <linux/sched.h>
- #include <linux/spinlock.h>
- #include <linux/wait.h>
--#include <linux/zlib.h>
- #include <linux/pagemap.h>
+--- a/fs/squashfs/squashfs.h
++++ b/fs/squashfs/squashfs.h
+@@ -70,6 +70,10 @@ extern struct inode *squashfs_iget(struc
+ unsigned int);
+ extern int squashfs_read_inode(struct inode *, long long);
- #include "squashfs_fs.h"
-diff --git a/fs/squashfs/decompressor.c b/fs/squashfs/decompressor.c
-new file mode 100644
-index 0000000..0b6ad9b
++/* zlib_wrapper.c */
++extern int zlib_uncompress(struct squashfs_sb_info *, void **,
++ struct buffer_head **, int, int, int, int, int);
++
+ /*
+ * Inodes and files operations
+ */
--- /dev/null
-+++ b/fs/squashfs/decompressor.c
-@@ -0,0 +1,72 @@
++++ b/fs/squashfs/zlib_wrapper.c
+@@ -0,0 +1,109 @@
+/*
+ * Squashfs - a compressed read only filesystem for Linux
+ *
@@ -173,121 +153,142 @@
+ * along with this program; if not, write to the Free Software
+ * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
-+ * decompressor.c
++ * zlib_wrapper.c
+ */
+
-+#include <linux/types.h>
++
+#include <linux/mutex.h>
+#include <linux/buffer_head.h>
++#include <linux/zlib.h>
+
+#include "squashfs_fs.h"
+#include "squashfs_fs_sb.h"
+#include "squashfs_fs_i.h"
-+#include "decompressor.h"
+#include "squashfs.h"
+
-+/*
-+ * This file (and decompressor.h) implements a decompressor framework for
-+ * Squashfs, allowing multiple decompressors to be easily supported
-+ */
++int zlib_uncompress(struct squashfs_sb_info *msblk, void **buffer,
++ struct buffer_head **bh, int b, int offset, int length, int srclength,
++ int pages)
++{
++ int zlib_err = 0, zlib_init = 0;
++ int avail, bytes, k = 0, page = 0;
+
-+static const struct squashfs_decompressor squashfs_lzma_unsupported_comp_ops = {
-+ NULL, NULL, NULL, LZMA_COMPRESSION, "lzma", 0
-+};
++ mutex_lock(&msblk->read_data_mutex);
+
-+static const struct squashfs_decompressor squashfs_lzo_unsupported_comp_ops = {
-+ NULL, NULL, NULL, LZO_COMPRESSION, "lzo", 0
-+};
++ msblk->stream.avail_out = 0;
++ msblk->stream.avail_in = 0;
+
-+static const struct squashfs_decompressor squashfs_unknown_comp_ops = {
-+ NULL, NULL, NULL, 0, "unknown", 0
-+};
++ bytes = length;
++ do {
++ if (msblk->stream.avail_in == 0 && k < b) {
++ avail = min(bytes, msblk->devblksize - offset);
++ bytes -= avail;
++ wait_on_buffer(bh[k]);
++ if (!buffer_uptodate(bh[k]))
++ goto release_mutex;
+
-+static const struct squashfs_decompressor *decompressor[] = {
-+ &squashfs_zlib_comp_ops,
-+#ifdef CONFIG_SQUASHFS_LZMA
-+ &squashfs_lzma_comp_ops,
-+#else
-+ &squashfs_lzma_unsupported_comp_ops,
-+#endif
-+ &squashfs_lzo_unsupported_comp_ops,
-+ &squashfs_unknown_comp_ops
-+};
++ if (avail == 0) {
++ offset = 0;
++ put_bh(bh[k++]);
++ continue;
++ }
+
++ msblk->stream.next_in = bh[k]->b_data + offset;
++ msblk->stream.avail_in = avail;
++ offset = 0;
++ }
+
-+const struct squashfs_decompressor *squashfs_lookup_decompressor(int id)
-+{
-+ int i;
++ if (msblk->stream.avail_out == 0 && page < pages) {
++ msblk->stream.next_out = buffer[page++];
++ msblk->stream.avail_out = PAGE_CACHE_SIZE;
++ }
+
-+ for (i = 0; decompressor[i]->id; i++)
-+ if (id == decompressor[i]->id)
-+ break;
++ if (!zlib_init) {
++ zlib_err = zlib_inflateInit(&msblk->stream);
++ if (zlib_err != Z_OK) {
++ ERROR("zlib_inflateInit returned unexpected "
++ "result 0x%x, srclength %d\n",
++ zlib_err, srclength);
++ goto release_mutex;
++ }
++ zlib_init = 1;
++ }
+
-+ return decompressor[i];
-+}
-diff --git a/fs/squashfs/decompressor.h b/fs/squashfs/decompressor.h
-new file mode 100644
-index 0000000..7425f80
---- /dev/null
-+++ b/fs/squashfs/decompressor.h
-@@ -0,0 +1,55 @@
-+#ifndef DECOMPRESSOR_H
-+#define DECOMPRESSOR_H
-+/*
-+ * Squashfs - a compressed read only filesystem for Linux
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
-+ * Phillip Lougher <phillip at lougher.demon.co.uk>
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * as published by the Free Software Foundation; either version 2,
-+ * or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-+ *
-+ * decompressor.h
-+ */
++ zlib_err = zlib_inflate(&msblk->stream, Z_SYNC_FLUSH);
+
-+struct squashfs_decompressor {
-+ void *(*init)(struct squashfs_sb_info *);
-+ void (*free)(void *);
-+ int (*decompress)(struct squashfs_sb_info *, void **,
-+ struct buffer_head **, int, int, int, int, int);
-+ int id;
-+ char *name;
-+ int supported;
-+};
++ if (msblk->stream.avail_in == 0 && k < b)
++ put_bh(bh[k++]);
++ } while (zlib_err == Z_OK);
+
-+static inline void *squashfs_decompressor_init(struct squashfs_sb_info *msblk)
-+{
-+ return msblk->decompressor->init(msblk);
-+}
++ if (zlib_err != Z_STREAM_END) {
++ ERROR("zlib_inflate error, data probably corrupt\n");
++ goto release_mutex;
++ }
+
-+static inline void squashfs_decompressor_free(struct squashfs_sb_info *msblk,
-+ void *s)
-+{
-+ if (msblk->decompressor)
-+ msblk->decompressor->free(s);
-+}
++ zlib_err = zlib_inflateEnd(&msblk->stream);
++ if (zlib_err != Z_OK) {
++ ERROR("zlib_inflate error, data probably corrupt\n");
++ goto release_mutex;
++ }
+
-+static inline int squashfs_decompress(struct squashfs_sb_info *msblk,
-+ void **buffer, struct buffer_head **bh, int b, int offset, int length,
-+ int srclength, int pages)
-+{
-+ return msblk->decompressor->decompress(msblk, buffer, bh, b, offset,
-+ length, srclength, pages);
++ mutex_unlock(&msblk->read_data_mutex);
++ return msblk->stream.total_out;
++
++release_mutex:
++ mutex_unlock(&msblk->read_data_mutex);
++
++ for (; k < b; k++)
++ put_bh(bh[k]);
++
++ return -EIO;
+}
-+#endif
-diff --git a/fs/squashfs/dir.c b/fs/squashfs/dir.c
-index 566b0ea..12b933a 100644
+From 37c44e85fd49676ec15ccaeea065662c1fbcda7d Mon Sep 17 00:00:00 2001
+From: Phillip Lougher <phillip at lougher.demon.co.uk>
+Date: Wed, 23 Sep 2009 19:04:49 +0100
+Subject: [PATCH] Squashfs: Factor out remaining zlib dependencies into separate wrapper file
+
+Move zlib buffer init/destroy code into separate wrapper file. Also
+make zlib z_stream field a void * removing the need to include zlib.h
+for most files.
+
+Signed-off-by: Phillip Lougher <phillip at lougher.demon.co.uk>
+---
+ fs/squashfs/block.c | 1 -
+ fs/squashfs/cache.c | 1 -
+ fs/squashfs/dir.c | 1 -
+ fs/squashfs/export.c | 1 -
+ fs/squashfs/file.c | 1 -
+ fs/squashfs/fragment.c | 1 -
+ fs/squashfs/id.c | 1 -
+ fs/squashfs/inode.c | 1 -
+ fs/squashfs/namei.c | 1 -
+ fs/squashfs/squashfs.h | 2 +
+ fs/squashfs/squashfs_fs_sb.h | 2 +-
+ fs/squashfs/super.c | 14 +++------
+ fs/squashfs/symlink.c | 1 -
+ fs/squashfs/zlib_wrapper.c | 56 ++++++++++++++++++++++++++++++++---------
+ 14 files changed, 51 insertions(+), 33 deletions(-)
+
+--- a/fs/squashfs/block.c
++++ b/fs/squashfs/block.c
+@@ -31,7 +31,6 @@
+ #include <linux/slab.h>
+ #include <linux/string.h>
+ #include <linux/buffer_head.h>
+-#include <linux/zlib.h>
+
+ #include "squashfs_fs.h"
+ #include "squashfs_fs_sb.h"
+--- a/fs/squashfs/cache.c
++++ b/fs/squashfs/cache.c
+@@ -51,7 +51,6 @@
+ #include <linux/sched.h>
+ #include <linux/spinlock.h>
+ #include <linux/wait.h>
+-#include <linux/zlib.h>
+ #include <linux/pagemap.h>
+
+ #include "squashfs_fs.h"
--- a/fs/squashfs/dir.c
+++ b/fs/squashfs/dir.c
@@ -30,7 +30,6 @@
@@ -298,8 +299,6 @@
#include "squashfs_fs.h"
#include "squashfs_fs_sb.h"
-diff --git a/fs/squashfs/export.c b/fs/squashfs/export.c
-index 2b1b8fe..7f93d5a 100644
--- a/fs/squashfs/export.c
+++ b/fs/squashfs/export.c
@@ -39,7 +39,6 @@
@@ -310,8 +309,6 @@
#include <linux/slab.h>
#include "squashfs_fs.h"
-diff --git a/fs/squashfs/file.c b/fs/squashfs/file.c
-index 717767d..a25c506 100644
--- a/fs/squashfs/file.c
+++ b/fs/squashfs/file.c
@@ -47,7 +47,6 @@
@@ -322,8 +319,6 @@
#include "squashfs_fs.h"
#include "squashfs_fs_sb.h"
-diff --git a/fs/squashfs/fragment.c b/fs/squashfs/fragment.c
-index b5a2c15..7c90bbd 100644
--- a/fs/squashfs/fragment.c
+++ b/fs/squashfs/fragment.c
@@ -36,7 +36,6 @@
@@ -334,8 +329,6 @@
#include "squashfs_fs.h"
#include "squashfs_fs_sb.h"
-diff --git a/fs/squashfs/id.c b/fs/squashfs/id.c
-index 3795b83..b7f64bc 100644
--- a/fs/squashfs/id.c
+++ b/fs/squashfs/id.c
@@ -34,7 +34,6 @@
@@ -346,8 +339,6 @@
#include "squashfs_fs.h"
#include "squashfs_fs_sb.h"
-diff --git a/fs/squashfs/inode.c b/fs/squashfs/inode.c
-index 9101dbd..49daaf6 100644
--- a/fs/squashfs/inode.c
+++ b/fs/squashfs/inode.c
@@ -40,7 +40,6 @@
@@ -358,180 +349,392 @@
#include "squashfs_fs.h"
#include "squashfs_fs_sb.h"
-diff --git a/fs/squashfs/lzma_wrapper.c b/fs/squashfs/lzma_wrapper.c
-new file mode 100644
-index 0000000..9fa617d
---- /dev/null
-+++ b/fs/squashfs/lzma_wrapper.c
-@@ -0,0 +1,151 @@
-+/*
-+ * Squashfs - a compressed read only filesystem for Linux
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
-+ * Phillip Lougher <phillip at lougher.demon.co.uk>
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * as published by the Free Software Foundation; either version 2,
-+ * or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-+ *
-+ * lzma_wrapper.c
-+ */
-+
-+#include <asm/unaligned.h>
-+#include <linux/buffer_head.h>
-+#include <linux/mutex.h>
-+#include <linux/vmalloc.h>
-+#include <linux/decompress/unlzma.h>
-+
-+#include "squashfs_fs.h"
-+#include "squashfs_fs_sb.h"
-+#include "squashfs_fs_i.h"
-+#include "squashfs.h"
-+#include "decompressor.h"
-+
-+struct squashfs_lzma {
-+ void *input;
-+ void *output;
-+};
-+
-+/* decompress_unlzma.c is currently non re-entrant... */
-+DEFINE_MUTEX(lzma_mutex);
-+
-+/* decompress_unlzma.c doesn't provide any context in its callbacks... */
-+static int lzma_error;
-+
-+static void error(char *m)
-+{
-+ ERROR("unlzma error: %s\n", m);
-+ lzma_error = 1;
-+}
-+
-+
-+static void *lzma_init(struct squashfs_sb_info *msblk)
+--- a/fs/squashfs/namei.c
++++ b/fs/squashfs/namei.c
+@@ -57,7 +57,6 @@
+ #include <linux/slab.h>
+ #include <linux/string.h>
+ #include <linux/dcache.h>
+-#include <linux/zlib.h>
+
+ #include "squashfs_fs.h"
+ #include "squashfs_fs_sb.h"
+--- a/fs/squashfs/squashfs.h
++++ b/fs/squashfs/squashfs.h
+@@ -71,6 +71,8 @@ extern struct inode *squashfs_iget(struc
+ extern int squashfs_read_inode(struct inode *, long long);
+
+ /* zlib_wrapper.c */
++extern void *zlib_init(void);
++extern void zlib_free(void *);
+ extern int zlib_uncompress(struct squashfs_sb_info *, void **,
+ struct buffer_head **, int, int, int, int, int);
+
+--- a/fs/squashfs/squashfs_fs_sb.h
++++ b/fs/squashfs/squashfs_fs_sb.h
+@@ -64,7 +64,7 @@ struct squashfs_sb_info {
+ struct mutex read_data_mutex;
+ struct mutex meta_index_mutex;
+ struct meta_index *meta_index;
+- z_stream stream;
++ void *stream;
+ __le64 *inode_lookup_table;
+ u64 inode_table;
+ u64 directory_table;
+--- a/fs/squashfs/super.c
++++ b/fs/squashfs/super.c
+@@ -35,7 +35,6 @@
+ #include <linux/pagemap.h>
+ #include <linux/init.h>
+ #include <linux/module.h>
+-#include <linux/zlib.h>
+ #include <linux/magic.h>
+
+ #include "squashfs_fs.h"
+@@ -87,12 +86,9 @@ static int squashfs_fill_super(struct su
+ }
+ msblk = sb->s_fs_info;
+
+- msblk->stream.workspace = kmalloc(zlib_inflate_workspacesize(),
+- GFP_KERNEL);
+- if (msblk->stream.workspace == NULL) {
+- ERROR("Failed to allocate zlib workspace\n");
++ msblk->stream = zlib_init();
++ if (msblk->stream == NULL)
+ goto failure;
+- }
+
+ sblk = kzalloc(sizeof(*sblk), GFP_KERNEL);
+ if (sblk == NULL) {
+@@ -292,17 +288,17 @@ failed_mount:
+ squashfs_cache_delete(msblk->block_cache);
+ squashfs_cache_delete(msblk->fragment_cache);
+ squashfs_cache_delete(msblk->read_page);
++ zlib_free(msblk->stream);
+ kfree(msblk->inode_lookup_table);
+ kfree(msblk->fragment_index);
+ kfree(msblk->id_table);
+- kfree(msblk->stream.workspace);
+ kfree(sb->s_fs_info);
+ sb->s_fs_info = NULL;
+ kfree(sblk);
+ return err;
+
+ failure:
+- kfree(msblk->stream.workspace);
++ zlib_free(msblk->stream);
+ kfree(sb->s_fs_info);
+ sb->s_fs_info = NULL;
+ return -ENOMEM;
+@@ -346,10 +342,10 @@ static void squashfs_put_super(struct su
+ squashfs_cache_delete(sbi->block_cache);
+ squashfs_cache_delete(sbi->fragment_cache);
+ squashfs_cache_delete(sbi->read_page);
++ zlib_free(sbi->stream);
+ kfree(sbi->id_table);
+ kfree(sbi->fragment_index);
+ kfree(sbi->meta_index);
+- kfree(sbi->stream.workspace);
+ kfree(sb->s_fs_info);
+ sb->s_fs_info = NULL;
+ }
+--- a/fs/squashfs/symlink.c
++++ b/fs/squashfs/symlink.c
+@@ -36,7 +36,6 @@
+ #include <linux/slab.h>
+ #include <linux/string.h>
+ #include <linux/pagemap.h>
+-#include <linux/zlib.h>
+
+ #include "squashfs_fs.h"
+ #include "squashfs_fs_sb.h"
+--- a/fs/squashfs/zlib_wrapper.c
++++ b/fs/squashfs/zlib_wrapper.c
+@@ -31,21 +31,51 @@
+ #include "squashfs_fs_i.h"
+ #include "squashfs.h"
+
++void *zlib_init()
+{
-+ struct squashfs_lzma *stream = kzalloc(sizeof(*stream), GFP_KERNEL);
++ z_stream *stream = kmalloc(sizeof(z_stream), GFP_KERNEL);
+ if (stream == NULL)
+ goto failed;
-+ stream->input = vmalloc(msblk->block_size);
-+ if (stream->input == NULL)
++ stream->workspace = kmalloc(zlib_inflate_workspacesize(),
++ GFP_KERNEL);
++ if (stream->workspace == NULL)
+ goto failed;
<<Diff was trimmed, longer than 597 lines>>
---- CVS-web:
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/kernel/kernel-squashfs-lzma.patch?r1=1.2&r2=1.3&f=u
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/kernel/kernel.spec?r1=1.762&r2=1.763&f=u
More information about the pld-cvs-commit
mailing list