Home | History | Annotate | Download | only in ext2fs

Lines Matching refs:scan

48 					      ext2_inode_scan scan,
109 ext2_inode_scan scan;
134 retval = ext2fs_get_mem(sizeof(struct ext2_struct_inode_scan), &scan);
137 memset(scan, 0, sizeof(struct ext2_struct_inode_scan));
139 scan->magic = EXT2_ET_MAGIC_INODE_SCAN;
140 scan->fs = fs;
141 scan->inode_size = EXT2_INODE_SIZE(fs->super);
142 scan->bytes_left = 0;
143 scan->current_group = 0;
144 scan->groups_left = fs->group_desc_count - 1;
145 scan->inode_buffer_blocks = buffer_blocks ? buffer_blocks : 8;
146 scan->current_block = scan->fs->
147 group_desc[scan->current_group].bg_inode_table;
148 scan->inodes_left = EXT2_INODES_PER_GROUP(scan->fs->super);
149 scan->blocks_left = scan->fs->inode_blocks_per_group;
152 scan->inodes_left -=
153 fs->group_desc[scan->current_group].bg_itable_unused;
154 scan->blocks_left =
155 (scan->inodes_left +
156 (fs->blocksize / scan->inode_size - 1)) *
157 scan->inode_size / fs->blocksize;
159 retval = ext2fs_get_array(scan->inode_buffer_blocks,
161 &scan->inode_buffer);
162 scan->done_group = 0;
163 scan->done_group_data = 0;
164 scan->bad_block_ptr = 0;
166 ext2fs_free_mem(&scan);
169 retval = ext2fs_get_mem(scan->inode_size, &scan->temp_buffer);
171 ext2fs_free_mem(&scan->inode_buffer);
172 ext2fs_free_mem(&scan);
175 if (scan->fs->badblocks && scan->fs->badblocks->num)
176 scan->scan_flags |= EXT2_SF_CHK_BADBLOCKS;
179 scan->scan_flags |= EXT2_SF_DO_LAZY;
180 *ret_scan = scan;
184 void ext2fs_close_inode_scan(ext2_inode_scan scan)
186 if (!scan || (scan->magic != EXT2_ET_MAGIC_INODE_SCAN))
189 ext2fs_free_mem(&scan->inode_buffer);
190 scan->inode_buffer = NULL;
191 ext2fs_free_mem(&scan->temp_buffer);
192 scan->temp_buffer = NULL;
193 ext2fs_free_mem(&scan);
197 void ext2fs_set_inode_callback(ext2_inode_scan scan,
199 ext2_inode_scan scan,
204 if (!scan || (scan->magic != EXT2_ET_MAGIC_INODE_SCAN))
207 scan->done_group = done_group;
208 scan->done_group_data = done_group_data;
211 int ext2fs_inode_scan_flags(ext2_inode_scan scan, int set_flags,
216 if (!scan || (scan->magic != EXT2_ET_MAGIC_INODE_SCAN))
219 old_flags = scan->scan_flags;
220 scan->scan_flags &= ~clear_flags;
221 scan->scan_flags |= set_flags;
229 static errcode_t get_next_blockgroup(ext2_inode_scan scan)
231 ext2_filsys fs = scan->fs;
233 scan->current_group++;
234 scan->groups_left--;
236 scan->current_block =fs->group_desc[scan->current_group].bg_inode_table;
238 scan->current_inode = scan->current_group *
241 scan->bytes_left = 0;
242 scan->inodes_left = EXT2_INODES_PER_GROUP(fs->super);
243 scan->blocks_left = fs->inode_blocks_per_group;
246 scan->inodes_left -=
247 fs->group_desc[scan->current_group].bg_itable_unused;
248 scan->blocks_left =
249 (scan->inodes_left +
250 (fs->blocksize / scan->inode_size - 1)) *
251 scan->inode_size / fs->blocksize;
257 errcode_t ext2fs_inode_scan_goto_blockgroup(ext2_inode_scan scan,
260 scan->current_group = group - 1;
261 scan->groups_left = scan->fs->group_desc_count - group;
262 return get_next_blockgroup(scan);
272 static errcode_t check_for_inode_bad_blocks(ext2_inode_scan scan,
275 blk_t blk = scan->current_block;
276 badblocks_list bb = scan->fs->badblocks;
291 while (blk > bb->list[scan->bad_block_ptr]) {
292 if (++scan->bad_block_ptr >= bb->num) {
293 scan->scan_flags &= ~EXT2_SF_CHK_BADBLOCKS;
306 if (blk == bb->list[scan->bad_block_ptr]) {
307 scan->scan_flags |= EXT2_SF_BAD_INODE_BLK;
309 if (++scan->bad_block_ptr >= bb->num)
310 scan->scan_flags &= ~EXT2_SF_CHK_BADBLOCKS;
320 if ((blk + *num_blocks) > bb->list[scan->bad_block_ptr])
321 *num_blocks = (int) (bb->list[scan->bad_block_ptr] - blk);
330 static errcode_t get_next_blocks(ext2_inode_scan scan)
340 num_blocks = scan->inode_buffer_blocks;
341 if (num_blocks > scan->blocks_left)
342 num_blocks = scan->blocks_left;
348 if (scan->scan_flags & EXT2_SF_BAD_INODE_BLK) {
349 if (scan->bytes_left)
350 scan->scan_flags |= EXT2_SF_BAD_EXTRA_BYTES;
351 scan->scan_flags &= ~EXT2_SF_BAD_INODE_BLK;
357 if (scan->scan_flags & EXT2_SF_CHK_BADBLOCKS) {
358 retval = check_for_inode_bad_blocks(scan, &num_blocks);
363 if ((scan->scan_flags & EXT2_SF_BAD_INODE_BLK) ||
364 (scan->current_block == 0)) {
365 memset(scan->inode_buffer, 0,
366 (size_t) num_blocks * scan->fs->blocksize);
368 retval = io_channel_read_blk(scan->fs->io,
369 scan->current_block,
371 scan->inode_buffer);
375 scan->ptr = scan->inode_buffer;
376 scan->bytes_left = num_blocks * scan->fs->blocksize;
378 scan->blocks_left -= num_blocks;
379 if (scan->current_block)
380 scan->current_block += num_blocks;
391 static inline int is_empty_scan(ext2_inode_scan scan)
395 if (scan->bytes_left == 0)
398 for (i=0; i < scan->bytes_left; i++)
399 if (scan->ptr[i])
405 errcode_t ext2fs_get_next_inode_full(ext2_inode_scan scan, ext2_ino_t *ino,
411 EXT2_CHECK_MAGIC(scan, EXT2_ET_MAGIC_INODE_SCAN);
416 if (scan->inodes_left <= 0) {
418 if (scan->done_group) {
419 retval = (scan->done_group)
420 (scan->fs, scan, scan->current_group,
421 scan->done_group_data);
425 if (scan->groups_left <= 0) {
429 retval = get_next_blockgroup(scan);
437 if ((scan->scan_flags & EXT2_SF_DO_LAZY) &&
438 (scan->fs->group_desc[scan->current_group].bg_flags &
441 if (scan->inodes_left == 0)
443 if (scan->current_block == 0) {
444 if (scan->scan_flags & EXT2_SF_SKIP_MISSING_ITABLE) {
455 if (scan->bytes_left < scan->inode_size) {
456 memcpy(scan->temp_buffer, scan->ptr, scan->bytes_left);
457 extra_bytes = scan->bytes_left;
459 retval = get_next_blocks(scan);
467 if (is_empty_scan(scan))
474 memcpy(scan->temp_buffer+extra_bytes, scan->ptr,
475 scan->inode_size - extra_bytes);
476 scan->ptr += scan->inode_size - extra_bytes;
477 scan->bytes_left -= scan->inode_size - extra_bytes;
481 ext2fs_swap_inode_full(scan->fs,
483 (struct ext2_inode_large *) scan->temp_buffer,
486 *inode = *((struct ext2_inode *) scan->temp_buffer);
488 if (scan->scan_flags & EXT2_SF_BAD_EXTRA_BYTES)
490 scan->scan_flags &= ~EXT2_SF_BAD_EXTRA_BYTES;
494 ext2fs_swap_inode_full(scan->fs,
496 (struct ext2_inode_large *) scan->ptr,
499 memcpy(inode, scan->ptr, bufsize);
501 scan->ptr += scan->inode_size;
502 scan->bytes_left -= scan->inode_size;
503 if (scan->scan_flags & EXT2_SF_BAD_INODE_BLK)
507 scan->inodes_left--;
508 scan->current_inode++;
509 *ino = scan->current_inode;
513 errcode_t ext2fs_get_next_inode(ext2_inode_scan scan, ext2_ino_t *ino,
516 return ext2fs_get_next_inode_full(scan, ino, inode,