SOURCES: squashfs_lzma-sqlzma2k-3.3.patch (NEW), squashfs_lzma-sqlzma2u-3.3...

zbyniu zbyniu at pld-linux.org
Thu Nov 13 14:24:26 CET 2008


Author: zbyniu                       Date: Thu Nov 13 13:24:26 2008 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- extracted from sqlzma3.3-457.tar.bz2 and ported for 3.4 @ 2.6.27

---- Files affected:
SOURCES:
   squashfs_lzma-sqlzma2k-3.3.patch (NONE -> 1.1)  (NEW), squashfs_lzma-sqlzma2u-3.3.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/squashfs_lzma-sqlzma2k-3.3.patch
diff -u /dev/null SOURCES/squashfs_lzma-sqlzma2k-3.3.patch:1.1
--- /dev/null	Thu Nov 13 14:24:27 2008
+++ SOURCES/squashfs_lzma-sqlzma2k-3.3.patch	Thu Nov 13 14:24:20 2008
@@ -0,0 +1,688 @@
+diff -purN linux-2.6.24/fs/squashfs/Makefile linux-2.6.24/fs/squashfs/Makefile
+--- linux-2.6.24/fs/squashfs/Makefile	2005-11-20 14:31:00.000000000 +0000
++++ linux-2.6.24/fs/squashfs/Makefile	2007-12-04 12:17:22.277418433 +0000
+@@ -2,6 +2,8 @@
+ # Makefile for the linux squashfs routines.
+ #
+ 
++-include /tmp/sqvars.mk
++
+ obj-$(CONFIG_SQUASHFS) += squashfs.o
+ squashfs-y += inode.o
+ squashfs-y += squashfs2_0.o
+diff -purN linux-2.6.24/fs/squashfs/inode.c linux-2.6.24/fs/squashfs/inode.c
+--- linux-2.6.24/fs/squashfs/inode.c	2007-11-08 19:21:23.000000000 +0000
++++ linux-2.6.24/fs/squashfs/inode.c	2007-12-04 12:19:14.129270334 +0000
+@@ -33,6 +33,28 @@
+ #include <linux/smp_lock.h>
+ 
+ #include "squashfs.h"
++#include "sqlzma.h"
++#include "sqmagic.h"
++  
++#undef KeepPreemptive
++#if defined(CONFIG_PREEMPT) && !defined(UnsquashNoPreempt)
++#define KeepPreemptive
++#endif
++
++struct sqlzma {
++#ifdef KeepPreemptive
++	struct mutex mtx;
++#endif
++	unsigned char read_data[SQUASHFS_FILE_MAX_SIZE];
++	struct sqlzma_un un;
++};
++static DEFINE_PER_CPU(struct sqlzma *, sqlzma);
++
++#define dpri(fmt, args...) /* printk("%s:%d: " fmt, __func__, __LINE__, ##args) */
++#define dpri_un(un)	dpri("un{%d, {%d %p}, {%d %p}, {%d %p}}\n", \
++			     (un)->un_lzma, (un)->un_a[0].sz, (un)->un_a[0].buf, \
++			     (un)->un_a[1].sz, (un)->un_a[1].buf, \
++			     (un)->un_a[2].sz, (un)->un_a[2].buf)
+ 
+ static int squashfs_cached_blks;
+ 
+@@ -218,7 +240,8 @@ SQSH_EXTERN unsigned int squashfs_read_d
+ 		if (index < 0 || (index + 2) > sblk->bytes_used)
+ 			goto read_failure;
+ 
+-		bh[0] = get_block_length(s, &cur_index, &offset, &c_byte);
++		bh[0] = get_block_length(s, (int *)&cur_index, (int *)&offset,
++					 (int *)&c_byte);
+ 		if (bh[0] == NULL)
+ 			goto read_failure;
+ 
+@@ -242,66 +265,75 @@ SQSH_EXTERN unsigned int squashfs_read_d
+ 	}
+ 
+ 	if (compressed) {
+-		int zlib_err = 0;
++		int zlib_err = Z_STREAM_END;
++		int rest, start;
++		enum {Src, Dst};
++		struct sized_buf sbuf[2];
++		struct sqlzma *percpu;
+ 
+ 		/*
+ 	 	* uncompress block
+ 	 	*/
+ 
+-		mutex_lock(&msblk->read_data_mutex);
+-
+-		msblk->stream.next_out = buffer;
+-		msblk->stream.avail_out = srclength;
+-
+-		for (bytes = 0; k < b; k++) {
+-			avail_bytes = min(c_byte - bytes, msblk->devblksize - offset);
+-
++		for (k = 0; k < b; k++) {
+ 			wait_on_buffer(bh[k]);
+ 			if (!buffer_uptodate(bh[k]))
+-				goto release_mutex;
+-
+-			msblk->stream.next_in = bh[k]->b_data + offset;
+-			msblk->stream.avail_in = avail_bytes;
+-
+-			if (k == 0) {
+-				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;
+-				}
+-
+-				if (avail_bytes == 0) {
+-					offset = 0;
+-					brelse(bh[k]);
+-					continue;
+-				}
+-			}
+-
+-			zlib_err = zlib_inflate(&msblk->stream, Z_NO_FLUSH);
+-			if (zlib_err != Z_OK && zlib_err != Z_STREAM_END) {
+-				ERROR("zlib_inflate returned unexpected result 0x%x,"
+-					" srclength %d, avail_in %d, avail_out %d\n", zlib_err,
+-					srclength, msblk->stream.avail_in, msblk->stream.avail_out);
+-				goto release_mutex;
+-			}
++				goto block_release;
++		}
+ 
+-			bytes += avail_bytes;
++		avail_bytes = 0;
++		for (k = 0; !avail_bytes && k < b; k++) {
++			avail_bytes = msblk->devblksize - offset;
++			if (c_byte < avail_bytes)
++				avail_bytes = c_byte;
++			if (avail_bytes)
++				break;
+ 			offset = 0;
+ 			brelse(bh[k]);
+ 		}
++		bytes = 0;
++		if (!avail_bytes)
++			goto block_release; // nothing to be process
+ 
+-		if (zlib_err != Z_STREAM_END)
+-			goto release_mutex;
+-
+-		zlib_err = zlib_inflateEnd(&msblk->stream);
+-		if (zlib_err != Z_OK) {
+-			ERROR("zlib_inflateEnd returned unexpected result 0x%x,"
+-				" srclength %d\n", zlib_err, srclength);
++		start = k;
++		/* it disables preemption */
++		percpu = get_cpu_var(sqlzma);
++#ifdef KeepPreemptive
++		put_cpu_var(sqlzma);
++		mutex_lock(&percpu->mtx);
++#endif
++
++		for (; k < b; k++) {
++			memcpy(percpu->read_data + bytes, bh[k]->b_data + offset,
++			       avail_bytes);
++			bytes += avail_bytes;
++			offset = 0;
++			brelse(bh[k]);
++			avail_bytes = msblk->devblksize - offset;
++			rest = c_byte - bytes;
++			if (rest < avail_bytes)
++				avail_bytes = rest;
++		}
++
++		sbuf[Src].buf = percpu->read_data;
++		sbuf[Src].sz = bytes;
++		sbuf[Dst].buf = buffer;
++		sbuf[Dst].sz = srclength;
++		dpri_un(&percpu->un);
++		dpri("src %d %p, dst %d %p\n", sbuf[Src].sz, sbuf[Src].buf,
++		     sbuf[Dst].sz, sbuf[Dst].buf);
++		zlib_err = sqlzma_un(&percpu->un, sbuf + Src, sbuf + Dst);
++		bytes = percpu->un.un_reslen;
++
++#ifdef KeepPreemptive
++		mutex_unlock(&percpu->mtx);
++#else
++		put_cpu_var(sqlzma);
++#endif
++		if (unlikely(zlib_err)) {
++			dpri("zlib_err %d\n", zlib_err);
+ 			goto release_mutex;
+ 		}
+-		bytes = msblk->stream.total_out;
+-		mutex_unlock(&msblk->read_data_mutex);
+ 	} else {
+ 		int i;
+ 
+@@ -329,7 +361,7 @@ SQSH_EXTERN unsigned int squashfs_read_d
+ 	return bytes;
+ 
+ release_mutex:
+-	mutex_unlock(&msblk->read_data_mutex);
++	//mutex_unlock(&msblk->read_data_mutex);
+ 
+ block_release:
+ 	for (; k < b; k++)
+@@ -470,12 +502,14 @@ static int get_fragment_location(struct 
+ 		struct squashfs_fragment_entry sfragment_entry;
+ 
+ 		if (!squashfs_get_cached_block(s, &sfragment_entry, start_block, offset,
+-					 sizeof(sfragment_entry), &start_block, &offset))
++					 sizeof(sfragment_entry), &start_block,
++					       (unsigned int *)&offset))
+ 			goto out;
+ 		SQUASHFS_SWAP_FRAGMENT_ENTRY(&fragment_entry, &sfragment_entry);
+ 	} else
+ 		if (!squashfs_get_cached_block(s, &fragment_entry, start_block, offset,
+-					 sizeof(fragment_entry), &start_block, &offset))
++					 sizeof(fragment_entry), &start_block,
++					       (unsigned int *)&offset))
+ 			goto out;
+ 
+ 	*fragment_start_block = fragment_entry.start_block;
+@@ -615,11 +649,11 @@ static squashfs_inode_t squashfs_inode_l
+ 		squashfs_inode_t sinode;
+ 
+ 		if (!squashfs_get_cached_block(s, &sinode, start, offset,
+-					sizeof(sinode), &start, &offset))
++					sizeof(sinode), &start, (unsigned int *)&offset))
+ 			goto out;
+ 		SQUASHFS_SWAP_INODE_T((&inode), &sinode);
+ 	} else if (!squashfs_get_cached_block(s, &inode, start, offset,
+-					sizeof(inode), &start, &offset))
++					sizeof(inode), &start, (unsigned int *)&offset))
+ 			goto out;
+ 
+ 	TRACE("squashfs_inode_lookup, inode = 0x%llx\n", inode);
+@@ -1088,11 +1122,13 @@ static int squashfs_fill_super(struct su
+ {
+ 	struct squashfs_sb_info *msblk;
+ 	struct squashfs_super_block *sblk;
++	int err;
+ 	char b[BDEVNAME_SIZE];
+ 	struct inode *root;
+ 
+ 	TRACE("Entered squashfs_fill_superblock\n");
+ 
++	err = -ENOMEM;
+ 	s->s_fs_info = kzalloc(sizeof(struct squashfs_sb_info), GFP_KERNEL);
+ 	if (s->s_fs_info == NULL) {
+ 		ERROR("Failed to allocate superblock\n");
+@@ -1101,17 +1136,12 @@ static int squashfs_fill_super(struct su
+ 	}
+ 	msblk = s->s_fs_info;
+ 
+-	msblk->stream.workspace = vmalloc(zlib_inflate_workspacesize());
+-	if (msblk->stream.workspace == NULL) {
+-		ERROR("Failed to allocate zlib workspace\n");
+-		goto failure;
+-	}
+ 	sblk = &msblk->sblk;
+ 	
+ 	msblk->devblksize = sb_min_blocksize(s, BLOCK_SIZE);
+ 	msblk->devblksize_log2 = ffz(~msblk->devblksize);
+ 
+-	mutex_init(&msblk->read_data_mutex);
++	//mutex_init(&msblk->read_data_mutex);
+ 	mutex_init(&msblk->read_page_mutex);
+ 	mutex_init(&msblk->block_cache_mutex);
+ 	mutex_init(&msblk->fragment_mutex);
+@@ -1123,6 +1153,7 @@ static int squashfs_fill_super(struct su
+ 	/* sblk->bytes_used is checked in squashfs_read_data to ensure reads are not
+  	 * beyond filesystem end.  As we're using squashfs_read_data to read sblk here,
+  	 * first set sblk->bytes_used to a useful value */
++	err = -EINVAL;
+ 	sblk->bytes_used = sizeof(struct squashfs_super_block);
+ 	if (!squashfs_read_data(s, (char *) sblk, SQUASHFS_START,
+ 					sizeof(struct squashfs_super_block) |
+@@ -1132,21 +1163,35 @@ static int squashfs_fill_super(struct su
+ 	}
+ 
+ 	/* Check it is a SQUASHFS superblock */
+-	if ((s->s_magic = sblk->s_magic) != SQUASHFS_MAGIC) {
+-		if (sblk->s_magic == SQUASHFS_MAGIC_SWAP) {
+-			struct squashfs_super_block ssblk;
+-
+-			WARNING("Mounting a different endian SQUASHFS filesystem on %s\n",
+-				bdevname(s->s_bdev, b));
+-
+-			SQUASHFS_SWAP_SUPER_BLOCK(&ssblk, sblk);
+-			memcpy(sblk, &ssblk, sizeof(struct squashfs_super_block));
+-			msblk->swap = 1;
+-		} else  {
+-			SERROR("Can't find a SQUASHFS superblock on %s\n",
+-							bdevname(s->s_bdev, b));
+-			goto failed_mount;
+-		}
++	s->s_magic = sblk->s_magic;
++	msblk->swap = 0;
++	dpri("magic 0x%x\n", sblk->s_magic);
++	switch (sblk->s_magic) {
++		struct squashfs_super_block ssblk;
++
++	case SQUASHFS_MAGIC_SWAP:
++		/*FALLTHROUGH*/
++	case SQUASHFS_MAGIC_LZMA_SWAP:
++		WARNING("Mounting a different endian SQUASHFS "
++			"filesystem on %s\n", bdevname(s->s_bdev, b));
++
++		SQUASHFS_SWAP_SUPER_BLOCK(&ssblk, sblk);
++		memcpy(sblk, &ssblk, sizeof(struct squashfs_super_block));
++		msblk->swap = 1;
++		/*FALLTHROUGH*/
++	case SQUASHFS_MAGIC:
++	case SQUASHFS_MAGIC_LZMA:
++		break;
++	default:
++		SERROR("Can't find a SQUASHFS superblock on %s\n",
++		       bdevname(s->s_bdev, b));
++		goto failed_mount;
++	}
++
++	{
++		struct sqlzma *p;
++		dpri("block_size %d\n", sblk->block_size);
++		BUG_ON(sblk->block_size > sizeof(p->read_data));
+ 	}
+ 
+ 	/* Check the MAJOR & MINOR versions */
+@@ -1190,6 +1235,7 @@ static int squashfs_fill_super(struct su
+ 		goto failed_mount;
+ 
+ 	/* Allocate read_page block */
++	err = -ENOMEM;
+ 	msblk->read_page = vmalloc(sblk->block_size);
+ 	if (msblk->read_page == NULL) {
+ 		ERROR("Failed to allocate read_page block\n");
+@@ -1205,19 +1251,30 @@ static int squashfs_fill_super(struct su
+ 	}
+ 	msblk->guid = msblk->uid + sblk->no_uids;
+    
++	dpri("swap %d\n", msblk->swap);
++	err = -EINVAL;
+ 	if (msblk->swap) {
+-		unsigned int suid[sblk->no_uids + sblk->no_guids];
++		unsigned int *suid;
++
++		err = -ENOMEM;
++		suid = kmalloc(sizeof(*suid) * (sblk->no_uids + sblk->no_guids),
++			       GFP_KERNEL);
++		if (unlikely(!suid))
++			goto failed_mount;
+ 
+-		if (!squashfs_read_data(s, (char *) &suid, sblk->uid_start,
++		err = -EINVAL;
++		if (!squashfs_read_data(s, (char *)suid, sblk->uid_start,
+ 					((sblk->no_uids + sblk->no_guids) *
+ 					 sizeof(unsigned int)) |
+ 					SQUASHFS_COMPRESSED_BIT_BLOCK, NULL, (sblk->no_uids + sblk->no_guids) * sizeof(unsigned int))) {
+ 			ERROR("unable to read uid/gid table\n");
++			kfree(suid);
+ 			goto failed_mount;
+ 		}
+ 
+ 		SQUASHFS_SWAP_DATA(msblk->uid, suid, (sblk->no_uids +
+ 			sblk->no_guids), (sizeof(unsigned int) * 8));
++		kfree(suid);
+ 	} else
+ 		if (!squashfs_read_data(s, (char *) msblk->uid, sblk->uid_start,
+ 					((sblk->no_uids + sblk->no_guids) *
+@@ -1231,6 +1288,7 @@ static int squashfs_fill_super(struct su
+ 	if (sblk->s_major == 1 && squashfs_1_0_supported(msblk))
+ 		goto allocate_root;
+ 
++	err = -ENOMEM;
+ 	msblk->fragment_cache = squashfs_cache_init("fragment",
+ 		SQUASHFS_CACHED_FRAGMENTS, sblk->block_size, 1);
+ 	if (msblk->fragment_cache == NULL)
+@@ -1260,9 +1318,12 @@ static int squashfs_fill_super(struct su
+ 	s->s_export_op = &squashfs_export_ops;
+ 
+ allocate_root:
++	dpri("alloate_root\n");
+ 	root = new_inode(s);
+-	if ((msblk->read_inode)(root, sblk->root_inode) == 0)
++	if ((msblk->read_inode)(root, sblk->root_inode) == 0) {
++		iput(root);
+ 		goto failed_mount;
++	}
+ 	insert_inode_hash(root);
+ 
+ 	s->s_root = d_alloc_root(root);
+@@ -1283,13 +1344,10 @@ failed_mount:
+ 	vfree(msblk->read_page);
+ 	kfree(msblk->block_cache);
+ 	kfree(msblk->fragment_index_2);
+-	vfree(msblk->stream.workspace);
+ 	kfree(s->s_fs_info);
+ 	s->s_fs_info = NULL;
+-	return -EINVAL;
+-
+-failure:
+-	return -ENOMEM;
++ failure:
++	return err;
+ }
+ 
+ 
+@@ -1300,7 +1358,7 @@ static int squashfs_statfs(struct dentry
+ 
+ 	TRACE("Entered squashfs_statfs\n");
+ 
+-	buf->f_type = SQUASHFS_MAGIC;
++	buf->f_type = sblk->s_magic;
+ 	buf->f_bsize = sblk->block_size;
+ 	buf->f_blocks = ((sblk->bytes_used - 1) >> sblk->block_log) + 1;
+ 	buf->f_bfree = buf->f_bavail = 0;
+@@ -1327,7 +1385,8 @@ static int squashfs_symlink_readpage(str
+ 
+ 	for (length = 0; length < index; length += bytes) {
+ 		bytes = squashfs_get_cached_block(inode->i_sb, NULL, block,
+-				offset, PAGE_CACHE_SIZE, &block, &offset);
++				offset, PAGE_CACHE_SIZE, &block,
++						  (unsigned int *)&offset);
+ 		if (bytes == 0) {
+ 			ERROR("Unable to read symbolic link [%llx:%x]\n", block, offset);
+ 			goto skip_read;
+@@ -1343,7 +1402,7 @@ static int squashfs_symlink_readpage(str
+ 	avail_bytes = min_t(int, i_size_read(inode) - length, PAGE_CACHE_SIZE);
+ 
+ 	bytes = squashfs_get_cached_block(inode->i_sb, pageaddr, block, offset,
+-		avail_bytes, &block, &offset);
++		avail_bytes, &block, (unsigned int *)&offset);
+ 	if (bytes == 0)
+ 		ERROR("Unable to read symbolic link [%llx:%x]\n", block, offset);
+ 
+@@ -1462,18 +1521,24 @@ static int read_block_index(struct super
+ 	int block = 0;
+ 	
+ 	if (msblk->swap) {
+-		char sblock_list[blocks << 2];
++		char *sblock_list;
++
++		sblock_list = kmalloc(blocks << 2, GFP_KERNEL);
++		if (unlikely(!sblock_list))
++			goto failure;
+ 
+ 		if (!squashfs_get_cached_block(s, sblock_list, *start_block,
+-				*offset, blocks << 2, start_block, offset)) {
++				*offset, blocks << 2, start_block, (unsigned int *)offset)) {
+ 			ERROR("Fail reading block list [%llx:%x]\n", *start_block, *offset);
++			kfree(sblock_list);
+ 			goto failure;
+ 		}
+ 		SQUASHFS_SWAP_INTS(((unsigned int *)block_list),
+ 				((unsigned int *)sblock_list), blocks);
++		kfree(sblock_list);
+ 	} else {
+ 		if (!squashfs_get_cached_block(s, block_list, *start_block,
+-				*offset, blocks << 2, start_block, offset)) {
++				*offset, blocks << 2, start_block, (unsigned int *)offset)) {
+ 			ERROR("Fail reading block list [%llx:%x]\n", *start_block, *offset);
+ 			goto failure;
+ 		}
+@@ -1889,7 +1954,8 @@ static int squashfs_readdir(struct file 
+ 		file->f_pos += size;
+ 	}
+ 
+-	length = get_dir_index_using_offset(i->i_sb, &next_block, &next_offset,
++	length = get_dir_index_using_offset(i->i_sb, &next_block,
++					    (unsigned int *)&next_offset,
+ 				SQUASHFS_I(i)->u.s2.directory_index_start,
+ 				SQUASHFS_I(i)->u.s2.directory_index_offset,
+ 				SQUASHFS_I(i)->u.s2.directory_index_count, file->f_pos);
+@@ -1900,14 +1966,16 @@ static int squashfs_readdir(struct file 
+ 			struct squashfs_dir_header sdirh;
+ 			
+ 			if (!squashfs_get_cached_block(i->i_sb, &sdirh, next_block,
+-					 next_offset, sizeof(sdirh), &next_block, &next_offset))
++					 next_offset, sizeof(sdirh), &next_block,
++						       (unsigned int *)&next_offset))
+ 				goto failed_read;
+ 
+ 			length += sizeof(sdirh);
+ 			SQUASHFS_SWAP_DIR_HEADER(&dirh, &sdirh);
+ 		} else {
+ 			if (!squashfs_get_cached_block(i->i_sb, &dirh, next_block,
+-					next_offset, sizeof(dirh), &next_block, &next_offset))
++					next_offset, sizeof(dirh), &next_block,
++						       (unsigned int *)&next_offset))
+ 				goto failed_read;
+ 
+ 			length += sizeof(dirh);
+@@ -1918,21 +1986,24 @@ static int squashfs_readdir(struct file 
+ 			if (msblk->swap) {
+ 				struct squashfs_dir_entry sdire;
+ 				if (!squashfs_get_cached_block(i->i_sb, &sdire, next_block,
+-						next_offset, sizeof(sdire), &next_block, &next_offset))
++						next_offset, sizeof(sdire), &next_block,
++							       (unsigned int *)&next_offset))
+ 					goto failed_read;
+ 				
+ 				length += sizeof(sdire);
+ 				SQUASHFS_SWAP_DIR_ENTRY(dire, &sdire);
+ 			} else {
+ 				if (!squashfs_get_cached_block(i->i_sb, dire, next_block,
+-						next_offset, sizeof(*dire), &next_block, &next_offset))
++						next_offset, sizeof(*dire), &next_block,
++							       (unsigned int *)&next_offset))
+ 					goto failed_read;
+ 
+ 				length += sizeof(*dire);
+ 			}
+ 
+ 			if (!squashfs_get_cached_block(i->i_sb, dire->name, next_block,
+-						next_offset, dire->size + 1, &next_block, &next_offset))
++						next_offset, dire->size + 1, &next_block,
++						       (unsigned int *)&next_offset))
+ 				goto failed_read;
+ 
+ 			length += dire->size + 1;
+@@ -1996,7 +2067,7 @@ static struct dentry *squashfs_lookup(st
+ 	if (len > SQUASHFS_NAME_LEN)
+ 		goto exit_lookup;
+ 
+-	length = get_dir_index_using_name(i->i_sb, &next_block, &next_offset,
++	length = get_dir_index_using_name(i->i_sb, &next_block, (unsigned int *)&next_offset,
+ 				SQUASHFS_I(i)->u.s2.directory_index_start,
+ 				SQUASHFS_I(i)->u.s2.directory_index_offset,
+ 				SQUASHFS_I(i)->u.s2.directory_index_count, name, len);
+@@ -2006,14 +2077,16 @@ static struct dentry *squashfs_lookup(st
+ 		if (msblk->swap) {
+ 			struct squashfs_dir_header sdirh;
+ 			if (!squashfs_get_cached_block(i->i_sb, &sdirh, next_block,
+-					 next_offset, sizeof(sdirh), &next_block, &next_offset))
++					 next_offset, sizeof(sdirh), &next_block,
++						       (unsigned int *)&next_offset))
+ 				goto failed_read;
+ 
+ 			length += sizeof(sdirh);
+ 			SQUASHFS_SWAP_DIR_HEADER(&dirh, &sdirh);
+ 		} else {
+ 			if (!squashfs_get_cached_block(i->i_sb, &dirh, next_block,
+-					next_offset, sizeof(dirh), &next_block, &next_offset))
++					next_offset, sizeof(dirh), &next_block,
++						       (unsigned int *)&next_offset))
+ 				goto failed_read;
+ 
+ 			length += sizeof(dirh);
+@@ -2024,21 +2097,24 @@ static struct dentry *squashfs_lookup(st
+ 			if (msblk->swap) {
+ 				struct squashfs_dir_entry sdire;
+ 				if (!squashfs_get_cached_block(i->i_sb, &sdire, next_block,
+-						next_offset, sizeof(sdire), &next_block, &next_offset))
++						next_offset, sizeof(sdire), &next_block,
++							       (unsigned int *)&next_offset))
+ 					goto failed_read;
+ 				
+ 				length += sizeof(sdire);
+ 				SQUASHFS_SWAP_DIR_ENTRY(dire, &sdire);
+ 			} else {
+ 				if (!squashfs_get_cached_block(i->i_sb, dire, next_block,
+-						next_offset, sizeof(*dire), &next_block, &next_offset))
++						next_offset, sizeof(*dire), &next_block,
++							       (unsigned int *)&next_offset))
+ 					goto failed_read;
+ 
+ 				length += sizeof(*dire);
+ 			}
+ 
+ 			if (!squashfs_get_cached_block(i->i_sb, dire->name, next_block,
+-					next_offset, dire->size + 1, &next_block, &next_offset))
++					next_offset, dire->size + 1, &next_block,
++						       (unsigned int *)&next_offset))
+ 				goto failed_read;
+ 
+ 			length += dire->size + 1;
+@@ -2102,7 +2178,6 @@ static void squashfs_put_super(struct su
+ 		kfree(sbi->fragment_index);
+ 		kfree(sbi->fragment_index_2);
+ 		kfree(sbi->meta_index);
+-		vfree(sbi->stream.workspace);
+ 		kfree(s->s_fs_info);
+ 		s->s_fs_info = NULL;
+ 	}
+@@ -2116,19 +2191,63 @@ static int squashfs_get_sb(struct file_s
+ 				mnt);
+ }
+ 
++static void free_sqlzma(void)
++{
++	int cpu;
++	struct sqlzma *p;
++
++	for_each_online_cpu(cpu) {
++		p = per_cpu(sqlzma, cpu);
++		if (p) {
++#ifdef KeepPreemptive
++			mutex_destroy(&p->mtx);
++#endif
++			sqlzma_fin(&p->un);
++			kfree(p);
++		}
++	}
++}
+ 
+ static int __init init_squashfs_fs(void)
+ {
++	struct sqlzma *p;
++	int cpu;
+ 	int err = init_inodecache();
+ 	if (err)
<<Diff was trimmed, longer than 597 lines>>


More information about the pld-cvs-commit mailing list