Browse Source

use separate IndexSector variables for vectorized marking of sectors - it seems that in the previous revision the use of hd.sec, sup.x, sub.x for vectorized marking introduced a problem manifested by a corruption of the marking map

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@8398 8c9fc860-2736-0410-a75d-ab315db34111
eth.morozova 6 năm trước cách đây
mục cha
commit
a6c9379700
1 tập tin đã thay đổi với 15 bổ sung13 xóa
  1. 15 13
      source/DiskFS.Mod

+ 15 - 13
source/DiskFS.Mod

@@ -373,7 +373,7 @@ TYPE
 		VAR k: LONGINT; A: ARRAY 2000 OF DiskAdr; files: LONGINT; bad: BOOLEAN;
 
 			PROCEDURE MarkSectors;
-			VAR L, R, i, j, n: LONGINT; x: DiskAdr; hd: FileHeader; sup, sub: IndexSector;
+			VAR L, R, i, j, n: LONGINT; x: DiskAdr; hd: FileHeader; sup, sub, mark, marksup: IndexSector;
 				size: Files.TSize;
 
 				PROCEDURE sift(L, R: LONGINT);
@@ -402,21 +402,21 @@ TYPE
 						j := hd.aleng + 1;
 						REPEAT
 							DEC(j);
-							IF hd.sec[j] # 0 THEN hd.sec[j] := hd.sec[j] DIV SectorFactor; (* preparation for block marking *)
-							ELSE hd.aleng := j-1; bad := TRUE 
+							IF hd.sec[j] # 0 THEN mark.x[j] := hd.sec[j] DIV SectorFactor; (* preparation for block marking *)
+							ELSE hd.aleng := j-1; bad := TRUE; mark.x[j] := 0;
 							END
 						UNTIL j = 0;
-						vol.MarkBlocks(hd.sec,0,hd.aleng+1); 
+						vol.MarkBlocks(mark.x,0,hd.aleng+1); 
 					ELSE
 						j := SectorTableSize;
 						REPEAT
 							DEC(j);
 							IF hd.sec[j] # 0 THEN 
-								hd.sec[j] := hd.sec[j] DIV SectorFactor; (* preparation for block marking *)
-							ELSE hd.aleng := j-1; bad := TRUE 
+								mark.x[j] := hd.sec[j] DIV SectorFactor; (* preparation for block marking *)
+							ELSE hd.aleng := j-1; bad := TRUE; mark.x[j] := 0;
 							END
 						UNTIL j = 0;
-						vol.MarkBlocks(hd.sec,0,SectorTableSize); 
+						vol.MarkBlocks(mark.x,0,SectorTableSize); 
 						IF hd.ext = 0 THEN hd.aleng := SectorTableSize-1; bad := TRUE END;
 						IF ~bad THEN
 							MarkSector(vol, hd.ext); 
@@ -425,21 +425,23 @@ TYPE
 							WHILE (i <= n) & ~bad DO
 								IF sup.x[i] # 0 THEN
 									GetSector(vol, sup.x[i], sub);
-									sup.x[i] := sup.x[i] DIV SectorFactor; (* preparation for block marking *)
+									marksup.x[i] := sup.x[i] DIV SectorFactor; (* preparation for block marking *)
 									IF i < n THEN size := IndexSize
 									ELSE size := (hd.aleng - SectorTableSize) MOD IndexSize + 1
 									END;
 									FOR j := 0 TO size-1 DO
 										IF (sub.x[j] MOD SectorFactor = 0) & (sub.x[j] > 0) THEN
-											sub.x[j] := sub.x[j] DIV SectorFactor; (* preparation for block marking *)
+											mark.x[j] := sub.x[j] DIV SectorFactor; (* preparation for block marking *)
 										ELSE
-											sub.x[j] := 0; 
+											mark.x[j] := 0; 
 											bad := TRUE
 										END
 									END;
-									vol.MarkBlocks(sub.x,0,size);
+									vol.MarkBlocks(mark.x,0,size);
 									INC(i)
-								ELSE bad := TRUE
+								ELSE 
+									bad := TRUE;
+									marksup.x[i] := 0;
 								END;
 								IF bad THEN
 									IF i = 0 THEN hd.aleng := SectorTableSize-1
@@ -447,7 +449,7 @@ TYPE
 									END
 								END
 							END;
-							vol.MarkBlocks(sup.x,0,n);
+							vol.MarkBlocks(marksup.x,0,n);
 						END
 					END;
 					IF bad THEN