Home | History | Annotate | Download | only in ext2fs

Lines Matching refs:scan

35 #define SCAN_BLOCK_STATUS(scan)	((scan)->temp_buffer + (scan)->inode_size)
53 ext2_inode_scan scan,
142 ext2_inode_scan scan;
167 retval = ext2fs_get_mem(sizeof(struct ext2_struct_inode_scan), &scan);
170 memset(scan, 0, sizeof(struct ext2_struct_inode_scan));
172 scan->magic = EXT2_ET_MAGIC_INODE_SCAN;
173 scan->fs = fs;
174 scan->inode_size = EXT2_INODE_SIZE(fs->super);
175 scan->bytes_left = 0;
176 scan->current_group = 0;
177 scan->groups_left = fs->group_desc_count - 1;
178 scan->inode_buffer_blocks = buffer_blocks ? buffer_blocks :
180 scan->current_block = ext2fs_inode_table_loc(scan->fs,
181 scan->current_group);
182 scan->inodes_left = EXT2_INODES_PER_GROUP(scan->fs->super);
183 scan->blocks_left = scan->fs->inode_blocks_per_group;
185 __u32 unused = ext2fs_bg_itable_unused(fs, scan->current_group);
186 if (scan->inodes_left > unused)
187 scan->inodes_left -= unused;
189 scan->inodes_left = 0;
190 scan->blocks_left =
191 (scan->inodes_left +
192 (fs->blocksize / scan->inode_size - 1)) *
193 scan->inode_size / fs->blocksize;
195 retval = io_channel_alloc_buf(fs->io, scan->inode_buffer_blocks,
196 &scan->inode_buffer);
197 scan->done_group = 0;
198 scan->done_group_data = 0;
199 scan->bad_block_ptr = 0;
201 ext2fs_free_mem(&scan);
204 retval = ext2fs_get_mem(scan->inode_size + scan->inode_buffer_blocks,
205 &scan->temp_buffer);
207 ext2fs_free_mem(&scan->inode_buffer);
208 ext2fs_free_mem(&scan);
211 memset(SCAN_BLOCK_STATUS(scan), 0, scan->inode_buffer_blocks);
212 if (scan->fs->badblocks && scan->fs->badblocks->num)
213 scan->scan_flags |= EXT2_SF_CHK_BADBLOCKS;
215 scan->scan_flags |= EXT2_SF_DO_LAZY;
216 *ret_scan = scan;
220 void ext2fs_close_inode_scan(ext2_inode_scan scan)
222 if (!scan || (scan->magic != EXT2_ET_MAGIC_INODE_SCAN))
225 ext2fs_free_mem(&scan->inode_buffer);
226 scan->inode_buffer = NULL;
227 ext2fs_free_mem(&scan->temp_buffer);
228 scan->temp_buffer = NULL;
229 ext2fs_free_mem(&scan);
233 void ext2fs_set_inode_callback(ext2_inode_scan scan,
235 ext2_inode_scan scan,
240 if (!scan || (scan->magic != EXT2_ET_MAGIC_INODE_SCAN))
243 scan->done_group = done_group;
244 scan->done_group_data = done_group_data;
247 int ext2fs_inode_scan_flags(ext2_inode_scan scan, int set_flags,
252 if (!scan || (scan->magic != EXT2_ET_MAGIC_INODE_SCAN))
255 old_flags = scan->scan_flags;
256 scan->scan_flags &= ~clear_flags;
257 scan->scan_flags |= set_flags;
265 static errcode_t get_next_blockgroup(ext2_inode_scan scan)
267 ext2_filsys fs = scan->fs;
269 scan->current_group++;
270 scan->groups_left--;
272 scan->current_block = ext2fs_inode_table_loc(scan->fs,
273 scan->current_group);
274 scan->current_inode = scan->current_group *
277 scan->bytes_left = 0;
278 scan->inodes_left = EXT2_INODES_PER_GROUP(fs->super);
279 scan->blocks_left = fs->inode_blocks_per_group;
281 __u32 unused = ext2fs_bg_itable_unused(fs, scan->current_group);
282 if (scan->inodes_left > unused)
283 scan->inodes_left -= unused;
285 scan->inodes_left = 0;
286 scan->blocks_left =
287 (scan->inodes_left +
288 (fs->blocksize / scan->inode_size - 1)) *
289 scan->inode_size / fs->blocksize;
295 errcode_t ext2fs_inode_scan_goto_blockgroup(ext2_inode_scan scan,
298 scan->current_group = group - 1;
299 scan->groups_left = scan->fs->group_desc_count - group;
300 return get_next_blockgroup(scan);
310 static errcode_t check_for_inode_bad_blocks(ext2_inode_scan scan,
313 blk64_t blk = scan->current_block;
314 badblocks_list bb = scan->fs->badblocks;
329 while (blk > bb->list[scan->bad_block_ptr]) {
330 if (++scan->bad_block_ptr >= bb->num) {
331 scan->scan_flags &= ~EXT2_SF_CHK_BADBLOCKS;
344 if (blk == bb->list[scan->bad_block_ptr]) {
345 scan->scan_flags |= EXT2_SF_BAD_INODE_BLK;
347 if (++scan->bad_block_ptr >= bb->num)
348 scan->scan_flags &= ~EXT2_SF_CHK_BADBLOCKS;
358 if ((blk + *num_blocks) > bb->list[scan->bad_block_ptr])
359 *num_blocks = (int) (bb->list[scan->bad_block_ptr] - blk);
408 static void check_inode_block_sanity(ext2_inode_scan scan, blk64_t num_blocks)
418 if (!(scan->scan_flags & EXT2_SF_WARN_GARBAGE_INODES))
421 inodes_to_scan = scan->inodes_left;
422 inodes_in_buf = num_blocks * scan->fs->blocksize / scan->inode_size;
426 p = (char *) scan->inode_buffer;
427 ino = scan->current_inode + 1;
429 block_status = SCAN_BLOCK_STATUS(scan);
430 memset(block_status, 0, scan->inode_buffer_blocks);
431 inodes_per_block = EXT2_INODES_PER_BLOCK(scan->fs->super);
437 if (ext2fs_get_mem(EXT2_INODE_SIZE(scan->fs->super), &inode))
442 blk = (p - (char *)scan->inode_buffer) / scan->fs->blocksize;
443 bad_csum = ext2fs_inode_csum_verify(scan->fs, ino,
447 ext2fs_swap_inode_full(scan->fs,
450 0, EXT2_INODE_SIZE(scan->fs->super));
460 block_map_looks_insane(scan->fs, inode))
473 p += scan->inode_size * ino_adj;
485 p += scan->inode_size;
498 static errcode_t get_next_blocks(ext2_inode_scan scan)
508 num_blocks = scan->inode_buffer_blocks;
509 if (num_blocks > scan->blocks_left)
510 num_blocks = scan->blocks_left;
516 if (scan->scan_flags & EXT2_SF_BAD_INODE_BLK) {
517 if (scan->bytes_left)
518 scan->scan_flags |= EXT2_SF_BAD_EXTRA_BYTES;
519 scan->scan_flags &= ~EXT2_SF_BAD_INODE_BLK;
525 if (scan->scan_flags & EXT2_SF_CHK_BADBLOCKS) {
526 retval = check_for_inode_bad_blocks(scan, &num_blocks);
531 if ((scan->scan_flags & EXT2_SF_BAD_INODE_BLK) ||
532 (scan->current_block == 0)) {
533 memset(scan->inode_buffer, 0,
534 (size_t) num_blocks * scan->fs->blocksize);
536 retval = io_channel_read_blk64(scan->fs->io,
537 scan->current_block,
539 scan->inode_buffer);
543 check_inode_block_sanity(scan, num_blocks);
545 scan->ptr = scan->inode_buffer;
546 scan->bytes_left = num_blocks * scan->fs->blocksize;
548 scan->blocks_left -= num_blocks;
549 if (scan->current_block)
550 scan->current_block += num_blocks;
562 static inline int is_empty_scan(ext2_inode_scan scan)
566 if (scan->bytes_left == 0)
569 for (i=0; i < scan->bytes_left; i++)
570 if (scan->ptr[i])
576 errcode_t ext2fs_get_next_inode_full(ext2_inode_scan scan, ext2_ino_t *ino,
586 EXT2_CHECK_MAGIC(scan, EXT2_ET_MAGIC_INODE_SCAN);
587 length = EXT2_INODE_SIZE(scan->fs->super);
588 iblock_status = SCAN_BLOCK_STATUS(scan);
593 if (scan->inodes_left <= 0) {
595 if (scan->done_group) {
596 retval = (scan->done_group)
597 (scan->fs, scan, scan->current_group,
598 scan->done_group_data);
602 if (scan->groups_left <= 0) {
606 retval = get_next_blockgroup(scan);
614 if ((scan->scan_flags & EXT2_SF_DO_LAZY) &&
615 (ext2fs_bg_flags_test(scan->fs, scan->current_group, EXT2_BG_INODE_UNINIT)
618 if (scan->inodes_left == 0)
620 if (scan->current_block == 0) {
621 if (scan->scan_flags & EXT2_SF_SKIP_MISSING_ITABLE) {
632 if (scan->bytes_left < scan->inode_size) {
633 memcpy(scan->temp_buffer, scan->ptr, scan->bytes_left);
634 extra_bytes = scan->bytes_left;
636 retval = get_next_blocks(scan);
644 if (is_empty_scan(scan))
656 iblk = scan->current_inode % EXT2_INODES_PER_GROUP(scan->fs->super) /
657 EXT2_INODES_PER_BLOCK(scan->fs->super) %
658 scan->inode_buffer_blocks;
660 memcpy(scan->temp_buffer+extra_bytes, scan->ptr,
661 scan->inode_size - extra_bytes);
662 scan->ptr += scan->inode_size - extra_bytes;
663 scan->bytes_left -= scan->inode_size - extra_bytes;
667 !(scan->fs->flags & EXT2_FLAG_IGNORE_CSUM_ERRORS) &&
668 !ext2fs_inode_csum_verify(scan->fs, scan->current_inode + 1,
669 (struct ext2_inode_large *)scan->temp_buffer))
674 ext2fs_swap_inode_full(scan->fs,
676 (struct ext2_inode_large *) scan->temp_buffer,
679 memcpy(iptr, scan->temp_buffer, length);
681 if (scan->scan_flags & EXT2_SF_BAD_EXTRA_BYTES)
683 scan->scan_flags &= ~EXT2_SF_BAD_EXTRA_BYTES;
687 !(scan->fs->flags & EXT2_FLAG_IGNORE_CSUM_ERRORS) &&
688 !ext2fs_inode_csum_verify(scan->fs, scan->current_inode + 1,
689 (struct ext2_inode_large *)scan->ptr))
694 ext2fs_swap_inode_full(scan->fs,
696 (struct ext2_inode_large *) scan->ptr,
699 memcpy(iptr, scan->ptr, length);
701 scan->ptr += scan->inode_size;
702 scan->bytes_left -= scan->inode_size;
703 if (scan->scan_flags & EXT2_SF_BAD_INODE_BLK)
710 scan->inodes_left--;
711 scan->current_inode++;
712 *ino = scan->current_inode;
720 errcode_t ext2fs_get_next_inode(ext2_inode_scan scan, ext2_ino_t *ino,
723 return ext2fs_get_next_inode_full(scan, ino, inode,