Author: hawk                         Date: Sat Jun 20 16:02:35 2009 GMT
Module: packages                      Tag: HEAD
---- Log message:
- backport of squashfs from 2.6.30 for 2.6.27.x

---- Files affected:
packages/kernel-bare-grsecurity:
   linux-2.6.27-squashfs.patch (1.1 -> 1.2) 

---- Diffs:

================================================================
Index: packages/kernel-bare-grsecurity/linux-2.6.27-squashfs.patch
diff -u packages/kernel-bare-grsecurity/linux-2.6.27-squashfs.patch:1.1 
packages/kernel-bare-grsecurity/linux-2.6.27-squashfs.patch:1.2
--- packages/kernel-bare-grsecurity/linux-2.6.27-squashfs.patch:1.1     Tue Nov 
 4 09:42:26 2008
+++ packages/kernel-bare-grsecurity/linux-2.6.27-squashfs.patch Sat Jun 20 
18:02:29 2009
@@ -1,67 +1,19 @@
-diff -x .gitignore -Nurp linux-2.6.27-rc4/fs/Kconfig 
linux-2.6.27-rc4-squashfs3.4/fs/Kconfig
---- linux-2.6.27-rc4/fs/Kconfig        2008-08-11 15:20:41.000000000 +0100
-+++ linux-2.6.27-rc4-squashfs3.4/fs/Kconfig    2008-08-19 18:31:56.000000000 
+0100
-@@ -1348,6 +1348,56 @@ config CRAMFS
+diff -urN linux-2.6.27.orig/fs/Kconfig linux-2.6.27/fs/Kconfig
+--- linux-2.6.27.orig/fs/Kconfig       2009-06-20 17:45:39.408210188 +0200
++++ linux-2.6.27/fs/Kconfig    2009-06-20 17:49:39.818046568 +0200
+@@ -1348,6 +1348,8 @@
  
          If unsure, say N.
  
-+config SQUASHFS
-+      tristate "SquashFS 3.4 - Squashed file system support"
-+      select ZLIB_INFLATE
-+      help
-+        Saying Y here includes support for SquashFS 3.4 (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 1 Mbytes (default
-+        block size 128K).  SquashFS 3.3 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 option for memory-constrained systems" 
-+      depends on SQUASHFS
-+      default n
-+      help
-+        Saying Y here allows you to specify cache size.
-+
-+        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.
++source "fs/squashfs/Kconfig"
 +
  config VXFS_FS
        tristate "FreeVxFS file system support (VERITAS VxFS(TM) compatible)"
        depends on BLOCK
-diff -x .gitignore -Nurp linux-2.6.27-rc4/fs/Makefile 
linux-2.6.27-rc4-squashfs3.4/fs/Makefile
---- linux-2.6.27-rc4/fs/Makefile       2008-08-11 15:20:41.000000000 +0100
-+++ linux-2.6.27-rc4-squashfs3.4/fs/Makefile   2008-08-19 18:31:56.000000000 
+0100
-@@ -74,6 +74,7 @@ obj-$(CONFIG_JBD)            += jbd/
+diff -urN linux-2.6.27.orig/fs/Makefile linux-2.6.27/fs/Makefile
+--- linux-2.6.27.orig/fs/Makefile      2009-06-20 17:45:39.408210188 +0200
++++ linux-2.6.27/fs/Makefile   2009-06-20 17:49:39.818046568 +0200
+@@ -74,6 +74,7 @@
  obj-$(CONFIG_JBD2)            += jbd2/
  obj-$(CONFIG_EXT2_FS)         += ext2/
  obj-$(CONFIG_CRAMFS)          += cramfs/
@@ -69,10 +21,10 @@
  obj-y                         += ramfs/
  obj-$(CONFIG_HUGETLBFS)               += hugetlbfs/
  obj-$(CONFIG_CODA_FS)         += coda/
-diff -x .gitignore -Nurp linux-2.6.27-rc4/fs/squashfs/inode.c 
linux-2.6.27-rc4-squashfs3.4/fs/squashfs/inode.c
---- linux-2.6.27-rc4/fs/squashfs/inode.c       1970-01-01 01:00:00.000000000 
+0100
-+++ linux-2.6.27-rc4-squashfs3.4/fs/squashfs/inode.c   2008-08-26 
08:25:23.000000000 +0100
-@@ -0,0 +1,2173 @@
+diff -urN linux-2.6.27.orig/fs/squashfs/block.c 
linux-2.6.27/fs/squashfs/block.c
+--- linux-2.6.27.orig/fs/squashfs/block.c      1970-01-01 01:00:00.000000000 
+0100
++++ linux-2.6.27/fs/squashfs/block.c   2009-06-10 05:05:27.000000000 +0200
+@@ -0,0 +1,270 @@
 +/*
 + * Squashfs - a compressed read only filesystem for Linux
 + *
@@ -91,218 +43,135 @@
 + *
 + * 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.
++ * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 + *
-+ * inode.c
++ * block.c
++ */
++
++/*
++ * This file implements the low-level routines to read and decompress
++ * datablocks and metadata blocks.
 + */
 +
-+#include <linux/squashfs_fs.h>
-+#include <linux/module.h>
-+#include <linux/zlib.h>
 +#include <linux/fs.h>
-+#include <linux/squashfs_fs_sb.h>
-+#include <linux/squashfs_fs_i.h>
-+#include <linux/buffer_head.h>
 +#include <linux/vfs.h>
-+#include <linux/vmalloc.h>
-+#include <linux/spinlock.h>
-+#include <linux/smp_lock.h>
-+#include <linux/exportfs.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"
 +
-+static struct dentry *squashfs_fh_to_dentry(struct super_block *s,
-+              struct fid *fid, int fh_len, int fh_type);
-+static struct dentry *squashfs_fh_to_parent(struct super_block *s,
-+              struct fid *fid, int fh_len, int fh_type);
-+static struct dentry *squashfs_get_parent(struct dentry *child);
-+static int squashfs_read_inode(struct inode *i, squashfs_inode_t inode);
-+static int squashfs_statfs(struct dentry *, struct kstatfs *);
-+static int squashfs_symlink_readpage(struct file *file, struct page *page);
-+static long long read_blocklist(struct inode *inode, int index,
-+                              int readahead_blks, char *block_list,
-+                              unsigned short **block_p, unsigned int *bsize);
-+static int squashfs_readpage(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 int squashfs_remount(struct super_block *s, int *flags, char *data);
-+static void squashfs_put_super(struct super_block *);
-+static int squashfs_get_sb(struct file_system_type *,int, const char *, void 
*,
-+                              struct vfsmount *);
-+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 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 const 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_super_ops = {
-+      .alloc_inode = squashfs_alloc_inode,
-+      .destroy_inode = squashfs_destroy_inode,
-+      .statfs = squashfs_statfs,
-+      .put_super = squashfs_put_super,
-+      .remount_fs = squashfs_remount
-+};
-+
-+static struct export_operations squashfs_export_ops = {
-+      .fh_to_dentry = squashfs_fh_to_dentry,
-+      .fh_to_parent = squashfs_fh_to_parent,
-+      .get_parent = squashfs_get_parent
-+};
-+
-+SQSH_EXTERN const struct address_space_operations squashfs_symlink_aops = {
-+      .readpage = squashfs_symlink_readpage
-+};
-+
-+SQSH_EXTERN const struct address_space_operations squashfs_aops = {
-+      .readpage = squashfs_readpage
-+};
-+
-+static const 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)
++/*
++ * Read the metadata block length, this is stored in the first two
++ * bytes of the metadata block.
++ */
++static struct buffer_head *get_block_length(struct super_block *sb,
++                      u64 *cur_index, int *offset, int *length)
 +{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      unsigned short temp;
++      struct squashfs_sb_info *msblk = sb->s_fs_info;
 +      struct buffer_head *bh;
 +
-+      if (!(bh = sb_bread(s, *cur_index)))
-+              goto out;
++      bh = sb_bread(sb, *cur_index);
++      if (bh == NULL)
++              return NULL;
 +
 +      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;
++              *length = (unsigned char) bh->b_data[*offset];
++              put_bh(bh);
++              bh = sb_bread(sb, ++(*cur_index));
++              if (bh == NULL)
++                      return NULL;
++              *length |= (unsigned char) bh->b_data[0] << 8;
 +              *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;
++              *length = (unsigned char) bh->b_data[*offset] |
++                      (unsigned char) bh->b_data[*offset + 1] << 8;
 +              *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, int srclength)
++/*
++ * Read and decompress a metadata block or datablock.  Length is non-zero
++ * if a datablock is being read (the size is stored elsewhere in the
++ * filesystem), otherwise the length is obtained from the first two bytes of
++ * the metadata block.  A bit in the length field indicates if the block
++ * is stored uncompressed in the filesystem (usually because compression
++ * generated a larger block - this does occasionally happen with zlib).
++ */
++int squashfs_read_data(struct super_block *sb, void **buffer, u64 index,
++                      int length, u64 *next_index, int srclength, int pages)
 +{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
++      struct squashfs_sb_info *msblk = sb->s_fs_info;
 +      struct buffer_head **bh;
-+      unsigned int offset = index & ((1 << msblk->devblksize_log2) - 1);
-+      unsigned int cur_index = index >> msblk->devblksize_log2;
-+      int bytes, avail_bytes, b = 0, k = 0;
-+      unsigned int compressed;
-+      unsigned int c_byte = length;
++      int offset = index & ((1 << msblk->devblksize_log2) - 1);
++      u64 cur_index = index >> msblk->devblksize_log2;
++      int bytes, compressed, b = 0, k = 0, page = 0, avail;
 +
-+      bh = kmalloc(((sblk->block_size >> msblk->devblksize_log2) + 1) *
-+                                                              sizeof(struct 
buffer_head *), GFP_KERNEL);
++
++      bh = kcalloc((msblk->block_size >> msblk->devblksize_log2) + 1,
++                              sizeof(*bh), GFP_KERNEL);
 +      if (bh == NULL)
-+              goto read_failure;
++              return -ENOMEM;
 +
-+      if (c_byte) {
++      if (length) {
++              /*
++               * Datablock.
++               */
 +              bytes = -offset;
-+              compressed = SQUASHFS_COMPRESSED_BLOCK(c_byte);
-+              c_byte = SQUASHFS_COMPRESSED_SIZE_BLOCK(c_byte);
++              compressed = SQUASHFS_COMPRESSED_BLOCK(length);
++              length = SQUASHFS_COMPRESSED_SIZE_BLOCK(length);
++              if (next_index)
++                      *next_index = index + length;
 +
-+              TRACE("Block @ 0x%llx, %scompressed size %d, src size %d\n", 
index,
-+                                      compressed ? "" : "un", (unsigned int) 
c_byte, srclength);
++              TRACE("Block @ 0x%llx, %scompressed size %d, src size %d\n",
++                      index, compressed ? "" : "un", length, srclength);
 +
-+              if (c_byte > srclength || index < 0 || (index + c_byte) > 
sblk->bytes_used)
++              if (length < 0 || length > srclength ||
++                              (index + length) > msblk->bytes_used)
 +                      goto read_failure;
 +
-+              for (b = 0; bytes < (int) c_byte; b++, cur_index++) {
-+                      bh[b] = sb_getblk(s, cur_index);
++              for (b = 0; bytes < length; b++, cur_index++) {
++                      bh[b] = sb_getblk(sb, cur_index);
 +                      if (bh[b] == NULL)
 +                              goto block_release;
 +                      bytes += msblk->devblksize;
 +              }
 +              ll_rw_block(READ, b, bh);
 +      } else {
-+              if (index < 0 || (index + 2) > sblk->bytes_used)
++              /*
++               * Metadata block.
++               */
++              if ((index + 2) > msblk->bytes_used)
 +                      goto read_failure;
 +
-+              bh[0] = get_block_length(s, &cur_index, &offset, &c_byte);
++              bh[0] = get_block_length(sb, &cur_index, &offset, &length);
 +              if (bh[0] == NULL)
 +                      goto read_failure;
 +              b = 1;
 +
 +              bytes = msblk->devblksize - offset;
-+              compressed = SQUASHFS_COMPRESSED(c_byte);
-+              c_byte = SQUASHFS_COMPRESSED_SIZE(c_byte);
++              compressed = SQUASHFS_COMPRESSED(length);
++              length = SQUASHFS_COMPRESSED_SIZE(length);
++              if (next_index)
++                      *next_index = index + length + 2;
 +
-+              TRACE("Block @ 0x%llx, %scompressed size %d\n", index, 
compressed
-+                                      ? "" : "un", (unsigned int) c_byte);
++              TRACE("Block @ 0x%llx, %scompressed size %d\n", index,
++                              compressed ? "" : "un", length);
 +
-+              if (c_byte > srclength || (index + c_byte) > sblk->bytes_used)
++              if (length < 0 || length > srclength ||
++                                      (index + length) > msblk->bytes_used)
 +                      goto block_release;
 +
-+              for (; bytes < c_byte; b++) {
-+                      bh[b] = sb_getblk(s, ++cur_index);
++              for (; bytes < length; b++) {
++                      bh[b] = sb_getblk(sb, ++cur_index);
 +                      if (bh[b] == NULL)
 +                              goto block_release;
 +                      bytes += msblk->devblksize;
@@ -311,108 +180,192 @@
 +      }
 +
 +      if (compressed) {
-+              int zlib_err = 0;
++              int zlib_err = 0, zlib_init = 0;
 +
 +              /*
-+              * uncompress block
-+              */
++               * Uncompress block.
++               */
 +
 +              mutex_lock(&msblk->read_data_mutex);
 +
-+              msblk->stream.next_out = buffer;
-+              msblk->stream.avail_out = srclength;
++              msblk->stream.avail_out = 0;
++              msblk->stream.avail_in = 0;
 +
-+              for (bytes = 0; k < b; k++) {
-+                      avail_bytes = min(c_byte - bytes, msblk->devblksize - 
offset);
++              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;
++
++                              if (avail == 0) {
++                                      offset = 0;
++                                      put_bh(bh[k++]);
++                                      continue;
++                              }
 +
-+                      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;
++                              offset = 0;
++                      }
 +
-+                      msblk->stream.next_in = bh[k]->b_data + offset;
-+                      msblk->stream.avail_in = avail_bytes;
++                      if (msblk->stream.avail_out == 0 && page < pages) {
++                              msblk->stream.next_out = buffer[page++];
++                              msblk->stream.avail_out = PAGE_CACHE_SIZE;
++                      }
 +
-+                      if (k == 0) {
++                      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);
++                                      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_init = 1;
 +                      }
 +
-+                      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;
-+                      }
++                      zlib_err = zlib_inflate(&msblk->stream, Z_SYNC_FLUSH);
 +
-+                      bytes += avail_bytes;
-+                      offset = 0;
-+                      brelse(bh[k]);
-+              }
++                      if (msblk->stream.avail_in == 0 && k < b)
++                              put_bh(bh[k++]);
++              } while (zlib_err == Z_OK);
 +
-+              if (zlib_err != Z_STREAM_END)
++              if (zlib_err != Z_STREAM_END) {
++                      ERROR("zlib_inflate error, data probably corrupt\n");
 +                      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);
++                      ERROR("zlib_inflate error, data probably corrupt\n");
 +                      goto release_mutex;
 +              }
-+              bytes = msblk->stream.total_out;
++              length = msblk->stream.total_out;
 +              mutex_unlock(&msblk->read_data_mutex);
 +      } else {
-+              int i;
++              /*
++               * Block is uncompressed.
++               */
++              int i, in, pg_offset = 0;
 +
-+              for(i = 0; i < b; i++) {
++              for (i = 0; i < b; i++) {
 +                      wait_on_buffer(bh[i]);
 +                      if (!buffer_uptodate(bh[i]))
 +                              goto block_release;
 +              }
 +
-+              for (bytes = 0; k < b; k++) {
-+                      avail_bytes = min(c_byte - bytes, msblk->devblksize - 
offset);
-+
-+                      memcpy(buffer + bytes, bh[k]->b_data + offset, 
avail_bytes);
-+                      bytes += avail_bytes;
++              for (bytes = length; k < b; k++) {
++                      in = min(bytes, msblk->devblksize - offset);
++                      bytes -= in;
++                      while (in) {
++                              if (pg_offset == PAGE_CACHE_SIZE) {
++                                      page++;
++                                      pg_offset = 0;
++                              }
++                              avail = min_t(int, in, PAGE_CACHE_SIZE -
++                                              pg_offset);
++                              memcpy(buffer[page] + pg_offset,
++                                              bh[k]->b_data + offset, avail);
++                              in -= avail;
++                              pg_offset += avail;
++                              offset += avail;
++                      }
 +                      offset = 0;
-+                      brelse(bh[k]);
++                      put_bh(bh[k]);
 +              }
 +      }
 +
-+      if (next_index)
-+              *next_index = index + c_byte + (length ? 0 :
-+                              (SQUASHFS_CHECK_DATA(msblk->sblk.flags) ? 3 : 
2));
-+
 +      kfree(bh);
-+      return bytes;
++      return length;
 +
 +release_mutex:
 +      mutex_unlock(&msblk->read_data_mutex);
 +
 +block_release:
 +      for (; k < b; k++)
-+              brelse(bh[k]);
++              put_bh(bh[k]);
 +
 +read_failure:
-+      ERROR("sb_bread failed reading block 0x%x\n", cur_index);
++      ERROR("squashfs_read_data failed to read block 0x%llx\n",
++                                      (unsigned long long) index);
 +      kfree(bh);
-+      return 0;
++      return -EIO;
 +}
+diff -urN linux-2.6.27.orig/fs/squashfs/cache.c 
linux-2.6.27/fs/squashfs/cache.c
+--- linux-2.6.27.orig/fs/squashfs/cache.c      1970-01-01 01:00:00.000000000 
+0100
++++ linux-2.6.27/fs/squashfs/cache.c   2009-06-10 05:05:27.000000000 +0200
+@@ -0,0 +1,413 @@
++/*
++ * Squashfs - a compressed read only filesystem for Linux
++ *
++ * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008
++ * Phillip Lougher <phil...@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.
++ *
++ * cache.c
++ */
++
++/*
++ * Blocks in Squashfs are compressed.  To avoid repeatedly decompressing
++ * recently accessed data Squashfs uses two small metadata and fragment 
caches.
<<Diff was trimmed, longer than 597 lines>>

---- CVS-web:
    
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/kernel-bare-grsecurity/linux-2.6.27-squashfs.patch?r1=1.1&r2=1.2&f=u

_______________________________________________
pld-cvs-commit mailing list
pld-cvs-commit@lists.pld-linux.org
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to