blob: a7245177d3d5eaa51a85f2e2d9e7cdd5d7c400d2 [file] [log] [blame]
/*
* Copyright 1996-2002 Hans Reiser
*/
#include "fsck.h"
/*
void get_next_key (struct path * path, int i, struct key * key)
{
struct buffer_head * bh = PATH_PLAST_BUFFER (path);
struct key * rkey;
if (i < B_NR_ITEMS (bh) - 1) {
// next item is in this block
copy_key (key, B_N_PKEY (bh, i + 1));
return;
}
rkey = uget_rkey (path);
if (rkey) {
// got next item key from right delimiting key
copy_key (key, rkey);
} else {
// there is no next item
memset (key, 0xff, KEY_SIZE);
}
}
*/
void pass_4_check_unaccessed_items (void)
{
struct key key;
struct path path;
int i;
struct buffer_head * bh;
struct item_head * ih;
unsigned long items;
struct 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 = get_ih (&path); i < B_NR_ITEMS (bh); i ++, ih ++) {
if (!is_item_reachable (ih)) {
PATH_LAST_POSITION (&path) = i;
rdkey = get_next_key_2 (&path);
if (rdkey)
key = *rdkey;
else
memset (&key, 0xff, KEY_SIZE);
pass_4_stat (fs)->deleted_items ++;
reiserfsck_delete_item (&path, 0);
goto cont;
}
}
PATH_LAST_POSITION(&path) = i - 1;
rdkey = reiserfs_next_key (&path);
if (rdkey)
key = *rdkey;
else
memset (&key, 0xff, KEY_SIZE);
pathrelse (&path);
cont:
}
pathrelse (&path);
fsck_progress ("done\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;
flush_objectid_map (proper_id_map (fs), fs);
reiserfs_flush_to_ondisk_bitmap (fs->fs_bitmap2, fs);
reiserfs_flush (fs);
fsck_progress ("done\n");
return;
}