Lines Matching refs:fs
33 ext2_filsys fs;
46 errcode_t (*done_group)(ext2_filsys fs,
59 errcode_t ext2fs_flush_icache(ext2_filsys fs)
63 if (!fs->icache)
66 for (i=0; i < fs->icache->cache_size; i++)
67 fs->icache->cache[i].ino = 0;
69 fs->icache->buffer_blk = 0;
73 static errcode_t create_icache(ext2_filsys fs)
77 if (fs->icache)
79 retval = ext2fs_get_mem(sizeof(struct ext2_inode_cache), &fs->icache);
83 memset(fs->icache, 0, sizeof(struct ext2_inode_cache));
84 retval = ext2fs_get_mem(fs->blocksize, &fs->icache->buffer);
86 ext2fs_free_mem(&fs->icache);
89 fs->icache->buffer_blk = 0;
90 fs->icache->cache_last = -1;
91 fs->icache->cache_size = 4;
92 fs->icache->refcount = 1;
93 retval = ext2fs_get_array(fs->icache->cache_size,
95 &fs->icache->cache);
97 ext2fs_free_mem(&fs->icache->buffer);
98 ext2fs_free_mem(&fs->icache);
101 ext2fs_flush_icache(fs);
105 errcode_t ext2fs_open_inode_scan(ext2_filsys fs, int buffer_blocks,
112 EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS);
115 * If fs->badblocks isn't set, then set it --- since the inode
118 if (fs->badblocks == 0) {
120 * Temporarly save fs->get_blocks and set it to zero,
123 save_get_blocks = fs->get_blocks;
124 fs->get_blocks = 0;
125 retval = ext2fs_read_bb_inode(fs, &fs->badblocks);
126 if (retval && fs->badblocks) {
127 ext2fs_badblocks_list_free(fs->badblocks);
128 fs->badblocks = 0;
130 fs->get_blocks = save_get_blocks;
139 scan->fs = fs;
140 scan->inode_size = EXT2_INODE_SIZE(fs->super);
143 scan->groups_left = fs->group_desc_count - 1;
145 scan->current_block = scan->fs->
147 scan->inodes_left = EXT2_INODES_PER_GROUP(scan->fs->super);
148 scan->blocks_left = scan->fs->inode_blocks_per_group;
150 fs->blocksize,
165 if (scan->fs->badblocks && scan->fs->badblocks->num)
167 if (EXT2_HAS_COMPAT_FEATURE(fs->super,
188 errcode_t (*done_group)(ext2_filsys fs,
224 scan->current_block = scan->fs->
228 EXT2_INODES_PER_GROUP(scan->fs->super);
231 scan->inodes_left = EXT2_INODES_PER_GROUP(scan->fs->super);
232 scan->blocks_left = scan->fs->inode_blocks_per_group;
240 scan->groups_left = scan->fs->group_desc_count - group;
255 badblocks_list bb = scan->fs->badblocks;
345 (size_t) num_blocks * scan->fs->blocksize);
347 retval = io_channel_read_blk(scan->fs->io,
355 scan->bytes_left = num_blocks * scan->fs->blocksize;
399 (scan->fs, scan, scan->current_group,
417 (scan->fs->group_desc[scan->current_group].bg_flags &
458 if ((scan->fs->flags & EXT2_FLAG_SWAP_BYTES) ||
459 (scan->fs->flags & EXT2_FLAG_SWAP_BYTES_READ))
460 ext2fs_swap_inode_full(scan->fs,
473 if ((scan->fs->flags & EXT2_FLAG_SWAP_BYTES) ||
474 (scan->fs->flags & EXT2_FLAG_SWAP_BYTES_READ))
475 ext2fs_swap_inode_full(scan->fs,
504 errcode_t ext2fs_read_inode_full(ext2_filsys fs, ext2_ino_t ino,
513 EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS);
516 if (fs->read_inode) {
517 retval = (fs->read_inode)(fs, ino, inode);
522 if (!fs->icache) {
523 retval = create_icache(fs);
530 for (i=0; i < fs->icache->cache_size; i++) {
531 if (fs->icache->cache[i].ino == ino) {
532 *inode = fs->icache->cache[i].inode;
537 if ((ino == 0) || (ino > fs->super->s_inodes_count))
539 if (fs->flags & EXT2_FLAG_IMAGE_FILE) {
540 inodes_per_block = fs->blocksize / EXT2_INODE_SIZE(fs->super);
541 block_nr = fs->image_header->offset_inode / fs->blocksize;
544 EXT2_INODE_SIZE(fs->super);
545 io = fs->image_io;
547 group = (ino - 1) / EXT2_INODES_PER_GROUP(fs->super);
548 offset = ((ino - 1) % EXT2_INODES_PER_GROUP(fs->super)) *
549 EXT2_INODE_SIZE(fs->super);
550 block = offset >> EXT2_BLOCK_SIZE_BITS(fs->super);
551 if (!fs->group_desc[(unsigned)group].bg_inode_table)
553 block_nr = fs->group_desc[(unsigned)group].bg_inode_table +
555 io = fs->io;
557 offset &= (EXT2_BLOCK_SIZE(fs->super) - 1);
559 length = EXT2_INODE_SIZE(fs->super);
566 if ((offset + length) > fs->blocksize)
567 clen = fs->blocksize - offset;
569 if (block_nr != fs->icache->buffer_blk) {
571 fs->icache->buffer);
574 fs->icache->buffer_blk = block_nr;
577 memcpy(ptr, ((char *) fs->icache->buffer) + (unsigned) offset,
587 if ((fs->flags & EXT2_FLAG_SWAP_BYTES) ||
588 (fs->flags & EXT2_FLAG_SWAP_BYTES_READ))
589 ext2fs_swap_inode_full(fs, (struct ext2_inode_large *) inode,
595 fs->icache->cache_last = (fs->icache->cache_last + 1) %
596 fs->icache->cache_size;
597 fs->icache->cache[fs->icache->cache_last].ino = ino;
598 fs->icache->cache[fs->icache->cache_last].inode = *inode;
603 errcode_t ext2fs_read_inode(ext2_filsys fs, ext2_ino_t ino,
606 return ext2fs_read_inode_full(fs, ino, inode,
610 errcode_t ext2fs_write_inode_full(ext2_filsys fs, ext2_ino_t ino,
619 EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS);
622 if (fs->write_inode) {
623 retval = (fs->write_inode)(fs
629 if (fs->icache) {
630 for (i=0; i < fs->icache->cache_size; i++) {
631 if (fs->icache->cache[i].ino == ino) {
632 fs->icache->cache[i].inode = *inode;
637 retval = create_icache(fs);
642 if (!(fs->flags & EXT2_FLAG_RW))
645 if ((ino == 0) || (ino > fs->super->s_inodes_count))
649 if (length < EXT2_INODE_SIZE(fs->super))
650 length = EXT2_INODE_SIZE(fs->super);
661 if ((fs->flags & EXT2_FLAG_SWAP_BYTES) ||
662 (fs->flags & EXT2_FLAG_SWAP_BYTES_WRITE))
663 ext2fs_swap_inode_full(fs, w_inode,
670 group = (ino - 1) / EXT2_INODES_PER_GROUP(fs->super);
671 offset = ((ino - 1) % EXT2_INODES_PER_GROUP(fs->super)) *
672 EXT2_INODE_SIZE(fs->super);
673 block = offset >> EXT2_BLOCK_SIZE_BITS(fs->super);
674 if (!fs->group_desc[(unsigned) group].bg_inode_table) {
678 block_nr = fs->group_desc[(unsigned) group].bg_inode_table + block;
680 offset &= (EXT2_BLOCK_SIZE(fs->super) - 1);
682 length = EXT2_INODE_SIZE(fs->super);
690 if ((offset + length) > fs->blocksize)
691 clen = fs->blocksize - offset;
693 if (fs->icache->buffer_blk != block_nr) {
694 retval = io_channel_read_blk(fs->io, block_nr, 1,
695 fs->icache->buffer);
698 fs->icache->buffer_blk = block_nr;
702 memcpy((char *) fs->icache->buffer + (unsigned) offset,
705 retval = io_channel_write_blk(fs->io, block_nr, 1,
706 fs->icache->buffer);
716 fs->flags |= EXT2_FLAG_CHANGED;
723 errcode_t ext2fs_write_inode(ext2_filsys fs, ext2_ino_t ino,
726 return ext2fs_write_inode_full(fs, ino, inode,
734 errcode_t ext2fs_write_new_inode(ext2_filsys fs, ext2_ino_t ino,
738 int size = EXT2_INODE_SIZE(fs->super);
743 return ext2fs_write_inode_full(fs, ino, inode,
757 retval = ext2fs_write_inode_full(fs, ino, buf, size);
763 errcode_t ext2fs_get_blocks(ext2_filsys fs, ext2_ino_t ino, blk_t *blocks)
769 EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS);
771 if (ino > fs->super->s_inodes_count)
774 if (fs->get_blocks) {
775 if (!(*fs->get_blocks)(fs, ino, blocks))
778 retval = ext2fs_read_inode(fs, ino, &inode);
786 errcode_t ext2fs_check_directory(ext2_filsys fs, ext2_ino_t ino)
791 EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS);
793 if (ino > fs->super->s_inodes_count)
796 if (fs->check_directory) {
797 retval = (fs->check_directory)(fs, ino);
801 retval = ext2fs_read_inode(fs, ino, &inode);