Lines Matching +full:squashfs +full:- +full:root
2 * Squashfs - a compressed read only filesystem for Linux
19 * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
41 #include "squashfs.h"
56 static DECLARE_FSTYPE_DEV(squashfs_fs_type, "squashfs", squashfs_read_super);
91 struct squashfs_sb_info *msblk = &s->u.squashfs_sb; in get_block_length()
98 if (msblk->devblksize - *offset == 1) { in get_block_length()
99 if (msblk->swap) in get_block_length()
101 (bh->b_data + *offset)); in get_block_length()
104 (bh->b_data + *offset)); in get_block_length()
108 if (msblk->swap) in get_block_length()
110 bh->b_data); in get_block_length()
113 bh->b_data); in get_block_length()
117 if (msblk->swap) { in get_block_length()
119 (bh->b_data + *offset)); in get_block_length()
121 (bh->b_data + *offset + 1)); in get_block_length()
124 (bh->b_data + *offset)); in get_block_length()
126 (bh->b_data + *offset + 1)); in get_block_length()
132 if (SQUASHFS_CHECK_DATA(msblk->sblk.flags)) { in get_block_length()
133 if (*offset == msblk->devblksize) { in get_block_length()
139 if (*((unsigned char *) (bh->b_data + *offset)) != in get_block_length()
159 struct squashfs_sb_info *msblk = &s->u.squashfs_sb; in squashfs_read_data()
160 struct buffer_head *bh[((SQUASHFS_FILE_MAX_SIZE - 1) >> in squashfs_read_data()
161 msblk->devblksize_log2) + 2]; in squashfs_read_data()
162 unsigned int offset = index & ((1 << msblk->devblksize_log2) - 1); in squashfs_read_data()
163 unsigned int cur_index = index >> msblk->devblksize_log2; in squashfs_read_data()
170 bytes = msblk->devblksize - offset; in squashfs_read_data()
172 c_buffer = compressed ? msblk->read_data : buffer; in squashfs_read_data()
184 bytes += msblk->devblksize; in squashfs_read_data()
192 bytes = msblk->devblksize - offset; in squashfs_read_data()
194 c_buffer = compressed ? msblk->read_data : buffer; in squashfs_read_data()
203 bytes += msblk->devblksize; in squashfs_read_data()
205 ll_rw_block(READ, b - 1, bh + 1); in squashfs_read_data()
209 down(&msblk->read_data_mutex); in squashfs_read_data()
212 avail_bytes = (c_byte - bytes) > (msblk->devblksize - offset) ? in squashfs_read_data()
213 msblk->devblksize - offset : in squashfs_read_data()
214 c_byte - bytes; in squashfs_read_data()
218 memcpy(c_buffer + bytes, bh[k]->b_data + offset, avail_bytes); in squashfs_read_data()
230 msblk->stream.next_in = c_buffer; in squashfs_read_data()
231 msblk->stream.avail_in = c_byte; in squashfs_read_data()
232 msblk->stream.next_out = buffer; in squashfs_read_data()
233 msblk->stream.avail_out = msblk->read_size; in squashfs_read_data()
235 if (((zlib_err = zlib_inflateInit(&msblk->stream)) != Z_OK) || in squashfs_read_data()
236 ((zlib_err = zlib_inflate(&msblk->stream, Z_FINISH)) in squashfs_read_data()
238 zlib_inflateEnd(&msblk->stream)) != Z_OK)) { in squashfs_read_data()
243 bytes = msblk->stream.total_out; in squashfs_read_data()
245 up(&msblk->read_data_mutex); in squashfs_read_data()
250 (SQUASHFS_CHECK_DATA(msblk->sblk.flags) in squashfs_read_data()
255 while (--b >= 0) in squashfs_read_data()
269 struct squashfs_sb_info *msblk = &s->u.squashfs_sb; in squashfs_get_cached_block()
277 if (msblk->block_cache[i].block == block) in squashfs_get_cached_block()
280 down(&msblk->block_cache_mutex); in squashfs_get_cached_block()
284 for (i = msblk->next_cache, n = SQUASHFS_CACHED_BLKS; in squashfs_get_cached_block()
285 n ; n --, i = (i + 1) % in squashfs_get_cached_block()
287 if (msblk->block_cache[i].block != in squashfs_get_cached_block()
295 add_wait_queue(&msblk->waitq, &wait); in squashfs_get_cached_block()
297 up(&msblk->block_cache_mutex); in squashfs_get_cached_block()
300 remove_wait_queue(&msblk->waitq, &wait); in squashfs_get_cached_block()
303 msblk->next_cache = (i + 1) % SQUASHFS_CACHED_BLKS; in squashfs_get_cached_block()
305 if (msblk->block_cache[i].block == in squashfs_get_cached_block()
307 if (!(msblk->block_cache[i].data = in squashfs_get_cached_block()
312 up(&msblk->block_cache_mutex); in squashfs_get_cached_block()
317 msblk->block_cache[i].block = SQUASHFS_USED_BLK; in squashfs_get_cached_block()
318 up(&msblk->block_cache_mutex); in squashfs_get_cached_block()
320 if (!(msblk->block_cache[i].length = in squashfs_get_cached_block()
322 msblk->block_cache[i].data, in squashfs_get_cached_block()
329 down(&msblk->block_cache_mutex); in squashfs_get_cached_block()
330 wake_up(&msblk->waitq); in squashfs_get_cached_block()
331 msblk->block_cache[i].block = block; in squashfs_get_cached_block()
332 msblk->block_cache[i].next_index = next_index; in squashfs_get_cached_block()
336 if (msblk->block_cache[i].block != block) { in squashfs_get_cached_block()
337 up(&msblk->block_cache_mutex); in squashfs_get_cached_block()
341 if ((bytes = msblk->block_cache[i].length - offset) >= length) { in squashfs_get_cached_block()
343 memcpy(buffer, msblk->block_cache[i].data + in squashfs_get_cached_block()
345 if (msblk->block_cache[i].length - offset == length) { in squashfs_get_cached_block()
346 *next_block = msblk->block_cache[i].next_index; in squashfs_get_cached_block()
352 up(&msblk->block_cache_mutex); in squashfs_get_cached_block()
356 memcpy(buffer, msblk->block_cache[i].data + in squashfs_get_cached_block()
360 block = msblk->block_cache[i].next_index; in squashfs_get_cached_block()
361 up(&msblk->block_cache_mutex); in squashfs_get_cached_block()
362 length -= bytes; in squashfs_get_cached_block()
378 struct squashfs_sb_info *msblk = &s->u.squashfs_sb; in get_fragment_location()
380 msblk->fragment_index[SQUASHFS_FRAGMENT_INDEX(fragment)]; in get_fragment_location()
384 if (msblk->swap) { in get_fragment_location()
413 down(&msblk->fragment_mutex); in release_cached_fragment()
414 fragment->locked --; in release_cached_fragment()
415 wake_up(&msblk->fragment_wait_queue); in release_cached_fragment()
416 up(&msblk->fragment_mutex); in release_cached_fragment()
425 struct squashfs_sb_info *msblk = &s->u.squashfs_sb; in get_cached_fragment()
428 down(&msblk->fragment_mutex); in get_cached_fragment()
431 msblk->fragment[i].block != start_block; i++); in get_cached_fragment()
434 for (i = msblk->next_fragment, n = in get_cached_fragment()
436 msblk->fragment[i].locked; n--, i = (i + 1) % in get_cached_fragment()
443 add_wait_queue(&msblk->fragment_wait_queue, in get_cached_fragment()
446 up(&msblk->fragment_mutex); in get_cached_fragment()
449 remove_wait_queue(&msblk->fragment_wait_queue, in get_cached_fragment()
453 msblk->next_fragment = (msblk->next_fragment + 1) % in get_cached_fragment()
456 if (msblk->fragment[i].data == NULL) in get_cached_fragment()
457 if (!(msblk->fragment[i].data = SQUASHFS_ALLOC in get_cached_fragment()
461 up(&msblk->fragment_mutex); in get_cached_fragment()
465 msblk->fragment[i].block = SQUASHFS_INVALID_BLK; in get_cached_fragment()
466 msblk->fragment[i].locked = 1; in get_cached_fragment()
467 up(&msblk->fragment_mutex); in get_cached_fragment()
469 if (!(msblk->fragment[i].length = squashfs_read_data(s, in get_cached_fragment()
470 msblk->fragment[i].data, in get_cached_fragment()
474 msblk->fragment[i].locked = 0; in get_cached_fragment()
478 msblk->fragment[i].block = start_block; in get_cached_fragment()
480 i, msblk->fragment[i].block, in get_cached_fragment()
481 msblk->fragment[i].locked); in get_cached_fragment()
485 msblk->fragment[i].locked++; in get_cached_fragment()
486 up(&msblk->fragment_mutex); in get_cached_fragment()
488 msblk->fragment[i].block, in get_cached_fragment()
489 msblk->fragment[i].locked); in get_cached_fragment()
493 return &msblk->fragment[i]; in get_cached_fragment()
503 struct squashfs_sb_info *msblk = &s->u.squashfs_sb; in squashfs_new_inode()
507 i->i_ino = inodeb->inode_number; in squashfs_new_inode()
508 i->i_mtime = inodeb->mtime; in squashfs_new_inode()
509 i->i_atime = inodeb->mtime; in squashfs_new_inode()
510 i->i_ctime = inodeb->mtime; in squashfs_new_inode()
511 i->i_uid = msblk->uid[inodeb->uid]; in squashfs_new_inode()
512 i->i_mode = inodeb->mode; in squashfs_new_inode()
513 i->i_size = 0; in squashfs_new_inode()
514 if (inodeb->guid == SQUASHFS_GUIDS) in squashfs_new_inode()
515 i->i_gid = i->i_uid; in squashfs_new_inode()
517 i->i_gid = msblk->guid[inodeb->guid]; in squashfs_new_inode()
527 struct squashfs_sb_info *msblk = &s->u.squashfs_sb; in squashfs_iget()
528 struct squashfs_super_block *sblk = &msblk->sblk; in squashfs_iget()
530 sblk->inode_table_start; in squashfs_iget()
540 if (msblk->swap) { in squashfs_iget()
553 switch(inodeb->inode_type) { in squashfs_iget()
560 if (msblk->swap) { in squashfs_iget()
575 if (inodep->fragment != SQUASHFS_INVALID_FRAG && in squashfs_iget()
577 inodep->fragment, &frag_blk, &frag_size)) in squashfs_iget()
583 i->i_nlink = 1; in squashfs_iget()
584 i->i_size = inodep->file_size; in squashfs_iget()
585 i->i_fop = &generic_ro_fops; in squashfs_iget()
586 i->i_mode |= S_IFREG; in squashfs_iget()
587 i->i_blocks = ((i->i_size - 1) >> 9) + 1; in squashfs_iget()
588 i->i_blksize = PAGE_CACHE_SIZE; in squashfs_iget()
589 SQUASHFS_I(i)->u.s1.fragment_start_block = frag_blk; in squashfs_iget()
590 SQUASHFS_I(i)->u.s1.fragment_size = frag_size; in squashfs_iget()
591 SQUASHFS_I(i)->u.s1.fragment_offset = inodep->offset; in squashfs_iget()
592 SQUASHFS_I(i)->start_block = inodep->start_block; in squashfs_iget()
593 SQUASHFS_I(i)->u.s1.block_list_start = next_block; in squashfs_iget()
594 SQUASHFS_I(i)->offset = next_offset; in squashfs_iget()
595 if (sblk->block_size > 4096) in squashfs_iget()
596 i->i_data.a_ops = &squashfs_aops; in squashfs_iget()
598 i->i_data.a_ops = &squashfs_aops_4K; in squashfs_iget()
603 inodep->start_block, next_block, in squashfs_iget()
613 if (msblk->swap) { in squashfs_iget()
628 if (inodep->fragment != SQUASHFS_INVALID_FRAG && in squashfs_iget()
630 inodep->fragment, &frag_blk, &frag_size)) in squashfs_iget()
636 i->i_nlink = inodep->nlink; in squashfs_iget()
637 i->i_size = inodep->file_size; in squashfs_iget()
638 i->i_fop = &generic_ro_fops; in squashfs_iget()
639 i->i_mode |= S_IFREG; in squashfs_iget()
640 i->i_blocks = ((i->i_size - 1) >> 9) + 1; in squashfs_iget()
641 i->i_blksize = PAGE_CACHE_SIZE; in squashfs_iget()
642 SQUASHFS_I(i)->u.s1.fragment_start_block = frag_blk; in squashfs_iget()
643 SQUASHFS_I(i)->u.s1.fragment_size = frag_size; in squashfs_iget()
644 SQUASHFS_I(i)->u.s1.fragment_offset = inodep->offset; in squashfs_iget()
645 SQUASHFS_I(i)->start_block = inodep->start_block; in squashfs_iget()
646 SQUASHFS_I(i)->u.s1.block_list_start = next_block; in squashfs_iget()
647 SQUASHFS_I(i)->offset = next_offset; in squashfs_iget()
648 if (sblk->block_size > 4096) in squashfs_iget()
649 i->i_data.a_ops = &squashfs_aops; in squashfs_iget()
651 i->i_data.a_ops = &squashfs_aops_4K; in squashfs_iget()
656 inodep->start_block, next_block, in squashfs_iget()
664 if (msblk->swap) { in squashfs_iget()
681 i->i_nlink = inodep->nlink; in squashfs_iget()
682 i->i_size = inodep->file_size; in squashfs_iget()
683 i->i_op = &squashfs_dir_inode_ops; in squashfs_iget()
684 i->i_fop = &squashfs_dir_ops; in squashfs_iget()
685 i->i_mode |= S_IFDIR; in squashfs_iget()
686 SQUASHFS_I(i)->start_block = inodep->start_block; in squashfs_iget()
687 SQUASHFS_I(i)->offset = inodep->offset; in squashfs_iget()
688 SQUASHFS_I(i)->u.s2.directory_index_count = 0; in squashfs_iget()
689 SQUASHFS_I(i)->u.s2.parent_inode = inodep->parent_inode; in squashfs_iget()
693 offset, inodep->start_block, in squashfs_iget()
694 inodep->offset); in squashfs_iget()
701 if (msblk->swap) { in squashfs_iget()
719 i->i_nlink = inodep->nlink; in squashfs_iget()
720 i->i_size = inodep->file_size; in squashfs_iget()
721 i->i_op = &squashfs_dir_inode_ops; in squashfs_iget()
722 i->i_fop = &squashfs_dir_ops; in squashfs_iget()
723 i->i_mode |= S_IFDIR; in squashfs_iget()
724 SQUASHFS_I(i)->start_block = inodep->start_block; in squashfs_iget()
725 SQUASHFS_I(i)->offset = inodep->offset; in squashfs_iget()
726 SQUASHFS_I(i)->u.s2.directory_index_start = next_block; in squashfs_iget()
727 SQUASHFS_I(i)->u.s2.directory_index_offset = in squashfs_iget()
729 SQUASHFS_I(i)->u.s2.directory_index_count = in squashfs_iget()
730 inodep->i_count; in squashfs_iget()
731 SQUASHFS_I(i)->u.s2.parent_inode = inodep->parent_inode; in squashfs_iget()
736 inodep->start_block, inodep->offset); in squashfs_iget()
745 if (msblk->swap) { in squashfs_iget()
763 i->i_nlink = inodep->nlink; in squashfs_iget()
764 i->i_size = inodep->symlink_size; in squashfs_iget()
765 i->i_op = &page_symlink_inode_operations; in squashfs_iget()
766 i->i_data.a_ops = &squashfs_symlink_aops; in squashfs_iget()
767 i->i_mode |= S_IFLNK; in squashfs_iget()
768 SQUASHFS_I(i)->start_block = next_block; in squashfs_iget()
769 SQUASHFS_I(i)->offset = next_offset; in squashfs_iget()
782 if (msblk->swap) { in squashfs_iget()
799 i->i_nlink = inodep->nlink; in squashfs_iget()
800 i->i_mode |= (inodeb->inode_type == in squashfs_iget()
803 init_special_inode(i, i->i_mode, inodep->rdev); in squashfs_iget()
807 inodep->rdev); in squashfs_iget()
815 if (msblk->swap) { in squashfs_iget()
832 i->i_nlink = inodep->nlink; in squashfs_iget()
833 i->i_mode |= (inodeb->inode_type == SQUASHFS_FIFO_TYPE) in squashfs_iget()
835 init_special_inode(i, i->i_mode, 0); in squashfs_iget()
840 inodeb->inode_type); in squashfs_iget()
857 struct squashfs_sb_info *msblk = &s->u.squashfs_sb; in read_fragment_index_table()
858 struct squashfs_super_block *sblk = &msblk->sblk; in read_fragment_index_table()
860 if (!(msblk->fragment_index = kmalloc(SQUASHFS_FRAGMENT_INDEX_BYTES in read_fragment_index_table()
861 (sblk->fragments), GFP_KERNEL))) { in read_fragment_index_table()
866 if (SQUASHFS_FRAGMENT_INDEX_BYTES(sblk->fragments) && in read_fragment_index_table()
868 msblk->fragment_index, in read_fragment_index_table()
869 sblk->fragment_table_start, in read_fragment_index_table()
871 (sblk->fragments) | in read_fragment_index_table()
877 if (msblk->swap) { in read_fragment_index_table()
881 for (i = 0; i < SQUASHFS_FRAGMENT_INDEXES(sblk->fragments); in read_fragment_index_table()
884 &msblk->fragment_index[i], 1); in read_fragment_index_table()
885 msblk->fragment_index[i] = fragment; in read_fragment_index_table()
895 struct squashfs_super_block *sblk = &msblk->sblk; in supported_squashfs_filesystem()
897 msblk->iget = squashfs_iget; in supported_squashfs_filesystem()
898 msblk->read_blocklist = read_blocklist; in supported_squashfs_filesystem()
899 msblk->read_fragment_index_table = read_fragment_index_table; in supported_squashfs_filesystem()
901 if (sblk->s_major == 1) { in supported_squashfs_filesystem()
903 SERROR("Major/Minor mismatch, Squashfs 1.0 filesystems " in supported_squashfs_filesystem()
906 "Squashfs 1.0 support enabled\n"); in supported_squashfs_filesystem()
909 } else if (sblk->s_major == 2) { in supported_squashfs_filesystem()
911 SERROR("Major/Minor mismatch, Squashfs 2.0 filesystems " in supported_squashfs_filesystem()
914 "Squashfs 2.0 support enabled\n"); in supported_squashfs_filesystem()
917 } else if(sblk->s_major != SQUASHFS_MAJOR || sblk->s_minor > in supported_squashfs_filesystem()
920 "filesystem\n", sblk->s_major, sblk->s_minor); in supported_squashfs_filesystem()
932 kdev_t dev = s->s_dev; in squashfs_read_super()
933 struct squashfs_sb_info *msblk = &s->u.squashfs_sb; in squashfs_read_super()
934 struct squashfs_super_block *sblk = &msblk->sblk; in squashfs_read_super()
936 struct inode *root; in squashfs_read_super() local
938 if (!(msblk->stream.workspace = vmalloc(zlib_inflate_workspacesize()))) { in squashfs_read_super()
943 msblk->devblksize = get_hardsect_size(dev); in squashfs_read_super()
944 if(msblk->devblksize < BLOCK_SIZE) in squashfs_read_super()
945 msblk->devblksize = BLOCK_SIZE; in squashfs_read_super()
946 msblk->devblksize_log2 = ffz(~msblk->devblksize); in squashfs_read_super()
947 set_blocksize(dev, msblk->devblksize); in squashfs_read_super()
948 s->s_blocksize = msblk->devblksize; in squashfs_read_super()
949 s->s_blocksize_bits = msblk->devblksize_log2; in squashfs_read_super()
951 init_MUTEX(&msblk->read_data_mutex); in squashfs_read_super()
952 init_MUTEX(&msblk->read_page_mutex); in squashfs_read_super()
953 init_MUTEX(&msblk->block_cache_mutex); in squashfs_read_super()
954 init_MUTEX(&msblk->fragment_mutex); in squashfs_read_super()
956 init_waitqueue_head(&msblk->waitq); in squashfs_read_super()
957 init_waitqueue_head(&msblk->fragment_wait_queue); in squashfs_read_super()
966 /* Check it is a SQUASHFS superblock */ in squashfs_read_super()
967 msblk->swap = 0; in squashfs_read_super()
968 if ((s->s_magic = sblk->s_magic) != SQUASHFS_MAGIC) { in squashfs_read_super()
969 if (sblk->s_magic == SQUASHFS_MAGIC_SWAP) { in squashfs_read_super()
972 WARNING("Mounting a different endian SQUASHFS " in squashfs_read_super()
977 msblk->swap = 1; in squashfs_read_super()
979 SERROR("Can't find a SQUASHFS superblock on %s\n", in squashfs_read_super()
992 (sblk->flags) ? "un" : ""); in squashfs_read_super()
994 SQUASHFS_UNCOMPRESSED_DATA(sblk->flags) in squashfs_read_super()
997 SQUASHFS_CHECK_DATA(sblk->flags) ? in squashfs_read_super()
999 TRACE("Filesystem size %lld bytes\n", sblk->bytes_used); in squashfs_read_super()
1000 TRACE("Block size %d\n", sblk->block_size); in squashfs_read_super()
1001 TRACE("Number of inodes %d\n", sblk->inodes); in squashfs_read_super()
1002 if (sblk->s_major > 1) in squashfs_read_super()
1003 TRACE("Number of fragments %d\n", sblk->fragments); in squashfs_read_super()
1004 TRACE("Number of uids %d\n", sblk->no_uids); in squashfs_read_super()
1005 TRACE("Number of gids %d\n", sblk->no_guids); in squashfs_read_super()
1006 TRACE("sblk->inode_table_start %llx\n", sblk->inode_table_start); in squashfs_read_super()
1007 TRACE("sblk->directory_table_start %llx\n", sblk->directory_table_start); in squashfs_read_super()
1008 if (sblk->s_major > 1) in squashfs_read_super()
1009 TRACE("sblk->fragment_table_start %llx\n", in squashfs_read_super()
1010 sblk->fragment_table_start); in squashfs_read_super()
1011 TRACE("sblk->uid_start %llx\n", sblk->uid_start); in squashfs_read_super()
1013 s->s_flags |= MS_RDONLY; in squashfs_read_super()
1014 s->s_op = &squashfs_ops; in squashfs_read_super()
1017 if (!(msblk->block_cache = kmalloc(sizeof(struct squashfs_cache) * in squashfs_read_super()
1024 msblk->block_cache[i].block = SQUASHFS_INVALID_BLK; in squashfs_read_super()
1026 msblk->next_cache = 0; in squashfs_read_super()
1029 msblk->read_size = (sblk->block_size < SQUASHFS_METADATA_SIZE) ? in squashfs_read_super()
1031 sblk->block_size; in squashfs_read_super()
1033 if (!(msblk->read_data = kmalloc(msblk->read_size, GFP_KERNEL))) { in squashfs_read_super()
1039 if (!(msblk->read_page = kmalloc(sblk->block_size, GFP_KERNEL))) { in squashfs_read_super()
1045 if (!(msblk->uid = kmalloc((sblk->no_uids + sblk->no_guids) * in squashfs_read_super()
1050 msblk->guid = msblk->uid + sblk->no_uids; in squashfs_read_super()
1052 if (msblk->swap) { in squashfs_read_super()
1053 unsigned int suid[sblk->no_uids + sblk->no_guids]; in squashfs_read_super()
1055 if (!squashfs_read_data(s, (char *) &suid, sblk->uid_start, in squashfs_read_super()
1056 ((sblk->no_uids + sblk->no_guids) * in squashfs_read_super()
1063 SQUASHFS_SWAP_DATA(msblk->uid, suid, (sblk->no_uids + in squashfs_read_super()
1064 sblk->no_guids), (sizeof(unsigned int) * 8)); in squashfs_read_super()
1066 if (!squashfs_read_data(s, (char *) msblk->uid, sblk->uid_start, in squashfs_read_super()
1067 ((sblk->no_uids + sblk->no_guids) * in squashfs_read_super()
1075 if (sblk->s_major == 1 && squashfs_1_0_supported(msblk)) in squashfs_read_super()
1078 if (!(msblk->fragment = kmalloc(sizeof(struct squashfs_fragment_cache) * in squashfs_read_super()
1085 msblk->fragment[i].locked = 0; in squashfs_read_super()
1086 msblk->fragment[i].block = SQUASHFS_INVALID_BLK; in squashfs_read_super()
1087 msblk->fragment[i].data = NULL; in squashfs_read_super()
1090 msblk->next_fragment = 0; in squashfs_read_super()
1093 if(msblk->read_fragment_index_table(s) == 0) in squashfs_read_super()
1097 if ((root = (msblk->iget)(s, sblk->root_inode)) == NULL) in squashfs_read_super()
1100 if ((s->s_root = d_alloc_root(root)) == NULL) { in squashfs_read_super()
1101 ERROR("Root inode create failed\n"); in squashfs_read_super()
1102 iput(root); in squashfs_read_super()
1110 kfree(msblk->fragment_index); in squashfs_read_super()
1111 kfree(msblk->fragment); in squashfs_read_super()
1112 kfree(msblk->uid); in squashfs_read_super()
1113 kfree(msblk->read_page); in squashfs_read_super()
1114 kfree(msblk->read_data); in squashfs_read_super()
1115 kfree(msblk->block_cache); in squashfs_read_super()
1116 kfree(msblk->fragment_index_2); in squashfs_read_super()
1117 vfree(msblk->stream.workspace); in squashfs_read_super()
1124 struct squashfs_sb_info *msblk = &s->u.squashfs_sb; in squashfs_statfs()
1125 struct squashfs_super_block *sblk = &msblk->sblk; in squashfs_statfs()
1129 buf->f_type = SQUASHFS_MAGIC; in squashfs_statfs()
1130 buf->f_bsize = sblk->block_size; in squashfs_statfs()
1131 buf->f_blocks = ((sblk->bytes_used - 1) >> sblk->block_log) + 1; in squashfs_statfs()
1132 buf->f_bfree = buf->f_bavail = 0; in squashfs_statfs()
1133 buf->f_files = sblk->inodes; in squashfs_statfs()
1134 buf->f_ffree = 0; in squashfs_statfs()
1135 buf->f_namelen = SQUASHFS_NAME_LEN; in squashfs_statfs()
1143 struct inode *inode = page->mapping->host; in squashfs_symlink_readpage()
1144 int index = page->index << PAGE_CACHE_SHIFT, length, bytes; in squashfs_symlink_readpage()
1145 long long block = SQUASHFS_I(inode)->start_block; in squashfs_symlink_readpage()
1146 int offset = SQUASHFS_I(inode)->offset; in squashfs_symlink_readpage()
1150 "%llx, offset %x\n", page->index, in squashfs_symlink_readpage()
1151 SQUASHFS_I(inode)->start_block, in squashfs_symlink_readpage()
1152 SQUASHFS_I(inode)->offset); in squashfs_symlink_readpage()
1155 if (!(bytes = squashfs_get_cached_block(inode->i_sb, NULL, in squashfs_symlink_readpage()
1170 bytes = (i_size_read(inode) - length) > PAGE_CACHE_SIZE ? PAGE_CACHE_SIZE : in squashfs_symlink_readpage()
1171 i_size_read(inode) - length; in squashfs_symlink_readpage()
1173 if (!(bytes = squashfs_get_cached_block(inode->i_sb, pageaddr, block, in squashfs_symlink_readpage()
1178 memset(pageaddr + bytes, 0, PAGE_CACHE_SIZE - bytes); in squashfs_symlink_readpage()
1190 struct squashfs_sb_info *msblk = &inode->i_sb->u.squashfs_sb; in locate_meta_index()
1193 down(&msblk->meta_index_mutex); in locate_meta_index()
1197 if(msblk->meta_index == NULL) in locate_meta_index()
1201 if (msblk->meta_index[i].inode_number == inode->i_ino && in locate_meta_index()
1202 msblk->meta_index[i].offset >= offset && in locate_meta_index()
1203 msblk->meta_index[i].offset <= index && in locate_meta_index()
1204 msblk->meta_index[i].locked == 0) { in locate_meta_index()
1206 msblk->meta_index[i].offset); in locate_meta_index()
1207 meta = &msblk->meta_index[i]; in locate_meta_index()
1208 offset = meta->offset; in locate_meta_index()
1212 meta->locked = 1; in locate_meta_index()
1215 up(&msblk->meta_index_mutex); in locate_meta_index()
1223 struct squashfs_sb_info *msblk = &inode->i_sb->u.squashfs_sb; in empty_meta_index()
1227 down(&msblk->meta_index_mutex); in empty_meta_index()
1231 if(msblk->meta_index == NULL) { in empty_meta_index()
1232 if (!(msblk->meta_index = kmalloc(sizeof(struct meta_index) * in empty_meta_index()
1238 msblk->meta_index[i].inode_number = 0; in empty_meta_index()
1239 msblk->meta_index[i].locked = 0; in empty_meta_index()
1241 msblk->next_meta_index = 0; in empty_meta_index()
1245 msblk->meta_index[msblk->next_meta_index].locked; i --) in empty_meta_index()
1246 msblk->next_meta_index = (msblk->next_meta_index + 1) % in empty_meta_index()
1255 msblk->next_meta_index, in empty_meta_index()
1256 &msblk->meta_index[msblk->next_meta_index]); in empty_meta_index()
1258 meta = &msblk->meta_index[msblk->next_meta_index]; in empty_meta_index()
1259 msblk->next_meta_index = (msblk->next_meta_index + 1) % in empty_meta_index()
1262 meta->inode_number = inode->i_ino; in empty_meta_index()
1263 meta->offset = offset; in empty_meta_index()
1264 meta->skip = skip; in empty_meta_index()
1265 meta->entries = 0; in empty_meta_index()
1266 meta->locked = 1; in empty_meta_index()
1269 up(&msblk->meta_index_mutex); in empty_meta_index()
1276 meta->locked = 0; in release_meta_index()
1283 struct squashfs_sb_info *msblk = &s->u.squashfs_sb; in read_block_index()
1287 if (msblk->swap) { in read_block_index()
1307 block_listp++, blocks --) in read_block_index()
1313 return -1; in read_block_index()
1320 int skip = (blocks - 1) / ((SQUASHFS_SLOTS * SQUASHFS_META_ENTRIES + 1) * SQUASHFS_META_INDEXES); in calculate_skip()
1329 struct squashfs_sb_info *msblk = &inode->i_sb->u.squashfs_sb; in get_meta_index()
1330 struct squashfs_super_block *sblk = &msblk->sblk; in get_meta_index()
1331 int skip = calculate_skip(i_size_read(inode) >> sblk->block_log); in get_meta_index()
1335 long long cur_index_block = SQUASHFS_I(inode)->u.s1.block_list_start; in get_meta_index()
1336 int cur_offset = SQUASHFS_I(inode)->offset; in get_meta_index()
1337 long long cur_data_block = SQUASHFS_I(inode)->start_block; in get_meta_index()
1350 offset = index < meta->offset + meta->entries ? index : in get_meta_index()
1351 meta->offset + meta->entries - 1; in get_meta_index()
1352 meta_entry = &meta->meta_entry[offset - meta->offset]; in get_meta_index()
1353 cur_index_block = meta_entry->index_block + sblk->inode_table_start; in get_meta_index()
1354 cur_offset = meta_entry->offset; in get_meta_index()
1355 cur_data_block = meta_entry->data_block; in get_meta_index()
1356 TRACE("get_meta_index: offset %d, meta->offset %d, " in get_meta_index()
1357 "meta->entries %d\n", offset, meta->offset, in get_meta_index()
1358 meta->entries); in get_meta_index()
1364 for (i = meta->offset + meta->entries; i <= index && in get_meta_index()
1365 i < meta->offset + SQUASHFS_META_ENTRIES; i++) { in get_meta_index()
1371 int res = read_block_index(inode->i_sb, block, in get_meta_index()
1375 if (res == -1) in get_meta_index()
1379 blocks -= block; in get_meta_index()
1382 meta_entry = &meta->meta_entry[i - meta->offset]; in get_meta_index()
1383 meta_entry->index_block = cur_index_block - sblk->inode_table_start; in get_meta_index()
1384 meta_entry->offset = cur_offset; in get_meta_index()
1385 meta_entry->data_block = cur_data_block; in get_meta_index()
1386 meta->entries ++; in get_meta_index()
1390 TRACE("get_meta_index: meta->offset %d, meta->entries %d\n", in get_meta_index()
1391 meta->offset, meta->entries); in get_meta_index()
1405 return -1; in get_meta_index()
1423 if(res == -1) in read_blocklist()
1426 index -= res; in read_blocklist()
1430 int res = read_block_index(inode->i_sb, blocks, block_list, in read_blocklist()
1432 if (res == -1) in read_blocklist()
1435 index -= blocks; in read_blocklist()
1438 if (read_block_index(inode->i_sb, 1, block_list, in read_blocklist()
1439 &block_ptr, &offset) == -1) in read_blocklist()
1452 struct inode *inode = page->mapping->host; in squashfs_readpage()
1453 struct squashfs_sb_info *msblk = &inode->i_sb->u.squashfs_sb; in squashfs_readpage()
1454 struct squashfs_super_block *sblk = &msblk->sblk; in squashfs_readpage()
1458 int index = page->index >> (sblk->block_log - PAGE_CACHE_SHIFT); in squashfs_readpage()
1461 char *data_ptr = msblk->read_page; in squashfs_readpage()
1463 int mask = (1 << (sblk->block_log - PAGE_CACHE_SHIFT)) - 1; in squashfs_readpage()
1464 int start_index = page->index & ~mask; in squashfs_readpage()
1468 page->index, in squashfs_readpage()
1469 SQUASHFS_I(inode)->start_block); in squashfs_readpage()
1471 if (page->index >= ((i_size_read(inode) + PAGE_CACHE_SIZE - 1) >> in squashfs_readpage()
1475 if (SQUASHFS_I(inode)->u.s1.fragment_start_block == SQUASHFS_INVALID_BLK in squashfs_readpage()
1477 sblk->block_log)) { in squashfs_readpage()
1478 if ((block = (msblk->read_blocklist)(inode, index, 1, in squashfs_readpage()
1482 down(&msblk->read_page_mutex); in squashfs_readpage()
1484 if (!(bytes = squashfs_read_data(inode->i_sb, msblk->read_page, in squashfs_readpage()
1488 up(&msblk->read_page_mutex); in squashfs_readpage()
1492 if ((fragment = get_cached_fragment(inode->i_sb, in squashfs_readpage()
1493 SQUASHFS_I(inode)-> in squashfs_readpage()
1495 SQUASHFS_I(inode)->u.s1.fragment_size)) in squashfs_readpage()
1498 SQUASHFS_I(inode)-> in squashfs_readpage()
1500 (int) SQUASHFS_I(inode)-> in squashfs_readpage()
1504 bytes = SQUASHFS_I(inode)->u.s1.fragment_offset + in squashfs_readpage()
1505 (i_size_read(inode) & (sblk->block_size in squashfs_readpage()
1506 - 1)); in squashfs_readpage()
1507 byte_offset = SQUASHFS_I(inode)->u.s1.fragment_offset; in squashfs_readpage()
1508 data_ptr = fragment->data; in squashfs_readpage()
1514 int available_bytes = (bytes - byte_offset) > PAGE_CACHE_SIZE ? in squashfs_readpage()
1515 PAGE_CACHE_SIZE : bytes - byte_offset; in squashfs_readpage()
1520 if (i == page->index) { in squashfs_readpage()
1525 PAGE_CACHE_SIZE - available_bytes); in squashfs_readpage()
1531 grab_cache_page_nowait(page->mapping, i))) { in squashfs_readpage()
1537 PAGE_CACHE_SIZE - available_bytes); in squashfs_readpage()
1546 if (SQUASHFS_I(inode)->u.s1.fragment_start_block == SQUASHFS_INVALID_BLK in squashfs_readpage()
1548 sblk->block_log)) in squashfs_readpage()
1549 up(&msblk->read_page_mutex); in squashfs_readpage()
1557 memset(pageaddr + bytes, 0, PAGE_CACHE_SIZE - bytes); in squashfs_readpage()
1569 struct inode *inode = page->mapping->host; in squashfs_readpage4K()
1570 struct squashfs_sb_info *msblk = &inode->i_sb->u.squashfs_sb; in squashfs_readpage4K()
1571 struct squashfs_super_block *sblk = &msblk->sblk; in squashfs_readpage4K()
1578 page->index, in squashfs_readpage4K()
1579 SQUASHFS_I(inode)->start_block); in squashfs_readpage4K()
1581 if (page->index >= ((i_size_read(inode) + PAGE_CACHE_SIZE - 1) >> in squashfs_readpage4K()
1587 if (SQUASHFS_I(inode)->u.s1.fragment_start_block == SQUASHFS_INVALID_BLK in squashfs_readpage4K()
1588 || page->index < (i_size_read(inode) >> in squashfs_readpage4K()
1589 sblk->block_log)) { in squashfs_readpage4K()
1590 block = (msblk->read_blocklist)(inode, page->index, 1, in squashfs_readpage4K()
1593 down(&msblk->read_page_mutex); in squashfs_readpage4K()
1594 bytes = squashfs_read_data(inode->i_sb, msblk->read_page, block, in squashfs_readpage4K()
1598 memcpy(pageaddr, msblk->read_page, bytes); in squashfs_readpage4K()
1602 up(&msblk->read_page_mutex); in squashfs_readpage4K()
1605 get_cached_fragment(inode->i_sb, in squashfs_readpage4K()
1606 SQUASHFS_I(inode)-> in squashfs_readpage4K()
1608 SQUASHFS_I(inode)-> u.s1.fragment_size); in squashfs_readpage4K()
1611 bytes = i_size_read(inode) & (sblk->block_size - 1); in squashfs_readpage4K()
1612 memcpy(pageaddr, fragment->data + SQUASHFS_I(inode)-> in squashfs_readpage4K()
1617 SQUASHFS_I(inode)-> in squashfs_readpage4K()
1619 SQUASHFS_I(inode)-> u.s1.fragment_size); in squashfs_readpage4K()
1623 memset(pageaddr + bytes, 0, PAGE_CACHE_SIZE - bytes); in squashfs_readpage4K()
1639 struct squashfs_sb_info *msblk = &s->u.squashfs_sb; in get_dir_index_using_offset()
1640 struct squashfs_super_block *sblk = &msblk->sblk; in get_dir_index_using_offset()
1647 f_pos -= 3; in get_dir_index_using_offset()
1652 if (msblk->swap) { in get_dir_index_using_offset()
1673 *next_block = index.start_block + sblk->directory_table_start; in get_dir_index_using_offset()
1689 struct squashfs_sb_info *msblk = &s->u.squashfs_sb; in get_dir_index_using_name()
1690 struct squashfs_super_block *sblk = &msblk->sblk; in get_dir_index_using_name()
1702 if (msblk->swap) { in get_dir_index_using_name()
1715 squashfs_get_cached_block(s, index->name, index_start, in get_dir_index_using_name()
1716 index_offset, index->size + 1, in get_dir_index_using_name()
1719 index->name[index->size + 1] = '\0'; in get_dir_index_using_name()
1721 if (strcmp(index->name, str) > 0) in get_dir_index_using_name()
1724 length = index->index; in get_dir_index_using_name()
1725 *next_block = index->start_block + sblk->directory_table_start; in get_dir_index_using_name()
1735 struct inode *i = file->f_dentry->d_inode; in squashfs_readdir()
1736 struct squashfs_sb_info *msblk = &i->i_sb->u.squashfs_sb; in squashfs_readdir()
1737 struct squashfs_super_block *sblk = &msblk->sblk; in squashfs_readdir()
1738 long long next_block = SQUASHFS_I(i)->start_block + in squashfs_readdir()
1739 sblk->directory_table_start; in squashfs_readdir()
1740 int next_offset = SQUASHFS_I(i)->offset, length = 0, in squashfs_readdir()
1748 while(file->f_pos < 3) { in squashfs_readdir()
1752 if(file->f_pos == 0) { in squashfs_readdir()
1755 i_ino = i->i_ino; in squashfs_readdir()
1759 i_ino = SQUASHFS_I(i)->u.s2.parent_inode; in squashfs_readdir()
1763 file->f_pos, i_ino, in squashfs_readdir()
1767 file->f_pos, i_ino, in squashfs_readdir()
1772 file->f_pos += size; in squashfs_readdir()
1775 length = get_dir_index_using_offset(i->i_sb, &next_block, &next_offset, in squashfs_readdir()
1776 SQUASHFS_I(i)->u.s2.directory_index_start, in squashfs_readdir()
1777 SQUASHFS_I(i)->u.s2.directory_index_offset, in squashfs_readdir()
1778 SQUASHFS_I(i)->u.s2.directory_index_count, in squashfs_readdir()
1779 file->f_pos); in squashfs_readdir()
1783 if (msblk->swap) { in squashfs_readdir()
1786 if (!squashfs_get_cached_block(i->i_sb, (char *) &sdirh, in squashfs_readdir()
1794 if (!squashfs_get_cached_block(i->i_sb, (char *) &dirh, in squashfs_readdir()
1803 while (dir_count--) { in squashfs_readdir()
1804 if (msblk->swap) { in squashfs_readdir()
1806 if (!squashfs_get_cached_block(i->i_sb, (char *) in squashfs_readdir()
1815 if (!squashfs_get_cached_block(i->i_sb, (char *) in squashfs_readdir()
1824 if (!squashfs_get_cached_block(i->i_sb, dire->name, in squashfs_readdir()
1826 dire->size + 1, &next_block, in squashfs_readdir()
1830 length += dire->size + 1; in squashfs_readdir()
1832 if (file->f_pos >= length) in squashfs_readdir()
1835 dire->name[dire->size + 1] = '\0'; in squashfs_readdir()
1838 (unsigned int) dirent, dire->name, in squashfs_readdir()
1839 dire->size + 1, (int) file->f_pos, in squashfs_readdir()
1840 dirh.start_block, dire->offset, in squashfs_readdir()
1841 dirh.inode_number + dire->inode_number, in squashfs_readdir()
1842 squashfs_filetype_table[dire->type]); in squashfs_readdir()
1844 if (filldir(dirent, dire->name, dire->size + 1, in squashfs_readdir()
1845 file->f_pos, in squashfs_readdir()
1846 dirh.inode_number + dire->inode_number, in squashfs_readdir()
1847 squashfs_filetype_table[dire->type]) in squashfs_readdir()
1852 file->f_pos = length; in squashfs_readdir()
1868 const unsigned char *name = dentry->d_name.name; in squashfs_lookup()
1869 int len = dentry->d_name.len; in squashfs_lookup()
1871 struct squashfs_sb_info *msblk = &i->i_sb->u.squashfs_sb; in squashfs_lookup()
1872 struct squashfs_super_block *sblk = &msblk->sblk; in squashfs_lookup()
1873 long long next_block = SQUASHFS_I(i)->start_block + in squashfs_lookup()
1874 sblk->directory_table_start; in squashfs_lookup()
1875 int next_offset = SQUASHFS_I(i)->offset, length = 0, in squashfs_lookup()
1886 length = get_dir_index_using_name(i->i_sb, &next_block, &next_offset, in squashfs_lookup()
1887 SQUASHFS_I(i)->u.s2.directory_index_start, in squashfs_lookup()
1888 SQUASHFS_I(i)->u.s2.directory_index_offset, in squashfs_lookup()
1889 SQUASHFS_I(i)->u.s2.directory_index_count, name, in squashfs_lookup()
1894 if (msblk->swap) { in squashfs_lookup()
1896 if (!squashfs_get_cached_block(i->i_sb, (char *) &sdirh, in squashfs_lookup()
1904 if (!squashfs_get_cached_block(i->i_sb, (char *) &dirh, in squashfs_lookup()
1913 while (dir_count--) { in squashfs_lookup()
1914 if (msblk->swap) { in squashfs_lookup()
1916 if (!squashfs_get_cached_block(i->i_sb, (char *) in squashfs_lookup()
1925 if (!squashfs_get_cached_block(i->i_sb, (char *) in squashfs_lookup()
1934 if (!squashfs_get_cached_block(i->i_sb, dire->name, in squashfs_lookup()
1935 next_block, next_offset, dire->size + 1, in squashfs_lookup()
1939 length += dire->size + 1; in squashfs_lookup()
1941 if (name[0] < dire->name[0]) in squashfs_lookup()
1944 if ((len == dire->size + 1) && !strncmp(name, in squashfs_lookup()
1945 dire->name, len)) { in squashfs_lookup()
1948 dire->offset); in squashfs_lookup()
1952 dirh.start_block, dire->offset, in squashfs_lookup()
1953 dirh.inode_number + dire->inode_number); in squashfs_lookup()
1955 inode = (msblk->iget)(i->i_sb, ino); in squashfs_lookup()
1977 struct squashfs_sb_info *sbi = &s->u.squashfs_sb; in squashfs_put_super()
1978 if (sbi->block_cache) in squashfs_put_super()
1980 if (sbi->block_cache[i].block != in squashfs_put_super()
1982 kfree(sbi->block_cache[i].data); in squashfs_put_super()
1983 if (sbi->fragment) in squashfs_put_super()
1985 SQUASHFS_FREE(sbi->fragment[i].data); in squashfs_put_super()
1986 kfree(sbi->fragment); in squashfs_put_super()
1987 kfree(sbi->block_cache); in squashfs_put_super()
1988 kfree(sbi->read_data); in squashfs_put_super()
1989 kfree(sbi->read_page); in squashfs_put_super()
1990 kfree(sbi->uid); in squashfs_put_super()
1991 kfree(sbi->fragment_index); in squashfs_put_super()
1992 kfree(sbi->fragment_index_2); in squashfs_put_super()
1993 kfree(sbi->meta_index); in squashfs_put_super()
1994 vfree(sbi->stream.workspace); in squashfs_put_super()
1995 sbi->block_cache = NULL; in squashfs_put_super()
1996 sbi->uid = NULL; in squashfs_put_super()
1997 sbi->read_data = NULL; in squashfs_put_super()
1998 sbi->read_page = NULL; in squashfs_put_super()
1999 sbi->fragment = NULL; in squashfs_put_super()
2000 sbi->fragment_index = NULL; in squashfs_put_super()
2001 sbi->fragment_index_2 = NULL; in squashfs_put_super()
2002 sbi->meta_index = NULL; in squashfs_put_super()
2003 sbi->stream.workspace = NULL; in squashfs_put_super()
2010 printk(KERN_INFO "squashfs: version 3.1 (2006/08/15) " in init_squashfs_fs()
2027 MODULE_DESCRIPTION("squashfs 3.1, a compressed read-only filesystem");