Home | History | Annotate | Download | only in ext2fs

Lines Matching refs:fs

34 	ext2_filsys		fs;
47 errcode_t (*done_group)(ext2_filsys fs,
60 errcode_t ext2fs_flush_icache(ext2_filsys fs)
64 if (!fs->icache)
67 for (i=0; i < fs->icache->cache_size; i++)
68 fs->icache->cache[i].ino = 0;
70 fs->icache->buffer_blk = 0;
74 static errcode_t create_icache(ext2_filsys fs)
78 if (fs->icache)
80 retval = ext2fs_get_mem(sizeof(struct ext2_inode_cache), &fs->icache);
84 memset(fs->icache, 0, sizeof(struct ext2_inode_cache));
85 retval = ext2fs_get_mem(fs->blocksize, &fs->icache->buffer);
87 ext2fs_free_mem(&fs->icache);
90 fs->icache->buffer_blk = 0;
91 fs->icache->cache_last = -1;
92 fs->icache->cache_size = 4;
93 fs->icache->refcount = 1;
94 retval = ext2fs_get_array(fs->icache->cache_size,
96 &fs->icache->cache);
98 ext2fs_free_mem(&fs->icache->buffer);
99 ext2fs_free_mem(&fs->icache);
102 ext2fs_flush_icache(fs);
106 errcode_t ext2fs_open_inode_scan(ext2_filsys fs, int buffer_blocks,
113 EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS);
116 * If fs->badblocks isn't set, then set it --- since the inode
119 if (fs->badblocks == 0) {
121 * Temporarly save fs->get_blocks and set it to zero,
124 save_get_blocks = fs->get_blocks;
125 fs->get_blocks = 0;
126 retval = ext2fs_read_bb_inode(fs, &fs->badblocks);
127 if (retval && fs->badblocks) {
128 ext2fs_badblocks_list_free(fs->badblocks);
129 fs->badblocks = 0;
131 fs->get_blocks = save_get_blocks;
140 scan->fs = fs;
141 scan->inode_size = EXT2_INODE_SIZE(fs->super);
144 scan->groups_left = fs->group_desc_count - 1;
146 scan->current_block = scan->fs->
148 scan->inodes_left = EXT2_INODES_PER_GROUP(scan->fs->super);
149 scan->blocks_left = scan->fs->inode_blocks_per_group;
150 if (EXT2_HAS_RO_COMPAT_FEATURE(fs->super,
153 fs->group_desc[scan->current_group].bg_itable_unused;
156 (fs->blocksize / scan->inode_size - 1)) *
157 scan->inode_size / fs->blocksize;
159 retval = ext2fs_get_memalign(scan->inode_buffer_blocks * fs->blocksize,
160 fs->blocksize, &scan->inode_buffer);
174 if (scan->fs->badblocks && scan->fs->badblocks->num)
176 if (EXT2_HAS_RO_COMPAT_FEATURE(fs->super,
197 errcode_t (*done_group)(ext2_filsys fs,
230 ext2_filsys fs = scan->fs;
235 scan->current_block =fs->group_desc[scan->current_group].bg_inode_table;
238 EXT2_INODES_PER_GROUP(fs->super);
241 scan->inodes_left = EXT2_INODES_PER_GROUP(fs->super);
242 scan->blocks_left = fs->inode_blocks_per_group;
243 if (EXT2_HAS_RO_COMPAT_FEATURE(fs->super,
246 fs->group_desc[scan->current_group].bg_itable_unused;
249 (fs->blocksize / scan->inode_size - 1)) *
250 scan->inode_size / fs->blocksize;
260 scan->groups_left = scan->fs->group_desc_count - group;
275 badblocks_list bb = scan->fs->badblocks;
365 (size_t) num_blocks * scan->fs->blocksize);
367 retval = io_channel_read_blk(scan->fs->io,
375 scan->bytes_left = num_blocks * scan->fs->blocksize;
419 (scan->fs, scan, scan->current_group,
437 (scan->fs->group_desc[scan->current_group].bg_flags &
480 ext2fs_swap_inode_full(scan->fs,
493 ext2fs_swap_inode_full(scan->fs,
522 errcode_t ext2fs_read_inode_full(ext2_filsys fs, ext2_ino_t ino,
531 EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS);
534 if (fs->read_inode) {
535 retval = (fs->read_inode)(fs, ino, inode);
539 if ((ino == 0) || (ino > fs->super->s_inodes_count))
542 if (!fs->icache) {
543 retval = create_icache(fs);
550 for (i=0; i < fs->icache->cache_size; i++) {
551 if (fs->icache->cache[i].ino == ino) {
552 *inode = fs->icache->cache[i].inode;
557 if (fs->flags & EXT2_FLAG_IMAGE_FILE) {
558 inodes_per_block = fs->blocksize / EXT2_INODE_SIZE(fs->super);
559 block_nr = fs->image_header->offset_inode / fs->blocksize;
562 EXT2_INODE_SIZE(fs->super);
563 io = fs->image_io;
565 group = (ino - 1) / EXT2_INODES_PER_GROUP(fs->super);
566 if (group > fs->group_desc_count)
568 offset = ((ino - 1) % EXT2_INODES_PER_GROUP(fs->super)) *
569 EXT2_INODE_SIZE(fs->super);
570 block = offset >> EXT2_BLOCK_SIZE_BITS(fs->super);
571 if (!fs->group_desc[(unsigned)group].bg_inode_table)
573 block_nr = fs->group_desc[(unsigned)group].bg_inode_table +
575 io = fs->io;
577 offset &= (EXT2_BLOCK_SIZE(fs->super) - 1);
579 length = EXT2_INODE_SIZE(fs->super);
586 if ((offset + length) > fs->blocksize)
587 clen = fs->blocksize - offset;
589 if (block_nr != fs->icache->buffer_blk) {
591 fs->icache->buffer);
594 fs->icache->buffer_blk = block_nr;
597 memcpy(ptr, ((char *) fs->icache->buffer) + (unsigned) offset,
607 ext2fs_swap_inode_full(fs, (struct ext2_inode_large *) inode,
613 fs->icache->cache_last = (fs->icache->cache_last + 1) %
614 fs->icache->cache_size;
615 fs->icache->cache[fs->icache->cache_last].ino = ino;
616 fs->icache->cache[fs->icache->cache_last].inode = *inode;
621 errcode_t ext2fs_read_inode(ext2_filsys fs, ext2_ino_t ino,
624 return ext2fs_read_inode_full(fs
628 errcode_t ext2fs_write_inode_full(ext2_filsys fs, ext2_ino_t ino,
637 EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS);
640 if (fs->write_inode) {
641 retval = (fs->write_inode)(fs, ino, inode);
647 if (fs->icache) {
648 for (i=0; i < fs->icache->cache_size; i++) {
649 if (fs->icache->cache[i].ino == ino) {
650 fs->icache->cache[i].inode = *inode;
655 retval = create_icache(fs);
660 if (!(fs->flags & EXT2_FLAG_RW))
663 if ((ino == 0) || (ino > fs->super->s_inodes_count))
667 if (length < EXT2_INODE_SIZE(fs->super))
668 length = EXT2_INODE_SIZE(fs->super);
679 ext2fs_swap_inode_full(fs, w_inode,
686 group = (ino - 1) / EXT2_INODES_PER_GROUP(fs->super);
687 offset = ((ino - 1) % EXT2_INODES_PER_GROUP(fs->super)) *
688 EXT2_INODE_SIZE(fs->super);
689 block = offset >> EXT2_BLOCK_SIZE_BITS(fs->super);
690 if (!fs->group_desc[(unsigned) group].bg_inode_table) {
694 block_nr = fs->group_desc[(unsigned) group].bg_inode_table + block;
696 offset &= (EXT2_BLOCK_SIZE(fs->super) - 1);
698 length = EXT2_INODE_SIZE(fs->super);
706 if ((offset + length) > fs->blocksize)
707 clen = fs->blocksize - offset;
709 if (fs->icache->buffer_blk != block_nr) {
710 retval = io_channel_read_blk(fs->io, block_nr, 1,
711 fs->icache->buffer);
714 fs->icache->buffer_blk = block_nr;
718 memcpy((char *) fs->icache->buffer + (unsigned) offset,
721 retval = io_channel_write_blk(fs->io, block_nr, 1,
722 fs->icache->buffer);
732 fs->flags |= EXT2_FLAG_CHANGED;
739 errcode_t ext2fs_write_inode(ext2_filsys fs, ext2_ino_t ino,
742 return ext2fs_write_inode_full(fs, ino, inode,
750 errcode_t ext2fs_write_new_inode(ext2_filsys fs, ext2_ino_t ino,
754 int size = EXT2_INODE_SIZE(fs->super);
757 __u32 t = fs->now ? fs->now : time(NULL);
767 return ext2fs_write_inode_full(fs, ino, inode,
783 retval = ext2fs_write_inode_full(fs, ino, buf, size);
789 errcode_t ext2fs_get_blocks(ext2_filsys fs, ext2_ino_t ino, blk_t *blocks)
795 EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS);
797 if (ino > fs->super->s_inodes_count)
800 if (fs->get_blocks) {
801 if (!(*fs->get_blocks)(fs, ino, blocks))
804 retval = ext2fs_read_inode(fs, ino, &inode);
812 errcode_t ext2fs_check_directory(ext2_filsys fs, ext2_ino_t ino)
817 EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS);
819 if (ino > fs->super->s_inodes_count)
822 if (fs->check_directory) {
823 retval = (fs->check_directory)(fs, ino);
827 retval = ext2fs_read_inode(fs, ino, &inode);