SOURCES: squashfs2.2-patch (NEW) - squashfs 2.2

areq areq at pld-linux.org
Sun Jul 17 22:55:22 CEST 2005


Author: areq                         Date: Sun Jul 17 20:55:22 2005 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- squashfs 2.2

---- Files affected:
SOURCES:
   squashfs2.2-patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/squashfs2.2-patch
diff -u /dev/null SOURCES/squashfs2.2-patch:1.1
--- /dev/null	Sun Jul 17 22:55:22 2005
+++ SOURCES/squashfs2.2-patch	Sun Jul 17 22:55:17 2005
@@ -0,0 +1,2592 @@
+diff --new-file -urp linux-2.6.12/fs/Kconfig linux-2.6.12-squashfs2.2/fs/Kconfig
+--- linux-2.6.12/fs/Kconfig	2005-06-17 20:48:29.000000000 +0100
++++ linux-2.6.12-squashfs2.2/fs/Kconfig	2005-07-04 02:35:35.000000000 +0100
+@@ -1171,6 +1171,69 @@ config CRAMFS
+ 
+ 	  If unsure, say N.
+ 
++config SQUASHFS
++	tristate "SquashFS 2.0 - Squashed file system support"
++	select ZLIB_INFLATE
++	help
++	  Saying Y here includes support for SquashFs 2.0 (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 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.12/fs/Makefile linux-2.6.12-squashfs2.2/fs/Makefile
+--- linux-2.6.12/fs/Makefile	2005-06-17 20:48:29.000000000 +0100
++++ linux-2.6.12-squashfs2.2/fs/Makefile	2005-07-04 02:35:35.000000000 +0100
+@@ -52,6 +52,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.12/fs/squashfs/inode.c linux-2.6.12-squashfs2.2/fs/squashfs/inode.c
+--- linux-2.6.12/fs/squashfs/inode.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.12-squashfs2.2/fs/squashfs/inode.c	2005-07-04 02:35:35.000000000 +0100
+@@ -0,0 +1,1803 @@
++/*
++ * Squashfs - a compressed read only filesystem for Linux
++ *
++ * Copyright (c) 2002, 2003, 2004, 2005 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
++ *
++ * inode.c
++ */
++
++#define SQUASHFS_1_0_COMPATIBILITY
++
++#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 <asm/uaccess.h>
++#include <linux/wait.h>
++#include <asm/semaphore.h>
++#include <linux/zlib.h>
++#include <linux/blkdev.h>
++#include <linux/vmalloc.h>
++
++#ifdef SQUASHFS_TRACE
++#define TRACE(s, args...)				printk(KERN_NOTICE "SQUASHFS: "s, ## args)
++#else
++#define TRACE(s, args...)				{}
++#endif
++
++#define ERROR(s, args...)				printk(KERN_ERR "SQUASHFS error: "s, ## args)
++
++#define SERROR(s, args...)				if(!silent) printk(KERN_ERR "SQUASHFS error: "s, ## args)
++#define WARNING(s, args...)				printk(KERN_WARNING "SQUASHFS: "s, ## args)
++
++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 dentry *squashfs_lookup(struct inode *, struct dentry *, struct nameidata *);
++static unsigned int read_data(struct super_block *s, char *buffer,
++		unsigned int index, unsigned int length, unsigned int *next_index);
++static int squashfs_get_cached_block(struct super_block *s, char *buffer,
++		unsigned int block, unsigned int offset, int length,
++		unsigned int *next_block, unsigned int *next_offset);
++static struct inode *squashfs_iget(struct super_block *s, squashfs_inode inode);
++static unsigned int read_blocklist(struct inode *inode, int index, int readahead_blks,
++		char *block_list, unsigned short **block_p, unsigned int *bsize);
++static void squashfs_put_super(struct super_block *s);
++static struct super_block *squashfs_get_sb(struct file_system_type *, int, const char *, void *);
++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);
++
++#ifdef SQUASHFS_1_0_COMPATIBILITY
++static int squashfs_readpage_lessthan4K(struct file *file, struct page *page);
++static struct inode *squashfs_iget_1(struct super_block *s, squashfs_inode inode);
++static unsigned int read_blocklist_1(struct inode *inode, int index, int readahead_blks,
++		char *block_list, unsigned short **block_p, unsigned int *bsize);
++#endif
++
++DECLARE_MUTEX(read_data_mutex);
++
++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,
++};
++
++static struct address_space_operations squashfs_symlink_aops = {
++	.readpage = squashfs_symlink_readpage
++};
++
++static struct address_space_operations squashfs_aops = {
++	.readpage = squashfs_readpage
++};
++
++static struct address_space_operations squashfs_aops_4K = {
++	.readpage = squashfs_readpage4K
++};
++
++#ifdef SQUASHFS_1_0_COMPATIBILITY
++static struct address_space_operations squashfs_aops_lessthan4K = {
++	.readpage = squashfs_readpage_lessthan4K
++};
++#endif
++
++static struct file_operations squashfs_dir_ops = {
++	.read = generic_read_dir,
++	.readdir = squashfs_readdir
++};
++
++static struct inode_operations squashfs_dir_inode_ops = {
++	.lookup = squashfs_lookup
++};
++
++
++static inline struct squashfs_inode_info *SQUASHFS_I(struct inode *inode)
++{
++	return list_entry(inode, struct squashfs_inode_info, vfs_inode);
++}
++
++
++static struct buffer_head *get_block_length(struct super_block *s,
++				int *cur_index, int *offset, int *c_byte)
++{
++	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;
++}
++
++
++static unsigned int read_data(struct super_block *s, char *buffer,
++		unsigned int index, unsigned int length, unsigned int *next_index)
++{
++	squashfs_sb_info *msBlk = (squashfs_sb_info *)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%x, %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%x, %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(&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(&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;
++}
++
++
++static int squashfs_get_cached_block(struct super_block *s, char *buffer,
++		unsigned int block, unsigned int offset, int length,
++		unsigned int *next_block, unsigned int *next_offset)
++{
++	squashfs_sb_info *msBlk = (squashfs_sb_info *)s->s_fs_info;
++	int n, i, bytes, return_length = length;
++	unsigned int next_index;
++
++	TRACE("Entered squashfs_get_cached_block [%x:%x]\n", block, offset);
++
++	for(;;) {
++		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);
++ 				up(&msBlk->block_cache_mutex);
++				set_current_state(TASK_UNINTERRUPTIBLE);
++				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 = (unsigned char *)
++							kmalloc(SQUASHFS_METADATA_SIZE, GFP_KERNEL))) {
++					ERROR("Failed to allocate cache block\n");
++					up(&msBlk->block_cache_mutex);
++					return 0;
++				}
++			}
++	
++			msBlk->block_cache[i].block = SQUASHFS_USED_BLK;
++			up(&msBlk->block_cache_mutex);
++			if(!(msBlk->block_cache[i].length = read_data(s, msBlk->block_cache[i].data, block, 0,
++							&next_index))) {
++				ERROR("Unable to read cache block [%x:%x]\n", block, offset);
++				return 0;
++			}
++			down(&msBlk->block_cache_mutex);
++			wake_up(&msBlk->waitq);
++			msBlk->block_cache[i].block = block;
++			msBlk->block_cache[i].next_index = next_index;
++			TRACE("Read cache block [%x:%x]\n", block, offset);
++		}
++
++		if(msBlk->block_cache[i].block != block) {
++			up(&msBlk->block_cache_mutex);
++			continue;
++		}
++
++		if((bytes = msBlk->block_cache[i].length - offset) >= length) {
++			if(buffer)
++				memcpy(buffer, msBlk->block_cache[i].data + offset, length);
++			if(msBlk->block_cache[i].length - offset == length) {
++				*next_block = msBlk->block_cache[i].next_index;
++				*next_offset = 0;
++			} else {
++				*next_block = block;
++				*next_offset = offset + length;
++			}
++	
++			up(&msBlk->block_cache_mutex);
++			return return_length;
++		} else {
++			if(buffer) {
++				memcpy(buffer, msBlk->block_cache[i].data + offset, bytes);
++				buffer += bytes;
++			}
++			block = msBlk->block_cache[i].next_index;
++			up(&msBlk->block_cache_mutex);
++			length -= bytes;
++			offset = 0;
++		}
++	}
++}
++
++
++static int get_fragment_location(struct super_block *s, unsigned int fragment, unsigned int *fragment_start_block, unsigned int *fragment_size)
++{
++	squashfs_sb_info *msBlk = (squashfs_sb_info *)s->s_fs_info;
++	unsigned int start_block = msBlk->fragment_index[SQUASHFS_FRAGMENT_INDEX(fragment)];
++	int offset = SQUASHFS_FRAGMENT_INDEX_OFFSET(fragment);
++	squashfs_fragment_entry fragment_entry;
++
++	if(msBlk->swap) {
++		squashfs_fragment_entry sfragment_entry;
++
++		if(!squashfs_get_cached_block(s, (char *) &sfragment_entry, start_block, offset,
++					sizeof(sfragment_entry), &start_block, &offset))
++			return 0;
++		SQUASHFS_SWAP_FRAGMENT_ENTRY(&fragment_entry, &sfragment_entry);
++	} else
++		if(!squashfs_get_cached_block(s, (char *) &fragment_entry, start_block, offset,
++					sizeof(fragment_entry), &start_block, &offset))
++			return 0;
++
++	*fragment_start_block = fragment_entry.start_block;
++	*fragment_size = fragment_entry.size;
++
++	return 1;
++}
++
++
++void release_cached_fragment(squashfs_sb_info *msBlk, struct squashfs_fragment_cache *fragment)
++{
++	down(&msBlk->fragment_mutex);
++	fragment->locked --;
++	wake_up(&msBlk->fragment_wait_queue);
++	up(&msBlk->fragment_mutex);
++}
++
++
++struct squashfs_fragment_cache *get_cached_fragment(struct super_block *s, unsigned int start_block, int length)
++{
++	int i, n;
++	squashfs_sb_info *msBlk = (squashfs_sb_info *)s->s_fs_info;
++
++	for(;;) {
++		down(&msBlk->fragment_mutex);
++		for(i = 0; i < SQUASHFS_CACHED_FRAGMENTS && msBlk->fragment[i].block != start_block; i++);
++		if(i == SQUASHFS_CACHED_FRAGMENTS) {
++			for(i = msBlk->next_fragment, n = SQUASHFS_CACHED_FRAGMENTS;
++				n && msBlk->fragment[i].locked; n--, i = (i + 1) % SQUASHFS_CACHED_FRAGMENTS);
++
++			if(n == 0) {
++				wait_queue_t wait;
++
++				init_waitqueue_entry(&wait, current);
++				add_wait_queue(&msBlk->fragment_wait_queue, &wait);
++				up(&msBlk->fragment_mutex);
++				set_current_state(TASK_UNINTERRUPTIBLE);
++				schedule();
++				set_current_state(TASK_RUNNING);
++				remove_wait_queue(&msBlk->fragment_wait_queue, &wait);
++				continue;
++			}
++			msBlk->next_fragment = (msBlk->next_fragment + 1) % SQUASHFS_CACHED_FRAGMENTS;
++			
++			if(msBlk->fragment[i].data == NULL)
++				if(!(msBlk->fragment[i].data = (unsigned char *)
++							SQUASHFS_ALLOC(SQUASHFS_FILE_MAX_SIZE))) {
++					ERROR("Failed to allocate fragment cache block\n");
++					up(&msBlk->fragment_mutex);
++					return NULL;
++				}
++
++			msBlk->fragment[i].block = SQUASHFS_INVALID_BLK;
++			msBlk->fragment[i].locked = 1;
++			up(&msBlk->fragment_mutex);
++			if(!(msBlk->fragment[i].length = read_data(s, msBlk->fragment[i].data, start_block, length,
++							NULL))) {
++				ERROR("Unable to read fragment cache block [%x]\n", start_block);
++				msBlk->fragment[i].locked = 0;
++				return NULL;
++			}
++			msBlk->fragment[i].block = start_block;
++			TRACE("New fragment %d, start block %d, locked %d\n", i, msBlk->fragment[i].block, msBlk->fragment[i].locked);
++			return &msBlk->fragment[i];
++		}
++
++		msBlk->fragment[i].locked ++;
++		up(&msBlk->fragment_mutex);
++		
++		TRACE("Got fragment %d, start block %d, locked %d\n", i, msBlk->fragment[i].block, msBlk->fragment[i].locked);
++		return &msBlk->fragment[i];
++	}
++}
++
++
++#ifdef SQUASHFS_1_0_COMPATIBILITY
++static struct inode *squashfs_iget_1(struct super_block *s, squashfs_inode inode)
++{
++	struct inode *i = new_inode(s);
++	squashfs_sb_info *msBlk = (squashfs_sb_info *)s->s_fs_info;
++	squashfs_super_block *sBlk = &msBlk->sBlk;
++	unsigned int block = SQUASHFS_INODE_BLK(inode) + sBlk->inode_table_start;
++	unsigned int offset = SQUASHFS_INODE_OFFSET(inode);
++	unsigned int next_block, next_offset;
++	squashfs_base_inode_header_1 inodeb;
++
++	TRACE("Entered squashfs_iget_1\n");
++
++	if(msBlk->swap) {
++		squashfs_base_inode_header_1 sinodeb;
++
++		if(!squashfs_get_cached_block(s, (char *) &sinodeb, block,  offset,
<<Diff was trimmed, longer than 597 lines>>



More information about the pld-cvs-commit mailing list