/*
 * 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;
}
