⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ftape-eof.c

📁 arm平台上的uclinux系统全部源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
							++sector_nr;							mask >>= 1;						}						if (sector_nr >= 29) {							if (++segment >= ftape_last_segment.id) {								TRACEx1(5, "segment out of range: %d", segment);								result = -EIO;								break;							}							mask = get_bad_sector_entry(segment);							sector_nr = 0;						}					} while (mask & 1);					++sector_nr;	/* point to good sector */					mask >>= 1;				} while (--sector);				if (result >= 0) {					TRACEx2(5, "writing filemark %d/%d", segment, sector_nr);					put_file_mark_in_map(segment, sector_nr);					++segment;	/* next segment */					sector_nr = 0;					sector = 1;	/* first sector */				}			}		}	} else {		result = -EPERM;	}	TRACE_EXIT;	return result;}int ftape_erase(void){	TRACE_FUN(5, "ftape_erase");	int result = 0;	int i;	unsigned long now = 0;	byte *buffer = deblock_buffer;	if (write_protected) {		result = -EROFS;	} else {		result = read_header_segment(buffer);		if (result >= 0) {			/*  Copy entries from bad-sector-log into bad-sector-map			 */			TRACEx1(5, "old label: `%s'", (char *) (buffer + 30));			if (!ftape_validate_label((char *) &buffer[30])) {				TRACE(5, "invalid label, overwriting with new");				memset(buffer + 30, 0, 44);				memcpy(buffer + 30, linux_tape_label, strlen(linux_tape_label));				buffer[30 + strlen(linux_tape_label)] = '2';				TRACEx1(5, "new label: `%s'", (char *) (buffer + 30));				PUT4(buffer, 74, now);				if (format_code != 4) {					for (i = 0; i < nr_of_eof_marks; ++i) {						unsigned failing_segment = eof_map[i].mark.segment;						if (!valid_segment_no(failing_segment)) {							TRACEi(4, "bad entry in failed sector log:", failing_segment);						} else {							put_bad_sector_entry(failing_segment, EMPTY_SEGMENT);							TRACEx2(4, "moved entry %d from failed sector log (%d)",								i, failing_segment);						}					}				}			}			/*  Clear failed sector log: remove all tape marks			 */			failed_sector_log_changed = 1;			memset(eof_map, 0, sizeof(eof_map));			nr_of_eof_marks = 0;			ftape_fmt_version = max_fmt_version;#if 0			fix_tape(buffer);	/* see ftape-bsm.c ! */#endif			result = ftape_update_header_segments(buffer, 1);			prevent_flush();	/* prevent flush_buffers writing file marks */			reset_eof_list();		}	}	TRACE_EXIT;	return result;}void extract_file_marks(byte * address){	TRACE_FUN(8, "extract_file_marks");	int i;	if (format_code == 4) {		byte *end;		byte *start = find_end_of_bsm_list(address + 256,					     address + 29 * SECTOR_SIZE);		memset(eof_map, 0, sizeof(eof_map));		nr_of_eof_marks = 0;		if (start) {			start += 3;	/* skip end of list mark */			end = find_end_of_eof_list(start, address + 29 * SECTOR_SIZE);			if (end && end - start <= sizeof(eof_map)) {				nr_of_eof_marks = (end - start) / sizeof(unsigned long);				memcpy(eof_map, start, end - start);			} else {				TRACE(1, "File Mark List is too long or damaged !");			}		} else {			TRACE(1, "Bad Sector List is too long or damaged !");		}	} else {		memcpy(eof_map, address + 256, sizeof(eof_map));		nr_of_eof_marks = GET2(address, 144);	}	TRACEi(4, "number of file marks:", nr_of_eof_marks);	if (ftape_fmt_version == 1) {		TRACE(-1, "swapping version 1 fields");		/*  version 1 format uses swapped sector and segment fields, correct that !		 */		for (i = 0; i < nr_of_eof_marks; ++i) {			unsigned short tmp = eof_map[i].mark.segment;			eof_map[i].mark.segment = eof_map[i].mark.sector;			eof_map[i].mark.sector = tmp;		}	}	for (i = 0; i < nr_of_eof_marks; ++i) {		TRACEx2(4, "eof mark: %5d/%2d",			eof_map[i].mark.segment, eof_map[i].mark.sector);	}	reset_eof_list();	TRACE_EXIT;}int update_failed_sector_log(byte * buffer){	TRACE_FUN(8, "update_failed_sector_log");	if (ftape_fmt_version != 0 && failed_sector_log_changed) {		if (ftape_fmt_version == 1) {			TRACE(-1, "upgrading version 1 format to version 2");			/*  version 1 will be upgraded to version 2 when written.			 */			buffer[30 + strlen(linux_tape_label)] = '2';			ftape_fmt_version = 2;			TRACEx1(-1, "new tape label = \"%s\"", &buffer[30]);		}		if (format_code == 4) {			byte *dest = find_end_of_bsm_list(buffer + 256,					  buffer + 29 * SECTOR_SIZE) + 3;			if (dest) {				TRACEx2(4, "eof_map at byte offset %6d, size %d",					dest - buffer - 256, nr_of_eof_marks * sizeof(unsigned long));				memcpy(dest, eof_map, nr_of_eof_marks * sizeof(unsigned long));				PUT4(dest, nr_of_eof_marks * sizeof(unsigned long), 0);			}		} else {			memcpy(buffer + 256, eof_map, sizeof(eof_map));			PUT2(buffer, 144, nr_of_eof_marks);		}		failed_sector_log_changed = 0;		return 1;	}	TRACE_EXIT;	return 0;}int ftape_seek_eom(void){	TRACE_FUN(5, "ftape_seek_eom");	int result = 0;	unsigned eom;	if (first_data_segment == -1) {		result = read_header_segment(deblock_buffer);	}	if (result >= 0 && ftape_fmt_version != 0) {		eom = first_data_segment;		eof_index = 0;		eof_mark_ptr = &eof_map[0].mark;		/*  If fresh tape, count should be zero but we don't		 *  want to worry about the case it's one.		 */		for (eof_index = 1, eof_mark_ptr = &eof_map[1].mark;		     eof_index < nr_of_eof_marks; ++eof_index, ++eof_mark_ptr) {			/*  The eom is recorded as two eof marks in succeeding segments			 *  where the second one is always at segment number 1.			 */			if (eof_mark_ptr->sector == 1) {				if (eof_mark_ptr->segment == (eof_mark_ptr - 1)->segment + 1) {					eom = eof_mark_ptr->segment;					break;				}			}		}		ftape_seg_pos = eom;		TRACEx1(5, "eom found at segment %d", eom);	} else {		TRACE(5, "Couldn't get eof mark table");		result = -EIO;	}	TRACE_EXIT;	return result;}int ftape_seek_eof(unsigned count){	TRACE_FUN(5, "ftape_seek_eof");	int result = 0;	enum {		not = 0, begin, end	} bad_seek = not;	if (first_data_segment == -1) {		result = read_header_segment(deblock_buffer);	}	TRACEx1(5, "tape positioned at segment %d", ftape_seg_pos);	if (ftape_fmt_version == 0) {		result = -1;	}	if (result >= 0 && count != 0) {		for (eof_index = 0; eof_index <= nr_of_eof_marks; ++eof_index) {			if (eof_index == nr_of_eof_marks ||	/* start seeking after last mark */			    ftape_seg_pos <= eof_map[eof_index].mark.segment) {				eof_index += count;				if (eof_index < 1) {	/* begin of tape */					ftape_seg_pos = first_data_segment;					if (eof_index < 0) {	/* `before' begin of tape */						eof_index = 0;						bad_seek = begin;					}				} else if (eof_index >= nr_of_eof_marks) {	/* `after' end of tape */					ftape_seg_pos = segments_per_track * tracks_per_tape;					if (eof_index > nr_of_eof_marks) {						eof_index = nr_of_eof_marks;						bad_seek = end;					}				} else {	/* after requested file mark */					ftape_seg_pos = eof_map[eof_index - 1].mark.segment + 1;				}				eof_mark_ptr = &eof_map[eof_index].mark;				break;			}		}	}	if (result < 0) {		TRACE(5, "Couldn't get eof mark table");		result = -EIO;	} else if (bad_seek != not) {		TRACEx1(1, "seek reached %s of tape",			(bad_seek == begin) ? "begin" : "end");		result = -EIO;	} else {		TRACEx1(5, "tape repositioned to segment %d", ftape_seg_pos);	}	TRACE_EXIT;	return result;}int ftape_file_no(daddr_t * f_no, daddr_t * b_no){	TRACE_FUN(5, "ftape_file_no");	int result = 0;	int i;	*f_no = eof_index;	*b_no = ftape_seg_pos;	TRACEi(4, "number of file marks:", nr_of_eof_marks);	for (i = 0; i < nr_of_eof_marks; ++i) {		TRACEx2(4, "eof mark: %5d/%2d",			eof_map[i].mark.segment, eof_map[i].mark.sector);	}	TRACE_EXIT;	return result;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -