- make_bad_inode(i);
- return 0;
-}
-
-
-static int read_inode_lookup_table(struct super_block *s)
-{
- struct squashfs_sb_info *msblk = s->s_fs_info;
- struct squashfs_super_block *sblk = &msblk->sblk;
- unsigned int length = SQUASHFS_LOOKUP_BLOCK_BYTES(sblk->inodes);
-
- TRACE("In read_inode_lookup_table, length %d\n", length);
-
- /* Allocate inode lookup table */
- if (!(msblk->inode_lookup_table = kmalloc(length, GFP_KERNEL))) {
- ERROR("Failed to allocate inode lookup table\n");
- return 0;
- }
-
- if (!squashfs_read_data(s, (char *) msblk->inode_lookup_table,
- sblk->lookup_table_start, length |
- SQUASHFS_COMPRESSED_BIT_BLOCK, NULL, length)) {
- ERROR("unable to read inode lookup table\n");
- return 0;
- }
-
- if (msblk->swap) {
- int i;
- long long block;
-
- for (i = 0; i < SQUASHFS_LOOKUP_BLOCKS(sblk->inodes); i++) {
- SQUASHFS_SWAP_LOOKUP_BLOCKS((&block),
- &msblk->inode_lookup_table[i], 1);
- msblk->inode_lookup_table[i] = block;
- }
- }
-
- return 1;
-}
-
-
-static int read_fragment_index_table(struct super_block *s)
-{
- struct squashfs_sb_info *msblk = s->s_fs_info;
- struct squashfs_super_block *sblk = &msblk->sblk;
- unsigned int length = SQUASHFS_FRAGMENT_INDEX_BYTES(sblk->fragments);
-
- if(length == 0)
- return 1;
-
- /* Allocate fragment index table */
- if (!(msblk->fragment_index = kmalloc(length, GFP_KERNEL))) {
- ERROR("Failed to allocate fragment index table\n");
- return 0;
- }
-
- if (!squashfs_read_data(s, (char *) msblk->fragment_index,
- sblk->fragment_table_start, length |
- SQUASHFS_COMPRESSED_BIT_BLOCK, NULL, length)) {
- ERROR("unable to read fragment index table\n");
- return 0;
- }
-
- if (msblk->swap) {
- int i;
- long long fragment;
-
- for (i = 0; i < SQUASHFS_FRAGMENT_INDEXES(sblk->fragments); i++) {
- SQUASHFS_SWAP_FRAGMENT_INDEXES((&fragment),
- &msblk->fragment_index[i], 1);
- msblk->fragment_index[i] = fragment;
- }
- }
-
- return 1;
-}
-
-
-static int supported_squashfs_filesystem(struct squashfs_sb_info *msblk, int silent)
-{
- struct squashfs_super_block *sblk = &msblk->sblk;
-
- msblk->read_inode = squashfs_read_inode;
- msblk->read_blocklist = read_blocklist;
- msblk->read_fragment_index_table = read_fragment_index_table;
-
- if (sblk->s_major == 1) {
- if (!squashfs_1_0_supported(msblk)) {
- SERROR("Major/Minor mismatch, Squashfs 1.0 filesystems "
- "are unsupported\n");
- SERROR("Please recompile with "
- "Squashfs 1.0 support enabled\n");
- return 0;
- }
- } else if (sblk->s_major == 2) {
- if (!squashfs_2_0_supported(msblk)) {
- SERROR("Major/Minor mismatch, Squashfs 2.0 filesystems "
- "are unsupported\n");
- SERROR("Please recompile with "
- "Squashfs 2.0 support enabled\n");
- return 0;
- }
- } else if(sblk->s_major != SQUASHFS_MAJOR || sblk->s_minor >
- SQUASHFS_MINOR) {
- SERROR("Major/Minor mismatch, trying to mount newer %d.%d "
- "filesystem\n", sblk->s_major, sblk->s_minor);
- SERROR("Please update your kernel\n");
- return 0;
- }
-
- return 1;