Explorar el Código

Only traverse recovery file's FAT table to fast the recovery performance.

Signed-off-by: erictian
Reviewed-by: niruiyu

(based on FatPkg commit 6e68a62cf0c6b8ecad2bceff4e8d86ff08d1f041)

[jordan.l.justen@intel.com: Use script to relicense to 2-clause BSD]
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
Acked-by: Mark Doran <mark.doran@intel.com>
Acked-by: Laszlo Ersek <lersek@redhat.com>
Feng Tian hace 12 años
padre
commit
1d951a3086
Se han modificado 2 ficheros con 17 adiciones y 6 borrados
  1. 5 5
      FatPkg/FatPei/FatLiteAccess.c
  2. 12 1
      FatPkg/FatPei/FatLiteApi.c

+ 5 - 5
FatPkg/FatPei/FatLiteAccess.c

@@ -1,7 +1,7 @@
 /** @file
   FAT file system access routines for FAT recovery PEIM
 
-Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
 
 This program and the accompanying materials are licensed and made available
 under the terms and conditions of the BSD License which accompanies this
@@ -315,7 +315,10 @@ FatSetFilePos (
     }
 
     File->CurrentPos += Pos;
-
+    //
+    // Calculate the amount of consecutive cluster occupied by the file.
+    // FatReadFile() will use it to read these blocks once.
+    //
     File->StraightReadAmount  = 0;
     Cluster                   = File->CurrentCluster;
     while (!FAT_CLUSTER_FUNCTIONAL (Cluster)) {
@@ -517,9 +520,6 @@ FatReadNextDirectoryEntry (
   SubFile->StartingCluster  = SubFile->CurrentCluster;
   SubFile->Volume           = ParentDir->Volume;
 
-  if (SubFile->StartingCluster != 0) {
-    Status = FatSetFilePos (PrivateData, SubFile, 0);
-  }
   //
   // in Pei phase, time parameters do not need to be filled for minimum use.
   //

+ 12 - 1
FatPkg/FatPei/FatLiteApi.c

@@ -1,7 +1,7 @@
 /** @file
   FAT recovery PEIM entry point, Ppi Functions and FAT Api functions.
 
-Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
 
 This program and the accompanying materials are licensed and made available
 under the terms and conditions of the BSD License which accompanies this
@@ -577,6 +577,7 @@ FindRecoveryFile (
   //
   // Construct root directory file
   //
+  ZeroMem (&Parent, sizeof (PEI_FAT_FILE));
   Parent.IsFixedRootDir   = (BOOLEAN) ((PrivateData->Volume[VolumeIndex].FatType == Fat32) ? FALSE : TRUE);
   Parent.Attributes       = FAT_ATTR_DIRECTORY;
   Parent.CurrentPos       = 0;
@@ -593,6 +594,9 @@ FindRecoveryFile (
   //
   Status = FatReadNextDirectoryEntry (PrivateData, &Parent, File);
   while (Status == EFI_SUCCESS) {
+    //
+    // Compare whether the file name is recovery file name.
+    //
     if (EngStriColl (PrivateData, FileName, File->FileName)) {
       break;
     }
@@ -604,6 +608,13 @@ FindRecoveryFile (
     return EFI_NOT_FOUND;
   }
 
+  //
+  // Get the recovery file, set its file position to 0.
+  //
+  if (File->StartingCluster != 0) {
+    Status = FatSetFilePos (PrivateData, File, 0);
+  }
+
   *Handle = File;
 
   return EFI_SUCCESS;