| /* |
| * Copyright 1996-2004 by Hans Reiser, licensing governed by |
| * reiserfsprogs/README |
| */ |
| |
| #include "fsck.h" |
| |
| void pass_4_check_unaccessed_items(void) |
| { |
| struct reiserfs_key key; |
| struct reiserfs_path path; |
| int i; |
| struct buffer_head *bh; |
| struct item_head *ih; |
| unsigned long items; |
| const struct reiserfs_key *rdkey; |
| |
| path.path_length = ILLEGAL_PATH_ELEMENT_OFFSET; |
| key = root_dir_key; |
| |
| fsck_progress("Pass 4 - "); |
| items = 0; |
| |
| while (reiserfs_search_by_key_4(fs, &key, &path) == ITEM_FOUND) { |
| bh = PATH_PLAST_BUFFER(&path); |
| |
| /* print ~ how many leaves were scanned and how fast it was */ |
| if (!fsck_quiet(fs)) |
| print_how_fast(items++, 0, 50, 0); |
| |
| for (i = get_item_pos(&path), ih = tp_item_head(&path); |
| i < B_NR_ITEMS(bh); i++, ih++) { |
| if (!is_item_reachable(ih)) { |
| PATH_LAST_POSITION(&path) = i; |
| rdkey = reiserfs_next_key(&path); |
| if (rdkey) |
| key = *rdkey; |
| else |
| memset(&key, 0xff, KEY_SIZE); |
| |
| pass_4_stat(fs)->deleted_items++; |
| |
| reiserfsck_delete_item(&path, 0); |
| |
| goto cont; |
| } |
| |
| if (get_ih_flags(ih) != 0) { |
| clean_ih_flags(ih); |
| mark_buffer_dirty(bh); |
| } |
| |
| } |
| PATH_LAST_POSITION(&path) = i - 1; |
| rdkey = reiserfs_next_key(&path); |
| if (rdkey) |
| key = *rdkey; |
| else |
| memset(&key, 0xff, KEY_SIZE); |
| |
| pathrelse(&path); |
| |
| cont: |
| /* to make gcc 3.2 do not sware here */ ; |
| } |
| |
| pathrelse(&path); |
| |
| fsck_progress("finished\n"); |
| stage_report(4, fs); |
| |
| /* after pass 4 */ |
| |
| /* put bitmap on place */ |
| reiserfs_bitmap_copy(fs->fs_bitmap2, fsck_new_bitmap(fs)); |
| |
| /* update super block */ |
| set_sb_free_blocks(fs->fs_ondisk_sb, |
| reiserfs_bitmap_zeros(fsck_new_bitmap(fs))); |
| mark_buffer_dirty(fs->fs_super_bh); |
| |
| /* write all dirty blocks */ |
| fsck_progress("Flushing.."); |
| fs->fs_dirt = 1; |
| id_map_flush(proper_id_map(fs), fs); |
| reiserfs_flush_to_ondisk_bitmap(fs->fs_bitmap2, fs); |
| reiserfs_flush(fs); |
| fsck_progress("finished\n"); |
| |
| return; |
| } |