File:  [Power 6/32 Unix Tahoe 4.2BSD] / cci / sys / stand / vdfmt / verify.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Sun Jul 28 12:29:50 2019 UTC (7 years ago) by root
Branches: bsd, MAIN
CVS tags: v121, HEAD
Power 6/32 Unix version 1.21

#include	"vdfmt.h"

#define	quiet 0

/*
**
*/

verify()
{
	extern boolean	read_bad_sector_map();

	cur.state = vfy;
	print("Starting verification on ");
	printf("controller %d, drive %d, ", cur.controller, cur.drive);
	printf("type %s.\n",CURRENT->type_name);

	if(is_formatted() == true) {
		if(read_bad_sector_map() == true) {
			if(bad_map->bs_id == D_INFO.id) {
				verify_users_data_area();
				return;
			}
		}
		print("I can't verify drives with old formats.\n");
		return;
	}
	print("I can't verify unformatted drives.\n");
}


/*
**
*/

load_verify_patterns()
{
	register int index;

	/* Init bad block pattern array */
	for(index=0; index<TRKSIZ; index++) {
		pattern_0[index] = CURRENT->fmt_pat[0];
		pattern_1[index] = CURRENT->fmt_pat[1];
		pattern_2[index] = CURRENT->fmt_pat[2];
		pattern_3[index] = CURRENT->fmt_pat[3];
		pattern_4[index] = CURRENT->fmt_pat[4];
		pattern_5[index] = CURRENT->fmt_pat[5];
		pattern_6[index] = CURRENT->fmt_pat[6];
		pattern_7[index] = CURRENT->fmt_pat[7];
		pattern_8[index] = CURRENT->fmt_pat[8];
		pattern_9[index] = CURRENT->fmt_pat[9];
		pattern_10[index] = CURRENT->fmt_pat[10];
		pattern_11[index] = CURRENT->fmt_pat[11];
		pattern_12[index] = CURRENT->fmt_pat[12];
		pattern_13[index] = CURRENT->fmt_pat[13];
		pattern_14[index] = CURRENT->fmt_pat[14];
		pattern_15[index] = CURRENT->fmt_pat[15];
	}
}


/*
**
*/

verify_relocation_area()
{
	cur.substate = sub_vfy;
	verify_cylinders((int)CURRENT->ncyl - NUMSYS, NUMREL, 16);
	sync_bad_sector_map();
}


/*
**
*/

verify_users_data_area()
{
	int	pats = ops_to_do[cur.controller][cur.drive].numpat;

	cur.substate = sub_vfy;
	verify_cylinders(0, (int)CURRENT->ncyl - NUMSYS, pats);
	sync_bad_sector_map();
}


/*
**
*/

verify_maintainence_area()
{
	cur.substate = sub_vfy;
	verify_cylinders(CURRENT->ncyl - NUMSYS + NUMREL, NUMMNT, 16);
	sync_bad_sector_map();
}


/*
**	verify_cylinders does full track certification for every track
** on the cylinder.  This is done for speed and minimal head movement.  If
** an error occurs on any single track the track is flagged for later
** verification by verify sectors.
*/

verify_cylinders(base_cyl, cyl_count, pats)
int	base_cyl, cyl_count, pats;
{
	dskadr		dskaddr;

	/* verify each track of each cylinder */
	for (dskaddr.cylinder=base_cyl; dskaddr.cylinder<(base_cyl+cyl_count);
	    dskaddr.cylinder++)
		for (dskaddr.track=0; dskaddr.track<CURRENT->ntrak;
		    dskaddr.track++)
			verify_track(&dskaddr, pats, quiet);
}


/*
**	verify_track verifies a single track. If the full track write and
** compare operation fails then each sector is read individually to determin
** which sectors are really bad.  If a sector is bad it is flagged as bad by
** the verify sector routine.
*/

verify_track(dskaddr, pats, verbosity)
dskadr	*dskaddr;
int	pats;
int	verbosity;
{
	register int	index, i;
	register int	count;
	register long	before;
	register long	*after;
	register long	offset = CURRENT->secsize / sizeof(long);
	int		pattern_count = pats;

	if(pats == 0)
		return;
	dskaddr->sector = (char)0;
	access_dsk((char *)pattern_address[0], dskaddr, WD, CURRENT->nsec, 1);
	for(index = 0; index < pattern_count; index++) {
		if(!data_ok()) {
			if(dcb.operrsta & HEADER_ERROR)  {
				flag_sector(dskaddr, dcb.operrsta, verbosity);
				break;
			}
			if(dcb.operrsta & DATA_ERROR)
				pattern_count = 16;
		}
		access_dsk((char *)scratch,dskaddr,RD,CURRENT->nsec,1);
		if(!data_ok()) {
			if(dcb.operrsta & HEADER_ERROR)  {
				flag_sector(dskaddr, dcb.operrsta, verbosity);
				break;
			}
			pattern_count = 16;
			for(i = 0; i < CURRENT->nsec; i++) {
				register long	*next;

				dskaddr->sector = i;
				next = &scratch[i * offset];
				access_dsk((char *)next,dskaddr,RD,1,1);
				if(!data_ok()) {
					flag_sector(dskaddr,
					    dcb.operrsta,verbosity);
				}
			}
			dskaddr->sector = (char)0;
		}
		if(index+1 < pattern_count)
			access_dsk((char *)pattern_address[index+1],
			    dskaddr, WD, CURRENT->nsec, 0);
		count = CURRENT->nsec * offset;
		before = *pattern_address[index];
		after = scratch;
		for(i=0; i<count; i++) {
			if(before != *(after++)) {
				dskaddr->sector = i / offset;
				flag_sector(dskaddr, DATA_ERROR, verbosity);
			}
		}
		if(index+1 <= pattern_count) {
			poll(60);
			if(vdtimeout <= 0) {
				printf(" while verifing track.\n");
				_longjmp(abort_environ, 1);
			}
		}
		if(kill_processes == true) {
			sync_bad_sector_map();
			_longjmp(quit_environ, 1);
		}
	}
}


flag_sector(dskaddr, status, verbose)
dskadr	*dskaddr;
long	status;
int	verbose;
{
	fmt_err		error;
	bs_entry	entry;

	indent();
	if(verbose) {
		print("Error at sector %d, status=0x%x.",
		    to_sector(*dskaddr), status);
		printf("  Sector will be relocated.\n");
	}
	if(is_in_map(dskaddr) == false) {
		error.err_adr = *dskaddr;
		error.err_stat = status;
		entry = (*C_INFO.code_pos)(error);
		add_flaw(&entry);
	}
	exdent(1);
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.