diff options
| -rw-r--r-- | MAINTAINERS | 2 | ||||
| -rw-r--r-- | fs/squashfs/block.c | 2 | ||||
| -rw-r--r-- | fs/squashfs/cache.c | 31 | ||||
| -rw-r--r-- | fs/squashfs/decompressor.c | 2 | ||||
| -rw-r--r-- | fs/squashfs/decompressor.h | 2 | ||||
| -rw-r--r-- | fs/squashfs/dir.c | 2 | ||||
| -rw-r--r-- | fs/squashfs/export.c | 42 | ||||
| -rw-r--r-- | fs/squashfs/file.c | 2 | ||||
| -rw-r--r-- | fs/squashfs/fragment.c | 37 | ||||
| -rw-r--r-- | fs/squashfs/id.c | 42 | ||||
| -rw-r--r-- | fs/squashfs/inode.c | 2 | ||||
| -rw-r--r-- | fs/squashfs/namei.c | 2 | ||||
| -rw-r--r-- | fs/squashfs/squashfs.h | 10 | ||||
| -rw-r--r-- | fs/squashfs/squashfs_fs.h | 2 | ||||
| -rw-r--r-- | fs/squashfs/squashfs_fs_i.h | 2 | ||||
| -rw-r--r-- | fs/squashfs/squashfs_fs_sb.h | 2 | ||||
| -rw-r--r-- | fs/squashfs/super.c | 112 | ||||
| -rw-r--r-- | fs/squashfs/symlink.c | 2 | ||||
| -rw-r--r-- | fs/squashfs/xattr.c | 2 | ||||
| -rw-r--r-- | fs/squashfs/xattr.h | 3 | ||||
| -rw-r--r-- | fs/squashfs/xattr_id.c | 47 | ||||
| -rw-r--r-- | fs/squashfs/xz_wrapper.c | 2 | ||||
| -rw-r--r-- | fs/squashfs/zlib_wrapper.c | 2 |
23 files changed, 203 insertions, 151 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index d1a1465bec02..c4fc1daddcb6 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -6001,7 +6001,7 @@ F: Documentation/filesystems/spufs.txt | |||
| 6001 | F: arch/powerpc/platforms/cell/spufs/ | 6001 | F: arch/powerpc/platforms/cell/spufs/ |
| 6002 | 6002 | ||
| 6003 | SQUASHFS FILE SYSTEM | 6003 | SQUASHFS FILE SYSTEM |
| 6004 | M: Phillip Lougher <phillip@lougher.demon.co.uk> | 6004 | M: Phillip Lougher <phillip@squashfs.org.uk> |
| 6005 | L: squashfs-devel@lists.sourceforge.net (subscribers-only) | 6005 | L: squashfs-devel@lists.sourceforge.net (subscribers-only) |
| 6006 | W: http://squashfs.org.uk | 6006 | W: http://squashfs.org.uk |
| 6007 | S: Maintained | 6007 | S: Maintained |
diff --git a/fs/squashfs/block.c b/fs/squashfs/block.c index 8ab48bc2fa7d..ed0eb2a921f4 100644 --- a/fs/squashfs/block.c +++ b/fs/squashfs/block.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * Squashfs - a compressed read only filesystem for Linux | 2 | * Squashfs - a compressed read only filesystem for Linux |
| 3 | * | 3 | * |
| 4 | * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008 | 4 | * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008 |
| 5 | * Phillip Lougher <phillip@lougher.demon.co.uk> | 5 | * Phillip Lougher <phillip@squashfs.org.uk> |
| 6 | * | 6 | * |
| 7 | * This program is free software; you can redistribute it and/or | 7 | * This program is free software; you can redistribute it and/or |
| 8 | * modify it under the terms of the GNU General Public License | 8 | * modify it under the terms of the GNU General Public License |
diff --git a/fs/squashfs/cache.c b/fs/squashfs/cache.c index 4b5a3fbb1f1f..f744be98cd5a 100644 --- a/fs/squashfs/cache.c +++ b/fs/squashfs/cache.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * Squashfs - a compressed read only filesystem for Linux | 2 | * Squashfs - a compressed read only filesystem for Linux |
| 3 | * | 3 | * |
| 4 | * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008 | 4 | * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008 |
| 5 | * Phillip Lougher <phillip@lougher.demon.co.uk> | 5 | * Phillip Lougher <phillip@squashfs.org.uk> |
| 6 | * | 6 | * |
| 7 | * This program is free software; you can redistribute it and/or | 7 | * This program is free software; you can redistribute it and/or |
| 8 | * modify it under the terms of the GNU General Public License | 8 | * modify it under the terms of the GNU General Public License |
| @@ -393,19 +393,36 @@ struct squashfs_cache_entry *squashfs_get_datablock(struct super_block *sb, | |||
| 393 | /* | 393 | /* |
| 394 | * Read a filesystem table (uncompressed sequence of bytes) from disk | 394 | * Read a filesystem table (uncompressed sequence of bytes) from disk |
| 395 | */ | 395 | */ |
| 396 | int squashfs_read_table(struct super_block *sb, void *buffer, u64 block, | 396 | void *squashfs_read_table(struct super_block *sb, u64 block, int length) |
| 397 | int length) | ||
| 398 | { | 397 | { |
| 399 | int pages = (length + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; | 398 | int pages = (length + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; |
| 400 | int i, res; | 399 | int i, res; |
| 401 | void **data = kcalloc(pages, sizeof(void *), GFP_KERNEL); | 400 | void *table, *buffer, **data; |
| 402 | if (data == NULL) | 401 | |
| 403 | return -ENOMEM; | 402 | table = buffer = kmalloc(length, GFP_KERNEL); |
| 403 | if (table == NULL) | ||
| 404 | return ERR_PTR(-ENOMEM); | ||
| 405 | |||
| 406 | data = kcalloc(pages, sizeof(void *), GFP_KERNEL); | ||
| 407 | if (data == NULL) { | ||
| 408 | res = -ENOMEM; | ||
| 409 | goto failed; | ||
| 410 | } | ||
| 404 | 411 | ||
| 405 | for (i = 0; i < pages; i++, buffer += PAGE_CACHE_SIZE) | 412 | for (i = 0; i < pages; i++, buffer += PAGE_CACHE_SIZE) |
| 406 | data[i] = buffer; | 413 | data[i] = buffer; |
| 414 | |||
| 407 | res = squashfs_read_data(sb, data, block, length | | 415 | res = squashfs_read_data(sb, data, block, length | |
| 408 | SQUASHFS_COMPRESSED_BIT_BLOCK, NULL, length, pages); | 416 | SQUASHFS_COMPRESSED_BIT_BLOCK, NULL, length, pages); |
| 417 | |||
| 409 | kfree(data); | 418 | kfree(data); |
| 410 | return res; | 419 | |
| 420 | if (res < 0) | ||
| 421 | goto failed; | ||
| 422 | |||
| 423 | return table; | ||
| 424 | |||
| 425 | failed: | ||
| 426 | kfree(table); | ||
| 427 | return ERR_PTR(res); | ||
| 411 | } | 428 | } |
diff --git a/fs/squashfs/decompressor.c b/fs/squashfs/decompressor.c index e921bd213738..9f1b0bb96f13 100644 --- a/fs/squashfs/decompressor.c +++ b/fs/squashfs/decompressor.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * Squashfs - a compressed read only filesystem for Linux | 2 | * Squashfs - a compressed read only filesystem for Linux |
| 3 | * | 3 | * |
| 4 | * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 | 4 | * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 |
| 5 | * Phillip Lougher <phillip@lougher.demon.co.uk> | 5 | * Phillip Lougher <phillip@squashfs.org.uk> |
| 6 | * | 6 | * |
| 7 | * This program is free software; you can redistribute it and/or | 7 | * This program is free software; you can redistribute it and/or |
| 8 | * modify it under the terms of the GNU General Public License | 8 | * modify it under the terms of the GNU General Public License |
diff --git a/fs/squashfs/decompressor.h b/fs/squashfs/decompressor.h index 099745ad5691..8ba70cff09a6 100644 --- a/fs/squashfs/decompressor.h +++ b/fs/squashfs/decompressor.h | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * Squashfs - a compressed read only filesystem for Linux | 4 | * Squashfs - a compressed read only filesystem for Linux |
| 5 | * | 5 | * |
| 6 | * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 | 6 | * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 |
| 7 | * Phillip Lougher <phillip@lougher.demon.co.uk> | 7 | * Phillip Lougher <phillip@squashfs.org.uk> |
| 8 | * | 8 | * |
| 9 | * This program is free software; you can redistribute it and/or | 9 | * This program is free software; you can redistribute it and/or |
| 10 | * modify it under the terms of the GNU General Public License | 10 | * modify it under the terms of the GNU General Public License |
diff --git a/fs/squashfs/dir.c b/fs/squashfs/dir.c index 3f79cd1d0c19..9dfe2ce0fb70 100644 --- a/fs/squashfs/dir.c +++ b/fs/squashfs/dir.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * Squashfs - a compressed read only filesystem for Linux | 2 | * Squashfs - a compressed read only filesystem for Linux |
| 3 | * | 3 | * |
| 4 | * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008 | 4 | * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008 |
| 5 | * Phillip Lougher <phillip@lougher.demon.co.uk> | 5 | * Phillip Lougher <phillip@squashfs.org.uk> |
| 6 | * | 6 | * |
| 7 | * This program is free software; you can redistribute it and/or | 7 | * This program is free software; you can redistribute it and/or |
| 8 | * modify it under the terms of the GNU General Public License | 8 | * modify it under the terms of the GNU General Public License |
diff --git a/fs/squashfs/export.c b/fs/squashfs/export.c index 7f93d5a9ee05..730c56248c9b 100644 --- a/fs/squashfs/export.c +++ b/fs/squashfs/export.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * Squashfs - a compressed read only filesystem for Linux | 2 | * Squashfs - a compressed read only filesystem for Linux |
| 3 | * | 3 | * |
| 4 | * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008 | 4 | * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008 |
| 5 | * Phillip Lougher <phillip@lougher.demon.co.uk> | 5 | * Phillip Lougher <phillip@squashfs.org.uk> |
| 6 | * | 6 | * |
| 7 | * This program is free software; you can redistribute it and/or | 7 | * This program is free software; you can redistribute it and/or |
| 8 | * modify it under the terms of the GNU General Public License | 8 | * modify it under the terms of the GNU General Public License |
| @@ -121,30 +121,38 @@ static struct dentry *squashfs_get_parent(struct dentry *child) | |||
| 121 | * Read uncompressed inode lookup table indexes off disk into memory | 121 | * Read uncompressed inode lookup table indexes off disk into memory |
| 122 | */ | 122 | */ |
| 123 | __le64 *squashfs_read_inode_lookup_table(struct super_block *sb, | 123 | __le64 *squashfs_read_inode_lookup_table(struct super_block *sb, |
| 124 | u64 lookup_table_start, unsigned int inodes) | 124 | u64 lookup_table_start, u64 next_table, unsigned int inodes) |
| 125 | { | 125 | { |
| 126 | unsigned int length = SQUASHFS_LOOKUP_BLOCK_BYTES(inodes); | 126 | unsigned int length = SQUASHFS_LOOKUP_BLOCK_BYTES(inodes); |
| 127 | __le64 *inode_lookup_table; | 127 | __le64 *table; |
| 128 | int err; | ||
| 129 | 128 | ||
| 130 | TRACE("In read_inode_lookup_table, length %d\n", length); | 129 | TRACE("In read_inode_lookup_table, length %d\n", length); |
| 131 | 130 | ||
| 132 | /* Allocate inode lookup table indexes */ | 131 | /* Sanity check values */ |
| 133 | inode_lookup_table = kmalloc(length, GFP_KERNEL); | 132 | |
| 134 | if (inode_lookup_table == NULL) { | 133 | /* there should always be at least one inode */ |
| 135 | ERROR("Failed to allocate inode lookup table\n"); | 134 | if (inodes == 0) |
