diff options
| author | Richard Purdie <rpurdie@rpsys.net> | 2006-06-18 14:27:20 +0000 |
|---|---|---|
| committer | OpenEmbedded Project <openembedded-devel@lists.openembedded.org> | 2006-06-18 14:27:20 +0000 |
| commit | dbfc7f5cf42dd467ae93d8fd8fc2a489fd04e5ec (patch) | |
| tree | c6e15ee80cf87583a7d468acf3c47634b6cd2492 | |
| parent | e78a46b537ae5fb3a0fec473de26cd38c6ae735a (diff) | |
linux-oz-2.6: Add 2.6.17. Sync changes accross all .bb files. Classify more patches. Fix a logo bug reported by Dirk on Tosa. Rework the poodle patches and remove their hack status.
29 files changed, 20035 insertions, 223 deletions
diff --git a/packages/linux/linux-openzaurus-2.6.16+git/00-hostap.patch b/packages/linux/linux-openzaurus-2.6.16+git/00-hostap.patch new file mode 100644 index 0000000000..20432b404a --- /dev/null +++ b/packages/linux/linux-openzaurus-2.6.16+git/00-hostap.patch @@ -0,0 +1,45 @@ +Platform: Sharp Zaurus C760 running 2.6.16 and pcmciautils 013. + +root@c7x0:~# pccardctl ident +Socket 0: + product info: "Pretec", "CompactWLAN Card 802.11b", "2.5" + manfid: 0x0156, 0x0002 + function: 6 (network) + +========================================================================== +From: Jochen Friedrich + +Yet another card known to work OK with hostap_cs: + +# pccardctl ident +Socket 0: + no product info available +Socket 1: + product info: "U.S. Robotics", "IEEE 802.11b PC-CARD", "Version 01.02", "" + manfid: 0x0156, 0x0002 + function: 6 (network) + +========================================================================== + +Signed-off-by: Marcin Juszkiewicz <openembedded@hrw.one.pl> + + drivers/net/wireless/hostap/hostap_cs.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +Index: linux/drivers/net/wireless/hostap/hostap_cs.c +=================================================================== +--- linux.orig/drivers/net/wireless/hostap/hostap_cs.c 2006-05-17 10:23:00.000000000 +0200 ++++ linux/drivers/net/wireless/hostap/hostap_cs.c 2006-05-17 10:25:45.000000000 +0200 +@@ -923,6 +923,12 @@ + PCMCIA_DEVICE_PROD_ID12( + "ZoomAir 11Mbps High", "Rate wireless Networking", + 0x273fe3db, 0x32a1eaee), ++ PCMCIA_DEVICE_PROD_ID123( ++ "Pretec", "CompactWLAN Card 802.11b", "2.5", ++ 0x1cadd3e5, 0xe697636c, 0x7a5bfcf1), ++ PCMCIA_DEVICE_PROD_ID123( ++ "U.S. Robotics", "IEEE 802.11b PC-CARD", "Version 01.02", ++ 0xc7b8df9d, 0x1700d087, 0x4b74baa0), + PCMCIA_DEVICE_NULL + }; + MODULE_DEVICE_TABLE(pcmcia, hostap_cs_ids); diff --git a/packages/linux/linux-openzaurus-2.6.16+git/10-pcnet.patch b/packages/linux/linux-openzaurus-2.6.16+git/10-pcnet.patch new file mode 100644 index 0000000000..2e1966e837 --- /dev/null +++ b/packages/linux/linux-openzaurus-2.6.16+git/10-pcnet.patch @@ -0,0 +1,27 @@ + +From: Marcin Juszkiewicz <openembedded@hrw.one.pl> + +Add TRENDnet TE-CF100 ethernet adapter to pcnet_cs list. + +product info: "Fast Ethernet", "CF Size PC Card", "1.0", "" + manfid: 0x0149, 0xc1ab + +Signed-off-by: Marcin Juszkiewicz <openembedded@hrw.one.pl> + + drivers/net/pcmcia/pcnet_cs.c | 2 ++ + 1 file changed, 2 insertions(+) + +Index: netdev-2.6/drivers/net/pcmcia/pcnet_cs.c +=================================================================== +--- netdev-2.6.orig/drivers/net/pcmcia/pcnet_cs.c 2006-05-18 11:06:43.294022480 +0200 ++++ netdev-2.6/drivers/net/pcmcia/pcnet_cs.c 2006-05-18 11:10:31.548322552 +0200 +@@ -1768,6 +1768,8 @@ + PCMCIA_DEVICE_CIS_PROD_ID12("NDC", "Ethernet", 0x01c43ae1, 0x00b2e941, "NE2K.cis"), + PCMCIA_DEVICE_CIS_PROD_ID12("PMX ", "PE-200", 0x34f3f1c8, 0x10b59f8c, "PE-200.cis"), + PCMCIA_DEVICE_CIS_PROD_ID12("TAMARACK", "Ethernet", 0xcf434fba, 0x00b2e941, "tamarack.cis"), ++ PCMCIA_DEVICE_PROD_ID123("Fast Ethernet", "CF Size PC Card", "1.0", ++ 0xb4be14e3, 0x43ac239b, 0x0877b627), + PCMCIA_DEVICE_NULL + }; + MODULE_DEVICE_TABLE(pcmcia, pcnet_ids); + diff --git a/packages/linux/linux-openzaurus-2.6.16+git/24-hostap_cs_id.diff b/packages/linux/linux-openzaurus-2.6.16+git/24-hostap_cs_id.diff deleted file mode 100644 index b90ead9e4f..0000000000 --- a/packages/linux/linux-openzaurus-2.6.16+git/24-hostap_cs_id.diff +++ /dev/null @@ -1,107 +0,0 @@ -Add more IDs for PCMCIA cards - -From: Pavel Roskin <proski@gnu.org> - -Add string IDs for cards that were covered by 0x0156,0x0002, which is no -longer used in hostap_cs due to conflict with Orinoco cards. - -Also add more IDs for cards that are supported by linux-wlan-ng. Thanks -to Arnold Schulz <arnysch@gmx.net> for providing the list. - -Signed-off-by: Pavel Roskin <proski@gnu.org> ---- - - drivers/net/wireless/hostap/hostap_cs.c | 46 +++++++++++++++++++++++++++++++ - 1 files changed, 46 insertions(+), 0 deletions(-) - -diff --git a/drivers/net/wireless/hostap/hostap_cs.c b/drivers/net/wireless/hostap/hostap_cs.c -index 55bed92..9ac1aec 100644 ---- a/drivers/net/wireless/hostap/hostap_cs.c -+++ b/drivers/net/wireless/hostap/hostap_cs.c -@@ -832,9 +832,11 @@ static int hostap_cs_resume(struct pcmci - static struct pcmcia_device_id hostap_cs_ids[] = { - PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7100), - PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7300), -+ PCMCIA_DEVICE_MANF_CARD(0x0089, 0x0002), - PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0777), - PCMCIA_DEVICE_MANF_CARD(0x0126, 0x8000), - PCMCIA_DEVICE_MANF_CARD(0x0138, 0x0002), -+ PCMCIA_DEVICE_MANF_CARD(0x01ff, 0x0008), - PCMCIA_DEVICE_MANF_CARD(0x0250, 0x0002), - PCMCIA_DEVICE_MANF_CARD(0x026f, 0x030b), - PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1612), -@@ -844,7 +846,10 @@ static struct pcmcia_device_id hostap_cs - PCMCIA_DEVICE_MANF_CARD(0x02d2, 0x0001), - PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x0001), - PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x7300), -+ PCMCIA_DEVICE_MANF_CARD(0x9005, 0x0021), -+ PCMCIA_DEVICE_MANF_CARD(0xc001, 0x0008), - PCMCIA_DEVICE_MANF_CARD(0xc00f, 0x0000), -+ PCMCIA_DEVICE_MANF_CARD(0xc250, 0x0002), - PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0002), - PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0005), - PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0010), -@@ -862,22 +867,63 @@ static struct pcmcia_device_id hostap_cs - "Addtron", "AWP-100 Wireless PCMCIA", "Version 01.02", - 0xe6ec52ce, 0x08649af2, 0x4b74baa0), - PCMCIA_DEVICE_PROD_ID123( -+ "Belkin", "11Mbps Wireless Notebook Network Adapter", -+ "Version 01.02", 0x3805a391, 0xad4c7744, 0x4b74baa0), -+ PCMCIA_DEVICE_PROD_ID123( - "D", "Link DWL-650 11Mbps WLAN Card", "Version 01.02", - 0x71b18589, 0xb6f1b0ab, 0x4b74baa0), - PCMCIA_DEVICE_PROD_ID123( - "Instant Wireless ", " Network PC CARD", "Version 01.02", - 0x11d901af, 0x6e9bd926, 0x4b74baa0), - PCMCIA_DEVICE_PROD_ID123( -+ "Intersil", "PRISM Freedom PCMCIA Adapter", "ISL37100P", -+ 0x4b801a17, 0xf222ec2d, 0x630d52b2), -+ PCMCIA_DEVICE_PROD_ID123( -+ "OEM", "PRISM2 IEEE 802.11 PC-Card", "Version 01.02", -+ 0xfea54c90, 0x48f2bdd6, 0x4b74baa0), -+ PCMCIA_DEVICE_PROD_ID123( -+ "Pretec", "CompactWLAN Card 802.11b", "2.5", -+ 0x1cadd3e5, 0xe697636c, 0x7a5bfcf1), -+ PCMCIA_DEVICE_PROD_ID123( - "SMC", "SMC2632W", "Version 01.02", - 0xc4f8b18b, 0x474a1f2a, 0x4b74baa0), -+ PCMCIA_DEVICE_PROD_ID123( -+ "The Linksys Group, Inc.", "Instant Wireless Network PC Card", -+ "ISL37300P", 0xa5f472c2, 0x590eb502, 0xc9049a39), -+ PCMCIA_DEVICE_PROD_ID123( -+ "U.S. Robotics", "IEEE 802.11b PC-CARD", "Version 01.02", -+ 0xc7b8df9d, 0x1700d087, 0x4b74baa0), -+ PCMCIA_DEVICE_PROD_ID12("ASUS", "802_11b_PC_CARD_25", -+ 0x78fc06ee, 0xdb9aa842), -+ PCMCIA_DEVICE_PROD_ID12("ASUS", "802_11B_CF_CARD_25", -+ 0x78fc06ee, 0x45a50c1e), - PCMCIA_DEVICE_PROD_ID12("BUFFALO", "WLI-CF-S11G", - 0x2decece3, 0x82067c18), - PCMCIA_DEVICE_PROD_ID12("Compaq", "WL200_11Mbps_Wireless_PCI_Card", - 0x54f7c49c, 0x15a75e5b), -+ PCMCIA_DEVICE_PROD_ID12("corega K.K.", "Wireless LAN PCC-11", -+ 0x5261440f, 0xa6405584), -+ PCMCIA_DEVICE_PROD_ID12("corega K.K.", "Wireless LAN PCCA-11", -+ 0x5261440f, 0xdf6115f9), -+ PCMCIA_DEVICE_PROD_ID12("D", "Link DRC-650 11Mbps WLAN Card", -+ 0x71b18589, 0xf144e3ac), -+ PCMCIA_DEVICE_PROD_ID12("Digital Data Communications", "WPC-0100", -+ 0xfdd73470, 0xe0b6f146), - PCMCIA_DEVICE_PROD_ID12("INTERSIL", "HFA384x/IEEE", - 0x74c5e40d, 0xdb472a18), -+ PCMCIA_DEVICE_PROD_ID12("LeArtery", -+ "SYNCBYAIR 11Mbps Wireless LAN PC Card", -+ 0x7e3b326a, 0x49893e92), - PCMCIA_DEVICE_PROD_ID12("Linksys", "Wireless CompactFlash Card", - 0x0733cc81, 0x0c52f395), -+ PCMCIA_DEVICE_PROD_ID12("NETGEAR MA401 Wireless PC", "Card", -+ 0xa37434e9, 0x9762e8f1), -+ PCMCIA_DEVICE_PROD_ID12("OTC", "Wireless AirEZY 2411-PCC WLAN Card", -+ 0x4ac44287, 0x235a6bed), -+ PCMCIA_DEVICE_PROD_ID12("PLANEX", "GeoWave/GW-CF110", -+ 0x209f40ab, 0xd9715264), -+ PCMCIA_DEVICE_PROD_ID12("PLANEX", "GeoWave/GW-NS110", -+ 0x209f40ab, 0x46263178), - PCMCIA_DEVICE_PROD_ID12( - "ZoomAir 11Mbps High", "Rate wireless Networking", - 0x273fe3db, 0x32a1eaee), diff --git a/packages/linux/linux-openzaurus-2.6.16+git/rmk-mmc1.patch b/packages/linux/linux-openzaurus-2.6.16+git/rmk-mmc1.patch deleted file mode 100644 index 054b48d28d..0000000000 --- a/packages/linux/linux-openzaurus-2.6.16+git/rmk-mmc1.patch +++ /dev/null @@ -1,61 +0,0 @@ - -The CSD contains a "read2write factor" which determines the multiplier to -be applied to the read timeout to obtain the write timeout. We were -ignoring this parameter, resulting in the possibility for writes being -timed out too early. - -Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> - -diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c ---- a/drivers/mmc/mmc.c -+++ b/drivers/mmc/mmc.c -@@ -549,6 +549,7 @@ static void mmc_decode_csd(struct mmc_ca - csd->read_partial = UNSTUFF_BITS(resp, 79, 1); - csd->write_misalign = UNSTUFF_BITS(resp, 78, 1); - csd->read_misalign = UNSTUFF_BITS(resp, 77, 1); -+ csd->r2w_factor = UNSTUFF_BITS(resp, 26, 3); - csd->write_blkbits = UNSTUFF_BITS(resp, 22, 4); - csd->write_partial = UNSTUFF_BITS(resp, 21, 1); - } else { -@@ -583,6 +584,7 @@ static void mmc_decode_csd(struct mmc_ca - csd->read_partial = UNSTUFF_BITS(resp, 79, 1); - csd->write_misalign = UNSTUFF_BITS(resp, 78, 1); - csd->read_misalign = UNSTUFF_BITS(resp, 77, 1); -+ csd->r2w_factor = UNSTUFF_BITS(resp, 26, 3); - csd->write_blkbits = UNSTUFF_BITS(resp, 22, 4); - csd->write_partial = UNSTUFF_BITS(resp, 21, 1); - } -diff --git a/drivers/mmc/mmc_block.c b/drivers/mmc/mmc_block.c ---- a/drivers/mmc/mmc_block.c -+++ b/drivers/mmc/mmc_block.c -@@ -187,6 +187,12 @@ static int mmc_blk_issue_rq(struct mmc_q - brq.cmd.opcode = MMC_WRITE_BLOCK; - brq.data.flags |= MMC_DATA_WRITE; - brq.data.blocks = 1; -+ -+ /* -+ * Scale up the timeout by the r2w factor -+ */ -+ brq.data.timeout_ns <<= card->csd.r2w_factor; -+ brq.data.timeout_clks <<= card->csd.r2w_factor; - } - - if (brq.data.blocks > 1) { -diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h ---- a/include/linux/mmc/card.h -+++ b/include/linux/mmc/card.h -@@ -28,6 +28,7 @@ struct mmc_csd { - unsigned short cmdclass; - unsigned short tacc_clks; - unsigned int tacc_ns; -+ unsigned int r2w_factor; - unsigned int max_dtr; - unsigned int read_blkbits; - unsigned int write_blkbits; - - -------------------------------------------------------------------- -List admin: http://lists.arm.linux.org.uk/mailman/listinfo/linux-arm-kernel -FAQ: http://www.arm.linux.org.uk/mailinglists/faq.php -Etiquette: http://www.arm.linux.org.uk/mailinglists/etiquette.php - diff --git a/packages/linux/linux-openzaurus-2.6.16+git/rmk-mmc2.patch b/packages/linux/linux-openzaurus-2.6.16+git/rmk-mmc2.patch deleted file mode 100644 index cef02436d6..0000000000 --- a/packages/linux/linux-openzaurus-2.6.16+git/rmk-mmc2.patch +++ /dev/null @@ -1,26 +0,0 @@ - -Always send a stop command at the end of a data transfer. If we avoid -sending the stop command, some cards remain in data transfer mode, and -refuse to accept further read/write commands. - -Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> - -diff --git a/drivers/mmc/pxamci.c b/drivers/mmc/pxamci.c ---- a/drivers/mmc/pxamci.c -+++ b/drivers/mmc/pxamci.c -@@ -291,7 +291,7 @@ static int pxamci_data_done(struct pxamc - pxamci_disable_irq(host, DATA_TRAN_DONE); - - host->data = NULL; -- if (host->mrq->stop && data->error == MMC_ERR_NONE) { -+ if (host->mrq->stop) { - pxamci_stop_clock(host); - pxamci_start_cmd(host, host->mrq->stop, 0); - } else { - - -------------------------------------------------------------------- -List admin: http://lists.arm.linux.org.uk/mailman/listinfo/linux-arm-kernel -FAQ: http://www.arm.linux.org.uk/mailinglists/faq.php -Etiquette: http://www.arm.linux.org.uk/mailinglists/etiquette.php - diff --git a/packages/linux/linux-openzaurus-2.6.16+git/squashfs3.0-2.6.15.patch b/packages/linux/linux-openzaurus-2.6.16+git/squashfs3.0-2.6.15.patch new file mode 100644 index 0000000000..f88dbbae8e --- /dev/null +++ b/packages/linux/linux-openzaurus-2.6.16+git/squashfs3.0-2.6.15.patch @@ -0,0 +1,4173 @@ +diff --new-file -urp linux-2.6.15/fs/Kconfig linux-2.6.15-squashfs3.0/fs/Kconfig +--- linux-2.6.15/fs/Kconfig 2006-03-01 22:37:27.000000000 +0000 ++++ linux-2.6.15-squashfs3.0/fs/Kconfig 2006-03-07 21:12:37.000000000 +0000 +@@ -1151,6 +1151,71 @@ config CRAMFS + + If unsure, say N. + ++config SQUASHFS ++ tristate "SquashFS 3.0 - Squashed file system support" ++ select ZLIB_INFLATE ++ help ++ Saying Y here includes support for SquashFS 3.0 (a Compressed Read-Only File ++ System). Squashfs is a highly compressed read-only filesystem for Linux. ++ It uses zlib compression to compress both files, inodes and directories. ++ Inodes in the system are very small and all blocks are packed to minimise ++ data overhead. Block sizes greater than 4K are supported up to a maximum of 64K. ++ SquashFS 3.0 supports 64 bit filesystems and files (larger than 4GB), full ++ uid/gid information, hard links and timestamps. ++ ++ Squashfs is intended for general read-only filesystem use, for archival ++ use (i.e. in cases where a .tar.gz file may be used), and in embedded ++ systems where low overhead is needed. Further information and filesystem tools ++ are available from http://squashfs.sourceforge.net. ++ ++ If you want to compile this as a module ( = code which can be ++ inserted in and removed from the running kernel whenever you want), ++ say M here and read <file:Documentation/modules.txt>. The module ++ will be called squashfs. Note that the root file system (the one ++ containing the directory /) cannot be compiled as a module. ++ ++ If unsure, say N. ++ ++config SQUASHFS_EMBEDDED ++ ++ bool "Additional options for memory-constrained systems" ++ depends on SQUASHFS ++ default n ++ help ++ Saying Y here allows you to specify cache sizes and how Squashfs ++ allocates memory. This is only intended for memory constrained ++ systems. ++ ++ If unsure, say N. ++ ++config SQUASHFS_FRAGMENT_CACHE_SIZE ++ int "Number of fragments cached" if SQUASHFS_EMBEDDED ++ depends on SQUASHFS ++ default "3" ++ help ++ By default SquashFS caches the last 3 fragments read from ++ the filesystem. Increasing this amount may mean SquashFS ++ has to re-read fragments less often from disk, at the expense ++ of extra system memory. Decreasing this amount will mean ++ SquashFS uses less memory at the expense of extra reads from disk. ++ ++ Note there must be at least one cached fragment. Anything ++ much more than three will probably not make much difference. ++ ++config SQUASHFS_VMALLOC ++ bool "Use Vmalloc rather than Kmalloc" if SQUASHFS_EMBEDDED ++ depends on SQUASHFS ++ default n ++ help ++ By default SquashFS uses kmalloc to obtain fragment cache memory. ++ Kmalloc memory is the standard kernel allocator, but it can fail ++ on memory constrained systems. Because of the way Vmalloc works, ++ Vmalloc can succeed when kmalloc fails. Specifying this option ++ will make SquashFS always use Vmalloc to allocate the ++ fragment cache memory. ++ ++ If unsure, say N. ++ + config VXFS_FS + tristate "FreeVxFS file system support (VERITAS VxFS(TM) compatible)" + help +diff --new-file -urp linux-2.6.15/fs/Makefile linux-2.6.15-squashfs3.0/fs/Makefile +--- linux-2.6.15/fs/Makefile 2006-03-01 22:37:27.000000000 +0000 ++++ linux-2.6.15-squashfs3.0/fs/Makefile 2006-03-07 21:12:37.000000000 +0000 +@@ -55,6 +55,7 @@ obj-$(CONFIG_EXT3_FS) += ext3/ # Before + obj-$(CONFIG_JBD) += jbd/ + obj-$(CONFIG_EXT2_FS) += ext2/ + obj-$(CONFIG_CRAMFS) += cramfs/ ++obj-$(CONFIG_SQUASHFS) += squashfs/ + obj-$(CONFIG_RAMFS) += ramfs/ + obj-$(CONFIG_HUGETLBFS) += hugetlbfs/ + obj-$(CONFIG_CODA_FS) += coda/ +diff --new-file -urp linux-2.6.15/fs/squashfs/inode.c linux-2.6.15-squashfs3.0/fs/squashfs/inode.c +--- linux-2.6.15/fs/squashfs/inode.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.15-squashfs3.0/fs/squashfs/inode.c 2006-03-07 21:12:37.000000000 +0000 +@@ -0,0 +1,2127 @@ ++/* ++ * Squashfs - a compressed read only filesystem for Linux ++ * ++ * Copyright (c) 2002, 2003, 2004, 2005, 2006 ++ * Phillip Lougher <phillip@lougher.org.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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ * ++ * inode.c ++ */ ++ ++#include <linux/types.h> ++#include <linux/squashfs_fs.h> ++#include <linux/module.h> ++#include <linux/errno.h> ++#include <linux/slab.h> ++#include <linux/fs.h> ++#include <linux/smp_lock.h> ++#include <linux/slab.h> ++#include <linux/squashfs_fs_sb.h> ++#include <linux/squashfs_fs_i.h> ++#include <linux/buffer_head.h> ++#include <linux/vfs.h> ++#include <linux/init.h> ++#include <linux/dcache.h> ++#include <linux/wait.h> ++#include <linux/zlib.h> ++#include <linux/blkdev.h> ++#include <linux/vmalloc.h> ++#include <asm/uaccess.h> ++#include <asm/semaphore.h> ++ ++#include "squashfs.h" ++ ++static void squashfs_put_super(struct super_block *); ++static int squashfs_statfs(struct super_block *, struct kstatfs *); ++static int squashfs_symlink_readpage(struct file *file, struct page *page); ++static int squashfs_readpage(struct file *file, struct page *page); ++static int squashfs_readpage4K(struct file *file, struct page *page); ++static int squashfs_readdir(struct file *, void *, filldir_t); ++static struct inode *squashfs_alloc_inode(struct super_block *sb); ++static void squashfs_destroy_inode(struct inode *inode); ++static int init_inodecache(void); ++static void destroy_inodecache(void); ++static struct dentry *squashfs_lookup(struct inode *, struct dentry *, ++ struct nameidata *); ++static struct inode *squashfs_iget(struct super_block *s, squashfs_inode_t inode); ++static long long read_blocklist(struct inode *inode, int index, ++ int readahead_blks, char *block_list, ++ unsigned short **block_p, unsigned int *bsize); ++static struct super_block *squashfs_get_sb(struct file_system_type *, int, ++ const char *, void *); ++ ++ ++static z_stream stream; ++ ++static struct file_system_type squashfs_fs_type = { ++ .owner = THIS_MODULE, ++ .name = "squashfs", ++ .get_sb = squashfs_get_sb, ++ .kill_sb = kill_block_super, ++ .fs_flags = FS_REQUIRES_DEV ++}; ++ ++static unsigned char squashfs_filetype_table[] = { ++ DT_UNKNOWN, DT_DIR, DT_REG, DT_LNK, DT_BLK, DT_CHR, DT_FIFO, DT_SOCK ++}; ++ ++static struct super_operations squashfs_ops = { ++ .alloc_inode = squashfs_alloc_inode, ++ .destroy_inode = squashfs_destroy_inode, ++ .statfs = squashfs_statfs, ++ .put_super = squashfs_put_super, ++}; ++ ++SQSH_EXTERN struct address_space_operations squashfs_symlink_aops = { ++ .readpage = squashfs_symlink_readpage ++}; ++ ++SQSH_EXTERN struct address_space_operations squashfs_aops = { ++ .readpage = squashfs_readpage ++}; ++ ++SQSH_EXTERN struct address_space_operations squashfs_aops_4K = { ++ .readpage = squashfs_readpage4K ++}; ++ ++static struct file_operations squashfs_dir_ops = { ++ .read = generic_read_dir, ++ .readdir = squashfs_readdir ++}; ++ ++SQSH_EXTERN struct inode_operations squashfs_dir_inode_ops = { ++ .lookup = squashfs_lookup ++}; ++ ++ ++static struct buffer_head *get_block_length(struct super_block *s, ++ int *cur_index, int *offset, int *c_byte) ++{ ++ struct squashfs_sb_info *msblk = s->s_fs_info; ++ unsigned short temp; ++ struct buffer_head *bh; ++ ++ if (!(bh = sb_bread(s, *cur_index))) ++ goto out; ++ ++ if (msblk->devblksize - *offset == 1) { ++ if (msblk->swap) ++ ((unsigned char *) &temp)[1] = *((unsigned char *) ++ (bh->b_data + *offset)); ++ else ++ ((unsigned char *) &temp)[0] = *((unsigned char *) ++ (bh->b_data + *offset)); ++ brelse(bh); ++ if (!(bh = sb_bread(s, ++(*cur_index)))) ++ goto out; ++ if (msblk->swap) ++ ((unsigned char *) &temp)[0] = *((unsigned char *) ++ bh->b_data); ++ else ++ ((unsigned char *) &temp)[1] = *((unsigned char *) ++ bh->b_data); ++ *c_byte = temp; ++ *offset = 1; ++ } else { ++ if (msblk->swap) { ++ ((unsigned char *) &temp)[1] = *((unsigned char *) ++ (bh->b_data + *offset)); ++ ((unsigned char *) &temp)[0] = *((unsigned char *) ++ (bh->b_data + *offset + 1)); ++ } else { ++ ((unsigned char *) &temp)[0] = *((unsigned char *) ++ (bh->b_data + *offset)); ++ ((unsigned char *) &temp)[1] = *((unsigned char *) ++ (bh->b_data + *offset + 1)); ++ } ++ *c_byte = temp; ++ *offset += 2; ++ } ++ ++ if (SQUASHFS_CHECK_DATA(msblk->sblk.flags)) { ++ if (*offset == msblk->devblksize) { ++ brelse(bh); ++ if (!(bh = sb_bread(s, ++(*cur_index)))) ++ goto out; ++ *offset = 0; ++ } ++ if (*((unsigned char *) (bh->b_data + *offset)) != ++ SQUASHFS_MARKER_BYTE) { ++ ERROR("Metadata block marker corrupt @ %x\n", ++ *cur_index); ++ brelse(bh); ++ goto out; ++ } ++ (*offset)++; ++ } ++ return bh; ++ ++out: ++ return NULL; ++} ++ ++ ++SQSH_EXTERN unsigned int squashfs_read_data(struct super_block *s, char *buffer, ++ long long index, unsigned int length, ++ long long *next_index) ++{ ++ struct squashfs_sb_info *msblk = s->s_fs_info; ++ struct buffer_head *bh[((SQUASHFS_FILE_MAX_SIZE - 1) >> ++ msblk->devblksize_log2) + 2]; ++ unsigned int offset = index & ((1 << msblk->devblksize_log2) - 1); ++ unsigned int cur_index = index >> msblk->devblksize_log2; ++ int bytes, avail_bytes, b = 0, k; ++ char *c_buffer; ++ unsigned int compressed; ++ unsigned int c_byte = length; ++ ++ if (c_byte) { ++ bytes = msblk->devblksize - offset; ++ compressed = SQUASHFS_COMPRESSED_BLOCK(c_byte); ++ c_buffer = compressed ? msblk->read_data : buffer; ++ c_byte = SQUASHFS_COMPRESSED_SIZE_BLOCK(c_byte); ++ ++ TRACE("Block @ 0x%llx, %scompressed size %d\n", index, compressed ++ ? "" : "un", (unsigned int) c_byte); ++ ++ if (!(bh[0] = sb_getblk(s, cur_index))) ++ goto block_release; ++ ++ for (b = 1; bytes < c_byte; b++) { ++ if (!(bh[b] = sb_getblk(s, ++cur_index))) ++ goto block_release; ++ bytes += msblk->devblksize; ++ } ++ ll_rw_block(READ, b, bh); ++ } else { ++ if (!(bh[0] = get_block_length(s, &cur_index, &offset, ++ &c_byte))) ++ goto read_failure; ++ ++ bytes = msblk->devblksize - offset; ++ compressed = SQUASHFS_COMPRESSED(c_byte); ++ c_buffer = compressed ? msblk->read_data : buffer; ++ c_byte = SQUASHFS_COMPRESSED_SIZE(c_byte); ++ ++ TRACE("Block @ 0x%llx, %scompressed size %d\n", index, compressed ++ ? "" : "un", (unsigned int) c_byte); ++ ++ for (b = 1; bytes < c_byte; b++) { ++ if (!(bh[b] = sb_getblk(s, ++cur_index))) ++ goto block_release; ++ bytes += msblk->devblksize; ++ } ++ ll_rw_block(READ, b - 1, bh + 1); ++ } ++ ++ if (compressed) ++ down(&msblk->read_data_mutex); ++ ++ for (bytes = 0, k = 0; k < b; k++) { ++ avail_bytes = (c_byte - bytes) > (msblk->devblksize - offset) ? ++ msblk->devblksize - offset : ++ c_byte - bytes; ++ wait_on_buffer(bh[k]); ++ if (!buffer_uptodate(bh[k])) ++ goto block_release; ++ memcpy(c_buffer + bytes, bh[k]->b_data + offset, avail_bytes); ++ bytes += avail_bytes; ++ offset = 0; ++ brelse(bh[k]); ++ } ++ ++ /* ++ * uncompress block ++ */ ++ if (compressed) { ++ int zlib_err; ++ ++ stream.next_in = c_buffer; ++ stream.avail_in = c_byte; ++ stream.next_out = buffer; ++ stream.avail_out = msblk->read_size; ++ ++ if (((zlib_err = zlib_inflateInit(&stream)) != Z_OK) || ++ ((zlib_err = zlib_inflate(&stream, Z_FINISH)) ++ != Z_STREAM_END) || ((zlib_err = ++ zlib_inflateEnd(&stream)) != Z_OK)) { ++ ERROR("zlib_fs returned unexpected result 0x%x\n", ++ zlib_err); ++ bytes = 0; ++ } else ++ bytes = stream.total_out; ++ ++ up(&msblk->read_data_mutex); ++ } ++ ++ if (next_index) ++ *next_index = index + c_byte + (length ? 0 : ++ (SQUASHFS_CHECK_DATA(msblk->sblk.flags) ++ ? 3 : 2)); ++ return bytes; ++ ++block_release: ++ while (--b >= 0) ++ brelse(bh[b]); ++ ++read_failure: ++ ERROR("sb_bread failed reading block 0x%x\n", cur_index); ++ return 0; ++} ++ ++ ++SQSH_EXTERN int squashfs_get_cached_block(struct super_block *s, char *buffer, ++ long long block, unsigned int offset, ++ int length, long long *next_block, ++ unsigned int *next_offset) ++{ ++ struct squashfs_sb_info *msblk = s->s_fs_info; ++ int n, i, bytes, return_length = length; ++ long long next_index; ++ ++ TRACE("Entered squashfs_get_cached_block [%llx:%x]\n", block, offset); ++ ++ while ( 1 ) { ++ for (i = 0; i < SQUASHFS_CACHED_BLKS; i++) ++ if (msblk->block_cache[i].block == block) ++ break; ++ ++ down(&msblk->block_cache_mutex); ++ ++ if (i == SQUASHFS_CACHED_BLKS) { ++ /* read inode header block */ ++ for (i = msblk->next_cache, n = SQUASHFS_CACHED_BLKS; ++ n ; n --, i = (i + 1) % ++ SQUASHFS_CACHED_BLKS) ++ if (msblk->block_cache[i].block != ++ SQUASHFS_USED_BLK) ++ break; ++ ++ if (n == 0) { ++ wait_queue_t wait; ++ ++ init_waitqueue_entry(&wait, current); ++ add_wait_queue(&msblk->waitq, &wait); ++ set_current_state(TASK_UNINTERRUPTIBLE); ++ up(&msblk->block_cache_mutex); ++ schedule(); ++ set_current_state(TASK_RUNNING); ++ remove_wait_queue(&msblk->waitq, &wait); ++ continue; ++ } ++ msblk->next_cache = (i + 1) % SQUASHFS_CACHED_BLKS; ++ ++ if (msblk->block_cache[i].block == ++ SQUASHFS_INVALID_BLK) { ++ if (!(msblk->block_cache[i].data = ++ kmalloc(SQUASHFS_METADATA_SIZE, ++ GFP_KERNEL))) { ++ ERROR("Failed to allocate cache" ++ "block\n"); ++ up(&msblk->block_cache_mutex); ++ goto out; ++ } ++ } ++ ++ msblk->block_cache[i].block = SQUASHFS_USED_BLK; ++ up(&msblk->block_cache_mutex); ++ ++ if (!(msblk->block_cache[i].length = ++ squashfs_read_data(s, ++ msblk->block_cache[i].data, ++ block, 0, &next_index))) { ++ ERROR("Unable to read cache block [%llx:%x]\n", ++ |
