SOURCES: squashfs_lzma-module.patch (NEW) - squashfs with lzma com...

sparky sparky at pld-linux.org
Fri Dec 9 23:15:33 CET 2005


Author: sparky                       Date: Fri Dec  9 22:15:33 2005 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- squashfs with lzma compression module sources: taken squashfs2.2-patch
  from kernel, applied 
  http://www.beyondlogic.org/nb5/linux-2.6.12.2_squashfs2.2_lzma.patch
  and everything a little reworked so it can be built outside kernel tree
  and can coexist with normal squashfs module

---- Files affected:
SOURCES:
   squashfs_lzma-module.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/squashfs_lzma-module.patch
diff -u /dev/null SOURCES/squashfs_lzma-module.patch:1.1
--- /dev/null	Fri Dec  9 23:15:33 2005
+++ SOURCES/squashfs_lzma-module.patch	Fri Dec  9 23:15:28 2005
@@ -0,0 +1,3345 @@
+diff -Nur /dev/null squashfs/inode.c
+--- /dev/null	1970-01-01 01:00:00.000000000 +0100
++++ squashfs/inode.c	2005-12-09 20:41:33.000000000 +0100
+@@ -0,0 +1,1844 @@
++/*
++ * 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_LZMA
++ 
++#define SQUASHFS_1_0_COMPATIBILITY
++
++#include <linux/types.h>
++#include "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 "squashfs_fs_sb.h"
++#include "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>
++
++#ifdef SQUASHFS_LZMA
++#include "LzmaWrapper.h"
++#else
++#include <linux/zlib.h>
++#endif
++
++#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);
++
++#ifdef SQUASHFS_LZMA
++static char *lzma_data;
++#else
++static z_stream stream;
++#endif
++
++static struct file_system_type squashfs_fs_type = {
++	.owner = THIS_MODULE,
++	.name = "squashfs_lzma",
++	.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) {
++#ifdef SQUASHFS_LZMA
++		int out_size;
++		int lzma_err;
++		int i;
++		out_size=msBlk->read_size;
++		
++		if((lzma_err=lzma_inflate(c_buffer, c_byte, buffer, &out_size))){
++			ERROR("lzma returned unexpected result 0x%x\n", lzma_err);
++			bytes = 0;
++		} else
++			bytes = out_size;
++//		printk("out size = %d, processed = %d\n", msBlk->read_size, out_size);
++#else
++		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;
++#endif
++		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,
++					sizeof(sinodeb), &next_block, &next_offset))
++			goto failed_read;
++		SQUASHFS_SWAP_BASE_INODE_HEADER_1(&inodeb, &sinodeb, sizeof(sinodeb));
++	} else
++		if(!squashfs_get_cached_block(s, (char *) &inodeb, block,  offset,
++					sizeof(inodeb), &next_block, &next_offset))
++			goto failed_read;
++
++	i->i_nlink = 1;
++
++	i->i_mtime.tv_sec = sBlk->mkfs_time;
++	i->i_atime.tv_sec = sBlk->mkfs_time;
++	i->i_ctime.tv_sec = sBlk->mkfs_time;
++
++	if(inodeb.inode_type != SQUASHFS_IPC_TYPE)
++		i->i_uid = msBlk->uid[((inodeb.inode_type - 1) / SQUASHFS_TYPES) * 16 + inodeb.uid];
++	i->i_ino = SQUASHFS_MK_VFS_INODE(block - sBlk->inode_table_start, offset);
++
++	i->i_mode = inodeb.mode;
++
++	switch(inodeb.inode_type == SQUASHFS_IPC_TYPE ? SQUASHFS_IPC_TYPE : (inodeb.inode_type - 1) % SQUASHFS_TYPES + 1) {
++		case SQUASHFS_FILE_TYPE: {
++			squashfs_reg_inode_header_1 inodep;
++
++			if(msBlk->swap) {
++				squashfs_reg_inode_header_1 sinodep;
++
++				if(!squashfs_get_cached_block(s, (char *) &sinodep, block,  offset, sizeof(sinodep),
++							&next_block, &next_offset))
++					goto failed_read;
++				SQUASHFS_SWAP_REG_INODE_HEADER_1(&inodep, &sinodep);
++			} else
++				if(!squashfs_get_cached_block(s, (char *) &inodep, block,  offset, sizeof(inodep),
++							&next_block, &next_offset))
++					goto failed_read;
++
++			i->i_size = inodep.file_size;
++			i->i_fop = &generic_ro_fops;
++			if(sBlk->block_size > 4096)
++				i->i_data.a_ops = &squashfs_aops;
++			else if(sBlk->block_size == 4096)
++				i->i_data.a_ops = &squashfs_aops_4K;
++			else
++				i->i_data.a_ops = &squashfs_aops_lessthan4K;
++			i->i_mode |= S_IFREG;
++			i->i_mtime.tv_sec = inodep.mtime;
++			i->i_atime.tv_sec = inodep.mtime;
++			i->i_ctime.tv_sec = inodep.mtime;
++			i->i_blocks = ((i->i_size - 1) >> 9) + 1;
++			i->i_blksize = PAGE_CACHE_SIZE;
++			SQUASHFS_I(i)->u.s1.fragment_start_block = SQUASHFS_INVALID_BLK;
++			SQUASHFS_I(i)->u.s1.fragment_offset = 0;
++			SQUASHFS_I(i)->start_block = inodep.start_block;
++			SQUASHFS_I(i)->block_list_start = next_block;
++			SQUASHFS_I(i)->offset = next_offset;
++			TRACE("File inode %x:%x, start_block %x, block_list_start %x, offset %x\n",
++					SQUASHFS_INODE_BLK(inode), offset, inodep.start_block, next_block, next_offset);
++			break;
<<Diff was trimmed, longer than 597 lines>>



More information about the pld-cvs-commit mailing list