]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkUnixPkg/Dxe/UnixThunk/Bus/SimpleFileSystem/UnixSimpleFileSystem.c
Fix the TPL broken issue for UnixPkg
[mirror_edk2.git] / EdkUnixPkg / Dxe / UnixThunk / Bus / SimpleFileSystem / UnixSimpleFileSystem.c
index 2a745cbdd22da7e6edf37901f883db78fbb729f8..10736d540737d4039b0eda655b7b8125741c3338 100644 (file)
@@ -1,6 +1,6 @@
 /*++\r
 \r
-Copyright (c) 2006, Intel Corporation                                                         \r
+Copyright (c) 2006 - 2007, Intel Corporation                                                         \r
 All rights reserved. This program and the accompanying materials                          \r
 are licensed and made available under the terms and conditions of the BSD License         \r
 which accompanies this distribution.  The full text of the license may be found at        \r
@@ -30,7 +30,7 @@ EFI_DRIVER_BINDING_PROTOCOL gUnixSimpleFileSystemDriverBinding = {
   UnixSimpleFileSystemDriverBindingSupported,\r
   UnixSimpleFileSystemDriverBindingStart,\r
   UnixSimpleFileSystemDriverBindingStop,\r
-  0x10,\r
+  0xa,\r
   NULL,\r
   NULL\r
 };\r
@@ -257,7 +257,7 @@ Returns:
   EFI_STATUS                        Status;\r
   EFI_UNIX_IO_PROTOCOL            *UnixIo;\r
   UNIX_SIMPLE_FILE_SYSTEM_PRIVATE *Private;\r
-  INTN i;
+  INTN i;\r
 \r
   Private = NULL;\r
 \r
@@ -295,8 +295,8 @@ Returns:
 \r
   Private->Signature  = UNIX_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE;\r
   Private->UnixThunk = UnixIo->UnixThunk;\r
-  Private->FilePath   = NULL;
-  Private->VolumeLabel = NULL;
+  Private->FilePath   = NULL;\r
+  Private->VolumeLabel = NULL;\r
 \r
   Status = gBS->AllocatePool (\r
                   EfiBootServicesData,\r
@@ -307,10 +307,10 @@ Returns:
   if (EFI_ERROR (Status)) {\r
     goto Done;\r
   }\r
-
-  for (i = 0; UnixIo->EnvString[i] != 0; i++)
+\r
+  for (i = 0; UnixIo->EnvString[i] != 0; i++)\r
     Private->FilePath[i] = UnixIo->EnvString[i];\r
-  Private->FilePath[i] = 0;
+  Private->FilePath[i] = 0;\r
 \r
   Private->VolumeLabel      = NULL;\r
   Status = gBS->AllocatePool (\r
@@ -349,10 +349,10 @@ Done:
 \r
     if (Private != NULL) {\r
 \r
-      if (Private->VolumeLabel != NULL)
-       gBS->FreePool (Private->VolumeLabel);
-      if (Private->FilePath != NULL)
-       gBS->FreePool (Private->FilePath);
+      if (Private->VolumeLabel != NULL)\r
+       gBS->FreePool (Private->VolumeLabel);\r
+      if (Private->FilePath != NULL)\r
+       gBS->FreePool (Private->FilePath);\r
       FreeUnicodeStringTable (Private->ControllerNameTable);\r
 \r
       gBS->FreePool (Private);\r
@@ -495,10 +495,12 @@ Returns:
   EFI_STATUS                        Status;\r
   UNIX_SIMPLE_FILE_SYSTEM_PRIVATE *Private;\r
   UNIX_EFI_FILE_PRIVATE           *PrivateFile;\r
+  EFI_TPL                           OldTpl;\r
 \r
   if (This == NULL || Root == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
 \r
   Private     = UNIX_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (This);\r
 \r
@@ -540,20 +542,20 @@ Returns:
   PrivateFile->EfiFile.GetInfo      = UnixSimpleFileSystemGetInfo;\r
   PrivateFile->EfiFile.SetInfo      = UnixSimpleFileSystemSetInfo;\r
   PrivateFile->EfiFile.Flush        = UnixSimpleFileSystemFlush;\r
-  PrivateFile->fd                   = -1;
-  PrivateFile->Dir                  = NULL;
-  PrivateFile->Dirent               = NULL;
+  PrivateFile->fd                   = -1;\r
+  PrivateFile->Dir                  = NULL;\r
+  PrivateFile->Dirent               = NULL;\r
   \r
   *Root = &PrivateFile->EfiFile;\r
 \r
-  PrivateFile->Dir = PrivateFile->UnixThunk->OpenDir(PrivateFile->FileName);
+  PrivateFile->Dir = PrivateFile->UnixThunk->OpenDir(PrivateFile->FileName);\r
 \r
-  if (PrivateFile->Dir == NULL) {
+  if (PrivateFile->Dir == NULL) {\r
     Status = EFI_ACCESS_DENIED;\r
-  }
-  else {
+  }\r
+  else {\r
     Status = EFI_SUCCESS;\r
-  }
+  }\r
 \r
 Done:\r
   if (EFI_ERROR (Status)) {\r
@@ -566,6 +568,8 @@ Done:
     }\r
   }\r
 \r
+  gBS->RestoreTPL (OldTpl);\r
+\r
   return Status;\r
 }\r
 \r
@@ -629,10 +633,9 @@ Returns:
   UNIX_EFI_FILE_PRIVATE           *NewPrivateFile;\r
   UNIX_SIMPLE_FILE_SYSTEM_PRIVATE *PrivateRoot;\r
   EFI_STATUS                        Status;\r
-  CHAR16                            *Src;
-  char                              *Dst;
+  CHAR16                            *Src;\r
+  char                              *Dst;\r
   CHAR8                             *RealFileName;\r
-  CHAR16                            *TempFileName;\r
   char                              *ParseFileName;\r
   char                              *GuardPointer;\r
   CHAR8                             TempChar;\r
@@ -672,9 +675,7 @@ Returns:
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  //\r
-  //\r
-  //\r
+\r
   PrivateFile     = UNIX_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
   PrivateRoot     = UNIX_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (PrivateFile->SimpleFileSystem);\r
   NewPrivateFile  = NULL;\r
@@ -683,7 +684,7 @@ Returns:
   // BUGBUG: assume an open of root\r
   // if current location, return current data\r
   //\r
-  if (StrCmp (FileName, L"\\") == 0
+  if (StrCmp (FileName, L"\\") == 0\r
       || (StrCmp (FileName, L".") == 0 && PrivateFile->IsRootDirectory)) {\r
     //\r
     // BUGBUG: assume an open root\r
@@ -727,25 +728,25 @@ OpenRoot:
 \r
   if (*FileName == L'\\') {\r
     AsciiStrCpy (NewPrivateFile->FileName, PrivateRoot->FilePath);\r
-    // Skip first '\'.
-    Src = FileName + 1;
+    // Skip first '\'.\r
+    Src = FileName + 1;\r
   } else {\r
     AsciiStrCpy (NewPrivateFile->FileName, PrivateFile->FileName);\r
-    Src = FileName;
-  }\r
-  Dst = NewPrivateFile->FileName + AsciiStrLen(NewPrivateFile->FileName);
-  GuardPointer = NewPrivateFile->FileName + AsciiStrLen(PrivateRoot->FilePath);
-  *Dst++ = '/';
-  // Convert unicode to ascii and '\' to '/'
-  while (*Src) {
-    if (*Src == '\\')
-      *Dst++ = '/';
-    else
-      *Dst++ = *Src;
-    Src++;
-  }
-  *Dst = 0;
-      
+    Src = FileName;\r
+  }\r
+  Dst = NewPrivateFile->FileName + AsciiStrLen(NewPrivateFile->FileName);\r
+  GuardPointer = NewPrivateFile->FileName + AsciiStrLen(PrivateRoot->FilePath);\r
+  *Dst++ = '/';\r
+  // Convert unicode to ascii and '\' to '/'\r
+  while (*Src) {\r
+    if (*Src == '\\')\r
+      *Dst++ = '/';\r
+    else\r
+      *Dst++ = *Src;\r
+    Src++;\r
+  }\r
+  *Dst = 0;\r
+      \r
 \r
   //\r
   // Get rid of . and .., except leading . or ..\r
@@ -810,22 +811,22 @@ OpenRoot:
   }\r
 \r
   RealFileName = NewPrivateFile->FileName + AsciiStrLen(NewPrivateFile->FileName) - 1;\r
-  while (RealFileName > NewPrivateFile->FileName && *RealFileName != '/')
-    RealFileName--;
+  while (RealFileName > NewPrivateFile->FileName && *RealFileName != '/')\r
+    RealFileName--;\r
 \r
   TempChar            = *(RealFileName - 1);\r
   *(RealFileName - 1) = 0;\r
 \r
   *(RealFileName - 1)             = TempChar;\r
 \r
-
-
+\r
+\r
   //\r
   // Test whether file or directory\r
   //\r
   NewPrivateFile->IsRootDirectory = FALSE;\r
-  NewPrivateFile->fd = -1;
-  NewPrivateFile->Dir = NULL;
+  NewPrivateFile->fd = -1;\r
+  NewPrivateFile->Dir = NULL;\r
   if (OpenMode & EFI_FILE_MODE_CREATE) {\r
     if (Attributes & EFI_FILE_DIRECTORY) {\r
       NewPrivateFile->IsDirectoryPath = TRUE;\r
@@ -833,11 +834,11 @@ OpenRoot:
       NewPrivateFile->IsDirectoryPath = FALSE;\r
     }\r
   } else {\r
-    struct stat finfo;
-    int res = NewPrivateFile->UnixThunk->Stat (NewPrivateFile->FileName, &finfo);
-    if (res == 0 && S_ISDIR(finfo.st_mode))
+    struct stat finfo;\r
+    int res = NewPrivateFile->UnixThunk->Stat (NewPrivateFile->FileName, &finfo);\r
+    if (res == 0 && S_ISDIR(finfo.st_mode))\r
       NewPrivateFile->IsDirectoryPath = TRUE;\r
-    else
+    else\r
       NewPrivateFile->IsDirectoryPath = FALSE;\r
   }\r
 \r
@@ -859,22 +860,22 @@ OpenRoot:
       // Create a directory\r
       //\r
       if (NewPrivateFile->UnixThunk->MkDir (NewPrivateFile->FileName, 0777) != 0) {\r
-       INTN LastError;
+       INTN LastError;\r
 \r
         LastError = PrivateFile->UnixThunk->GetErrno ();\r
-        if (LastError != EEXIST) {
-          gBS->FreePool (TempFileName);\r
+        if (LastError != EEXIST) {\r
+          //gBS->FreePool (TempFileName);\r
           Status = EFI_ACCESS_DENIED;\r
           goto Done;\r
         }\r
       }\r
     }\r
 \r
-    NewPrivateFile->Dir = NewPrivateFile->UnixThunk->OpenDir
-      (NewPrivateFile->FileName);
+    NewPrivateFile->Dir = NewPrivateFile->UnixThunk->OpenDir\r
+      (NewPrivateFile->FileName);\r
 \r
-    if (NewPrivateFile->Dir == NULL) {
-      if (PrivateFile->UnixThunk->GetErrno () == EACCES) {
+    if (NewPrivateFile->Dir == NULL) {\r
+      if (PrivateFile->UnixThunk->GetErrno () == EACCES) {\r
         Status                    = EFI_ACCESS_DENIED;\r
       } else {\r
         Status = EFI_NOT_FOUND;\r
@@ -887,13 +888,13 @@ OpenRoot:
     //\r
     // deal with file\r
     //\r
-    NewPrivateFile->fd = NewPrivateFile->UnixThunk->Open
+    NewPrivateFile->fd = NewPrivateFile->UnixThunk->Open\r
       (NewPrivateFile->FileName,\r
-       ((OpenMode & EFI_FILE_MODE_CREATE) ? O_CREAT : 0)
-       | (NewPrivateFile->IsOpenedByRead ? O_RDONLY : O_RDWR),
-       0666);
-    if (NewPrivateFile->fd < 0) {
-      if (PrivateFile->UnixThunk->GetErrno () == ENOENT) {
+       ((OpenMode & EFI_FILE_MODE_CREATE) ? O_CREAT : 0)\r
+       | (NewPrivateFile->IsOpenedByRead ? O_RDONLY : O_RDWR),\r
+       0666);\r
+    if (NewPrivateFile->fd < 0) {\r
+      if (PrivateFile->UnixThunk->GetErrno () == ENOENT) {\r
        Status = EFI_NOT_FOUND;\r
       } else {\r
        Status = EFI_ACCESS_DENIED;\r
@@ -980,6 +981,7 @@ Returns:
 // TODO:    EFI_INVALID_PARAMETER - add return value to function comment\r
 {\r
   UNIX_EFI_FILE_PRIVATE *PrivateFile;\r
+  EFI_TPL                OldTpl;\r
 \r
   if (This == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -987,21 +989,26 @@ Returns:
 \r
   PrivateFile = UNIX_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
 \r
-  if (PrivateFile->fd >= 0) {
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
+\r
+  if (PrivateFile->fd >= 0) {\r
     PrivateFile->UnixThunk->Close (PrivateFile->fd);\r
-  }
-  if (PrivateFile->Dir != NULL) {
+  }\r
+  if (PrivateFile->Dir != NULL) {\r
     PrivateFile->UnixThunk->CloseDir (PrivateFile->Dir);\r
-  }
+  }\r
 \r
-  PrivateFile->fd = -1;
-  PrivateFile->Dir = NULL;
+  PrivateFile->fd = -1;\r
+  PrivateFile->Dir = NULL;\r
 \r
   if (PrivateFile->FileName) {\r
     gBS->FreePool (PrivateFile->FileName);\r
   }\r
 \r
   gBS->FreePool (PrivateFile);\r
+\r
+  gBS->RestoreTPL (OldTpl);\r
+  \r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -1030,12 +1037,15 @@ Returns:
 // TODO:    EFI_INVALID_PARAMETER - add return value to function comment\r
 {\r
   EFI_STATUS              Status;\r
-  UNIX_EFI_FILE_PRIVATE *PrivateFile;\r
+  UNIX_EFI_FILE_PRIVATE   *PrivateFile;\r
+  EFI_TPL                 OldTpl;\r
 \r
   if (This == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
+  \r
   PrivateFile = UNIX_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   Status      = EFI_WARN_DELETE_FAILURE;\r
@@ -1043,7 +1053,7 @@ Returns:
   if (PrivateFile->IsDirectoryPath) {\r
     if (PrivateFile->Dir != NULL) {\r
       PrivateFile->UnixThunk->CloseDir (PrivateFile->Dir);\r
-      PrivateFile->Dir = NULL;
+      PrivateFile->Dir = NULL;\r
     }\r
 \r
     if (PrivateFile->UnixThunk->RmDir (PrivateFile->FileName) == 0) {\r
@@ -1051,7 +1061,7 @@ Returns:
     }\r
   } else {\r
     PrivateFile->UnixThunk->Close (PrivateFile->fd);\r
-    PrivateFile->fd = -1;
+    PrivateFile->fd = -1;\r
 \r
     if (!PrivateFile->IsOpenedByRead) {\r
       if (!PrivateFile->UnixThunk->UnLink (PrivateFile->FileName)) {\r
@@ -1063,6 +1073,8 @@ Returns:
   gBS->FreePool (PrivateFile->FileName);\r
   gBS->FreePool (PrivateFile);\r
 \r
+  gBS->RestoreTPL (OldTpl);\r
+\r
   return Status;\r
 }\r
 \r
@@ -1070,7 +1082,7 @@ STATIC
 VOID\r
 UnixSystemTimeToEfiTime (\r
   EFI_UNIX_THUNK_PROTOCOL        *UnixThunk,\r
-  IN time_t                 SystemTime,
+  IN time_t                 SystemTime,\r
   OUT EFI_TIME              *Time\r
   )\r
 /*++\r
@@ -1091,19 +1103,19 @@ Returns:
 \r
 --*/\r
 {\r
-  struct tm *tm;
-  tm = UnixThunk->GmTime (&SystemTime);
-  Time->Year   = tm->tm_year;
-  Time->Month  = tm->tm_mon;
-  Time->Day    = tm->tm_mday;
-  Time->Hour   = tm->tm_hour;
-  Time->Minute = tm->tm_min;
-  Time->Second = tm->tm_sec;
-  Time->Nanosecond  = 0;
-
-  Time->TimeZone    = UnixThunk->GetTimeZone ();
-\r
-  if (UnixThunk->GetDayLight ()) {
+  struct tm *tm;\r
+  tm = UnixThunk->GmTime (&SystemTime);\r
+  Time->Year   = tm->tm_year;\r
+  Time->Month  = tm->tm_mon;\r
+  Time->Day    = tm->tm_mday;\r
+  Time->Hour   = tm->tm_hour;\r
+  Time->Minute = tm->tm_min;\r
+  Time->Second = tm->tm_sec;\r
+  Time->Nanosecond  = 0;\r
+\r
+  Time->TimeZone    = UnixThunk->GetTimeZone ();\r
+\r
+  if (UnixThunk->GetDayLight ()) {\r
     Time->Daylight = EFI_TIME_ADJUST_DAYLIGHT;\r
   }\r
 }\r
@@ -1112,7 +1124,7 @@ STATIC
 EFI_STATUS\r
 UnixSimpleFileSystemFileInfo (\r
   UNIX_EFI_FILE_PRIVATE          *PrivateFile,\r
-  IN     CHAR8                    *FileName,
+  IN     CHAR8                    *FileName,\r
   IN OUT UINTN                    *BufferSize,\r
   OUT    VOID                     *Buffer\r
   )\r
@@ -1141,18 +1153,18 @@ Returns:
   EFI_FILE_INFO               *Info;\r
   CHAR8                      *RealFileName;\r
   CHAR8                      *TempPointer;\r
-  CHAR16                      *BufferFileName;
-  struct stat                 buf;
+  CHAR16                      *BufferFileName;\r
+  struct stat                 buf;\r
 \r
-  if (FileName != NULL) {
-    RealFileName = FileName;
-  }
+  if (FileName != NULL) {\r
+    RealFileName = FileName;\r
+  }\r
   else if (PrivateFile->IsRootDirectory) {\r
-    RealFileName = "";
+    RealFileName = "";\r
   } else {\r
     RealFileName  = PrivateFile->FileName;\r
-  }
-
+  }\r
+\r
   TempPointer   = RealFileName;\r
   while (*TempPointer) {\r
     if (*TempPointer == '/') {\r
@@ -1161,7 +1173,7 @@ Returns:
 \r
     TempPointer++;\r
   }\r
-
+\r
   Size        = SIZE_OF_EFI_FILE_INFO;\r
   NameSize    = AsciiStrSize (RealFileName) * 2;\r
   ResultSize  = Size + NameSize;\r
@@ -1169,39 +1181,39 @@ Returns:
   if (*BufferSize < ResultSize) {\r
     *BufferSize = ResultSize;\r
     return EFI_BUFFER_TOO_SMALL;\r
-  }
-  if (PrivateFile->UnixThunk->Stat (
-          FileName == NULL ? PrivateFile->FileName : FileName,
-         &buf) < 0)
-    return EFI_DEVICE_ERROR;
-
+  }\r
+  if (PrivateFile->UnixThunk->Stat (\r
+          FileName == NULL ? PrivateFile->FileName : FileName,\r
+         &buf) < 0)\r
+    return EFI_DEVICE_ERROR;\r
+\r
   Status  = EFI_SUCCESS;\r
 \r
   Info    = Buffer;\r
   ZeroMem (Info, ResultSize);\r
 \r
   Info->Size = ResultSize;\r
-  Info->FileSize      = buf.st_size;
-  Info->PhysicalSize  = MultU64x32 (buf.st_blocks, buf.st_blksize);
-\r
-  UnixSystemTimeToEfiTime (PrivateFile->UnixThunk, buf.st_ctime, &Info->CreateTime);
-  UnixSystemTimeToEfiTime (PrivateFile->UnixThunk, buf.st_atime, &Info->LastAccessTime);
-  UnixSystemTimeToEfiTime (PrivateFile->UnixThunk, buf.st_mtime, &Info->ModificationTime);
-
-  if (!(buf.st_mode & S_IWUSR)) {
+  Info->FileSize      = buf.st_size;\r
+  Info->PhysicalSize  = MultU64x32 (buf.st_blocks, buf.st_blksize);\r
+\r
+  UnixSystemTimeToEfiTime (PrivateFile->UnixThunk, buf.st_ctime, &Info->CreateTime);\r
+  UnixSystemTimeToEfiTime (PrivateFile->UnixThunk, buf.st_atime, &Info->LastAccessTime);\r
+  UnixSystemTimeToEfiTime (PrivateFile->UnixThunk, buf.st_mtime, &Info->ModificationTime);\r
+\r
+  if (!(buf.st_mode & S_IWUSR)) {\r
     Info->Attribute |= EFI_FILE_READ_ONLY;\r
   }\r
 \r
-  if (S_ISDIR(buf.st_mode)) {
+  if (S_ISDIR(buf.st_mode)) {\r
     Info->Attribute |= EFI_FILE_DIRECTORY;\r
   }\r
 \r
 \r
-  BufferFileName = (CHAR16 *)((CHAR8 *) Buffer + Size);
-  while (*RealFileName)
-    *BufferFileName++ = *RealFileName++;
-  *BufferFileName = 0;
-
+  BufferFileName = (CHAR16 *)((CHAR8 *) Buffer + Size);\r
+  while (*RealFileName)\r
+    *BufferFileName++ = *RealFileName++;\r
+  *BufferFileName = 0;\r
+\r
   *BufferSize = ResultSize;\r
   return Status;\r
 }\r
@@ -1245,83 +1257,96 @@ Returns:
 {\r
   UNIX_EFI_FILE_PRIVATE *PrivateFile;\r
   EFI_STATUS              Status;\r
-  INTN                    Res;
+  INTN                    Res;\r
   UINTN                   Size;\r
   UINTN                   NameSize;\r
   UINTN                   ResultSize;\r
-  CHAR8                   *FullFileName;
+  CHAR8                   *FullFileName;\r
+  EFI_TPL                 OldTpl;\r
 \r
   if (This == NULL || BufferSize == NULL || Buffer == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
+  \r
   PrivateFile = UNIX_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   if (!PrivateFile->IsDirectoryPath) {\r
 \r
     if (PrivateFile->fd < 0) {\r
-      return EFI_DEVICE_ERROR;\r
+      Status = EFI_DEVICE_ERROR;\r
+      goto Done;\r
     }\r
 \r
     Res = PrivateFile->UnixThunk->Read (\r
                                         PrivateFile->fd,\r
                                         Buffer,\r
-                                        *BufferSize);
-    if (Res < 0)
-      return EFI_DEVICE_ERROR;
-    *BufferSize = Res;
-    return EFI_SUCCESS;
+                                        *BufferSize);\r
+    if (Res < 0) {\r
+      Status = EFI_DEVICE_ERROR;\r
+      goto Done;\r
+    }\r
+    *BufferSize = Res;\r
+    Status = EFI_SUCCESS;\r
+    goto Done;\r
   }\r
 \r
   //\r
-  // Read on a directory.
+  // Read on a directory.\r
   //\r
   if (PrivateFile->Dir == NULL) {\r
-    return EFI_DEVICE_ERROR;\r
+    Status = EFI_DEVICE_ERROR;\r
+    goto Done;\r
   }\r
-
-  if (PrivateFile->Dirent == NULL) {
-    PrivateFile->Dirent = PrivateFile->UnixThunk->ReadDir (PrivateFile->Dir);
-    if (PrivateFile->Dirent == NULL) {
+\r
+  if (PrivateFile->Dirent == NULL) {\r
+    PrivateFile->Dirent = PrivateFile->UnixThunk->ReadDir (PrivateFile->Dir);\r
+    if (PrivateFile->Dirent == NULL) {\r
       *BufferSize = 0;\r
-      return EFI_SUCCESS;\r
-    }
-  }
-
+      Status = EFI_SUCCESS;\r
+      goto Done;\r
+    }\r
+  }\r
+\r
   Size        = SIZE_OF_EFI_FILE_INFO;\r
-  NameSize    = AsciiStrLen (PrivateFile->Dirent->d_name) + 1;
+  NameSize    = AsciiStrLen (PrivateFile->Dirent->d_name) + 1;\r
   ResultSize  = Size + 2 * NameSize;\r
 \r
   if (*BufferSize < ResultSize) {\r
     *BufferSize = ResultSize;\r
-    return EFI_BUFFER_TOO_SMALL;\r
-  }
+    Status = EFI_BUFFER_TOO_SMALL;\r
+    goto Done;\r
+  }\r
   Status  = EFI_SUCCESS;\r
 \r
   *BufferSize = ResultSize;\r
-
+\r
   Status = gBS->AllocatePool (\r
                   EfiBootServicesData,\r
-                  AsciiStrLen(PrivateFile->FileName) + 1 + NameSize,
-                  (VOID **)&FullFileName
+                  AsciiStrLen(PrivateFile->FileName) + 1 + NameSize,\r
+                  (VOID **)&FullFileName\r
                   );\r
 \r
   if (EFI_ERROR (Status)) {\r
-    return Status;
+    goto Done;\r
   }\r
-                 
-  AsciiStrCpy(FullFileName, PrivateFile->FileName);
-  AsciiStrCat(FullFileName, "/");
-  AsciiStrCat(FullFileName, PrivateFile->Dirent->d_name);
-  Status = UnixSimpleFileSystemFileInfo (PrivateFile,
-                                         FullFileName,
-                                         BufferSize,
-                                         Buffer);
-  gBS->FreePool (FullFileName);
+                 \r
+  AsciiStrCpy(FullFileName, PrivateFile->FileName);\r
+  AsciiStrCat(FullFileName, "/");\r
+  AsciiStrCat(FullFileName, PrivateFile->Dirent->d_name);\r
+  Status = UnixSimpleFileSystemFileInfo (PrivateFile,\r
+                                         FullFileName,\r
+                                         BufferSize,\r
+                                         Buffer);\r
+  gBS->FreePool (FullFileName);\r
 \r
-  PrivateFile->Dirent = NULL;
+  PrivateFile->Dirent = NULL;\r
 \r
-  return Status;
+Done:\r
+  gBS->RestoreTPL (OldTpl);\r
+\r
+  return Status;\r
 }\r
 \r
 EFI_STATUS\r
@@ -1368,12 +1393,16 @@ Returns:
 // TODO:    EFI_INVALID_PARAMETER - add return value to function comment\r
 {\r
   UNIX_EFI_FILE_PRIVATE *PrivateFile;\r
-  UINTN Res;
+  UINTN                 Res;\r
+  EFI_STATUS            Status;\r
+  EFI_TPL               OldTpl;\r
 \r
   if (This == NULL || BufferSize == NULL || Buffer == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
+\r
   PrivateFile = UNIX_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   if (PrivateFile->fd < 0) {\r
@@ -1391,11 +1420,17 @@ Returns:
   Res = PrivateFile->UnixThunk->Write (\r
                                        PrivateFile->fd,\r
                                        Buffer,\r
-                                       *BufferSize);
-  if (Res == (UINTN)-1)
-    return EFI_DEVICE_ERROR;
-  *BufferSize = Res;
-  return EFI_SUCCESS;
+                                       *BufferSize);\r
+  if (Res == (UINTN)-1) {\r
+    Status = EFI_DEVICE_ERROR;\r
+    goto Done;\r
+  }\r
+  *BufferSize = Res;\r
+  Status = EFI_SUCCESS;\r
+\r
+Done:\r
+  gBS->RestoreTPL (OldTpl);\r
+  return Status;\r
 \r
   //\r
   // bugbug: need to access unix error reporting\r
@@ -1432,33 +1467,41 @@ Returns:
   EFI_STATUS              Status;\r
   UNIX_EFI_FILE_PRIVATE *PrivateFile;\r
   UINT64                  Pos;\r
+  EFI_TPL                 OldTpl;\r
 \r
   if (This == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
+  \r
   PrivateFile = UNIX_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   if (PrivateFile->IsDirectoryPath) {\r
     if (Position != 0) {\r
-      return EFI_UNSUPPORTED;\r
+      Status = EFI_UNSUPPORTED;\r
+      goto Done;\r
     }\r
 \r
-    if (PrivateFile->Dir == NULL) {
-      return EFI_DEVICE_ERROR;
-    }
-    PrivateFile->UnixThunk->RewindDir (PrivateFile->Dir);
-    return EFI_SUCCESS;\r
+    if (PrivateFile->Dir == NULL) {\r
+      Status = EFI_DEVICE_ERROR;\r
+      goto Done;\r
+    }\r
+    PrivateFile->UnixThunk->RewindDir (PrivateFile->Dir);\r
+    Status = EFI_SUCCESS;\r
+    goto Done;\r
   } else {\r
     if (Position == (UINT64) -1) {\r
       Pos = PrivateFile->UnixThunk->Lseek (PrivateFile->fd, 0, SEEK_END);\r
     } else {\r
       Pos = PrivateFile->UnixThunk->Lseek (PrivateFile->fd, Position, SEEK_SET);\r
-    }
+    }\r
     Status = (Pos == (UINT64) -1) ? EFI_DEVICE_ERROR : EFI_SUCCESS;\r
+  }\r
 \r
+Done:\r
+    gBS->RestoreTPL (OldTpl);\r
     return Status;\r
-  }\r
 }\r
 \r
 EFI_STATUS\r
@@ -1488,20 +1531,27 @@ Returns:
 --*/\r
 // TODO:    EFI_INVALID_PARAMETER - add return value to function comment\r
 {\r
+  EFI_STATUS            Status;\r
   UNIX_EFI_FILE_PRIVATE *PrivateFile;\r
+  EFI_TPL               OldTpl;\r
 \r
   if (This == NULL || Position == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
+  \r
   PrivateFile   = UNIX_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   if (PrivateFile->IsDirectoryPath) {\r
-    return EFI_UNSUPPORTED;\r
+    Status = EFI_UNSUPPORTED;\r
   } else {\r
-    *Position = PrivateFile->UnixThunk->Lseek (PrivateFile->fd, 0, SEEK_CUR);
-    return (*Position == (UINT64) -1) ? EFI_DEVICE_ERROR : EFI_SUCCESS;\r
+    *Position = PrivateFile->UnixThunk->Lseek (PrivateFile->fd, 0, SEEK_CUR);\r
+    Status = (*Position == (UINT64) -1) ? EFI_DEVICE_ERROR : EFI_SUCCESS;\r
   }\r
+\r
+  gBS->RestoreTPL (OldTpl);\r
+  return Status;\r
 }\r
 \r
 EFI_STATUS\r
@@ -1552,12 +1602,15 @@ Returns:
   EFI_FILE_SYSTEM_INFO              *FileSystemInfoBuffer;\r
   INTN                              UnixStatus;\r
   UNIX_SIMPLE_FILE_SYSTEM_PRIVATE *PrivateRoot;\r
-  struct statfs                     buf;
+  struct statfs                     buf;\r
+  EFI_TPL                           OldTpl;\r
 \r
   if (This == NULL || InformationType == NULL || BufferSize == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
+    \r
   PrivateFile = UNIX_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
   PrivateRoot = UNIX_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (PrivateFile->SimpleFileSystem);\r
 \r
@@ -1565,17 +1618,19 @@ Returns:
 \r
   if (CompareGuid (InformationType, &gEfiFileInfoGuid)) {\r
     Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, BufferSize, Buffer);\r
-  }\r
-  else if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {\r
+  } else if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {\r
     if (*BufferSize < SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel)) {\r
       *BufferSize = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel);\r
-      return EFI_BUFFER_TOO_SMALL;\r
+      Status = EFI_BUFFER_TOO_SMALL;\r
+      goto Done;\r
+    }\r
+\r
+    UnixStatus = PrivateFile->UnixThunk->StatFs (PrivateFile->FileName, &buf);\r
+    if (UnixStatus < 0) {\r
+        Status = EFI_DEVICE_ERROR;\r
+        goto Done;\r
     }\r
 \r
-    UnixStatus = PrivateFile->UnixThunk->StatFs (PrivateFile->FileName, &buf);
-    if (UnixStatus < 0)
-        return EFI_DEVICE_ERROR;\r
-
     FileSystemInfoBuffer            = (EFI_FILE_SYSTEM_INFO *) Buffer;\r
     FileSystemInfoBuffer->Size      = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel);\r
     FileSystemInfoBuffer->ReadOnly  = FALSE;\r
@@ -1583,21 +1638,19 @@ Returns:
     //\r
     // Succeeded\r
     //\r
-    FileSystemInfoBuffer->VolumeSize  = MultU64x32 (buf.f_blocks, buf.f_bsize);
-    FileSystemInfoBuffer->FreeSpace   = MultU64x32 (buf.f_bavail, buf.f_bsize);
-    FileSystemInfoBuffer->BlockSize   = buf.f_bsize;
+    FileSystemInfoBuffer->VolumeSize  = MultU64x32 (buf.f_blocks, buf.f_bsize);\r
+    FileSystemInfoBuffer->FreeSpace   = MultU64x32 (buf.f_bavail, buf.f_bsize);\r
+    FileSystemInfoBuffer->BlockSize   = buf.f_bsize;\r
 \r
 \r
     StrCpy ((CHAR16 *) FileSystemInfoBuffer->VolumeLabel, PrivateRoot->VolumeLabel);\r
     *BufferSize = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel);\r
     Status      = EFI_SUCCESS;\r
-  }\r
-\r
-  else if (CompareGuid (InformationType,
-                       &gEfiFileSystemVolumeLabelInfoIdGuid)) {\r
+  } else if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid)) {\r
     if (*BufferSize < StrSize (PrivateRoot->VolumeLabel)) {\r
       *BufferSize = StrSize (PrivateRoot->VolumeLabel);\r
-      return EFI_BUFFER_TOO_SMALL;\r
+      Status = EFI_BUFFER_TOO_SMALL;\r
+      goto Done;\r
     }\r
 \r
     StrCpy ((CHAR16 *) Buffer, PrivateRoot->VolumeLabel);\r
@@ -1605,6 +1658,8 @@ Returns:
     Status      = EFI_SUCCESS;\r
   }\r
 \r
+Done:\r
+  gBS->RestoreTPL (OldTpl);\r
   return Status;\r
 }\r
 \r
@@ -1662,6 +1717,7 @@ Returns:
   EFI_FILE_INFO                     *NewFileInfo;\r
   EFI_STATUS                        Status;\r
   UINTN                             OldInfoSize;\r
+  EFI_TPL                           OldTpl;\r
   mode_t                            NewAttr;\r
   struct stat                       OldAttr;\r
   CHAR8                             *OldFileName;\r
@@ -1674,9 +1730,9 @@ Returns:
   struct tm                         NewLastAccessSystemTime;\r
   struct tm                         NewLastWriteSystemTime;\r
   EFI_FILE_SYSTEM_INFO              *NewFileSystemInfo;\r
-  CHAR8                             *AsciiFilePtr;
-  CHAR16                            *UnicodeFilePtr;
-  INTN                              UnixStatus;
+  CHAR8                             *AsciiFilePtr;\r
+  CHAR16                            *UnicodeFilePtr;\r
+  INTN                              UnixStatus;\r
 \r
   //\r
   // Check for invalid parameters.\r
@@ -1685,6 +1741,8 @@ Returns:
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
+  \r
   //\r
   // Initialise locals.\r
   //\r
@@ -1701,7 +1759,8 @@ Returns:
   //\r
   if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {\r
     if (BufferSize < SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel)) {\r
-      return EFI_BAD_BUFFER_SIZE;\r
+      Status = EFI_BAD_BUFFER_SIZE;\r
+      goto Done;\r
     }\r
 \r
     NewFileSystemInfo = (EFI_FILE_SYSTEM_INFO *) Buffer;\r
@@ -1721,7 +1780,8 @@ Returns:
 \r
     StrCpy (PrivateRoot->VolumeLabel, NewFileSystemInfo->VolumeLabel);\r
 \r
-    return EFI_SUCCESS;\r
+    Status = EFI_SUCCESS;\r
+    goto Done;\r
   }\r
 \r
   //\r
@@ -1729,20 +1789,24 @@ Returns:
   //\r
   if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid)) {\r
     if (BufferSize < StrSize (PrivateRoot->VolumeLabel)) {\r
-      return EFI_BAD_BUFFER_SIZE;\r
+      Status = EFI_BAD_BUFFER_SIZE;\r
+      goto Done;\r
     }\r
 \r
     StrCpy (PrivateRoot->VolumeLabel, (CHAR16 *) Buffer);\r
 \r
-    return EFI_SUCCESS;\r
+    Status = EFI_SUCCESS;\r
+    goto Done;\r
   }\r
 \r
   if (!CompareGuid (InformationType, &gEfiFileInfoGuid)) {\r
-    return EFI_UNSUPPORTED;\r
+    Status = EFI_UNSUPPORTED;\r
+    goto Done;\r
   }\r
 \r
   if (BufferSize < SIZE_OF_EFI_FILE_INFO) {\r
-    return EFI_BAD_BUFFER_SIZE;\r
+    Status = EFI_BAD_BUFFER_SIZE;\r
+    goto Done;\r
   }\r
 \r
   //\r
@@ -1758,7 +1822,8 @@ Returns:
       (NewFileInfo->Attribute &~(EFI_FILE_VALID_ATTR)) ||\r
       (sizeof (UINTN) == 4 && NewFileInfo->Size > 0xFFFFFFFF)\r
       ) {\r
-    return EFI_INVALID_PARAMETER;\r
+    Status = EFI_INVALID_PARAMETER;\r
+    goto Done;\r
   }\r
 \r
   //\r
@@ -1779,7 +1844,7 @@ Returns:
     goto Done;\r
   }\r
 \r
-  Status = gBS->AllocatePool (EfiBootServicesData, OldInfoSize,
+  Status = gBS->AllocatePool (EfiBootServicesData, OldInfoSize,\r
                              (VOID **)&OldFileInfo);\r
 \r
   if (EFI_ERROR (Status)) {\r
@@ -1819,9 +1884,9 @@ Returns:
     }\r
 \r
     AsciiStrCpy (NewFileName, PrivateRoot->FilePath);\r
-    AsciiFilePtr = NewFileName + AsciiStrLen(NewFileName);
-    UnicodeFilePtr = NewFileInfo->FileName + 1;
-    *AsciiFilePtr++ ='/';
+    AsciiFilePtr = NewFileName + AsciiStrLen(NewFileName);\r
+    UnicodeFilePtr = NewFileInfo->FileName + 1;\r
+    *AsciiFilePtr++ ='/';\r
   } else {\r
     Status = gBS->AllocatePool (\r
                     EfiBootServicesData,\r
@@ -1834,18 +1899,18 @@ Returns:
     }\r
 \r
     AsciiStrCpy (NewFileName, PrivateRoot->FilePath);\r
-    AsciiFilePtr = NewFileName + AsciiStrLen(NewFileName);
-    while (AsciiFilePtr > NewFileName && AsciiFilePtr[-1] != '/') {
-      AsciiFilePtr--;
-    }
-    UnicodeFilePtr = NewFileInfo->FileName;
+    AsciiFilePtr = NewFileName + AsciiStrLen(NewFileName);\r
+    while (AsciiFilePtr > NewFileName && AsciiFilePtr[-1] != '/') {\r
+      AsciiFilePtr--;\r
+    }\r
+    UnicodeFilePtr = NewFileInfo->FileName;\r
   }\r
-  // Convert to ascii.
-  while (*UnicodeFilePtr) {
-    *AsciiFilePtr++ = *UnicodeFilePtr++;
-  }
-  *AsciiFilePtr = 0;
-
+  // Convert to ascii.\r
+  while (*UnicodeFilePtr) {\r
+    *AsciiFilePtr++ = *UnicodeFilePtr++;\r
+  }\r
+  *AsciiFilePtr = 0;\r
+\r
 \r
   //\r
   // Is there an attribute change request?\r
@@ -1902,10 +1967,10 @@ Returns:
   //\r
   // Set file or directory information.\r
   //\r
-  if (PrivateFile->UnixThunk->Stat (OldFileName, &OldAttr) != 0) {
-    Status = EFI_DEVICE_ERROR;
-    goto Done;
-  }
+  if (PrivateFile->UnixThunk->Stat (OldFileName, &OldAttr) != 0) {\r
+    Status = EFI_DEVICE_ERROR;\r
+    goto Done;\r
+  }\r
 \r
   //\r
   // Name change.\r
@@ -1977,7 +2042,7 @@ Returns:
   // Time change\r
   //\r
   if (TimeChangeFlag) {\r
-    struct utimbuf utime;
+    struct utimbuf utime;\r
 \r
     NewLastAccessSystemTime.tm_year    = NewFileInfo->LastAccessTime.Year;\r
     NewLastAccessSystemTime.tm_mon     = NewFileInfo->LastAccessTime.Month;\r
@@ -1985,25 +2050,25 @@ Returns:
     NewLastAccessSystemTime.tm_hour    = NewFileInfo->LastAccessTime.Hour;\r
     NewLastAccessSystemTime.tm_min     = NewFileInfo->LastAccessTime.Minute;\r
     NewLastAccessSystemTime.tm_sec     = NewFileInfo->LastAccessTime.Second;\r
-    NewLastAccessSystemTime.tm_isdst   = 0;
+    NewLastAccessSystemTime.tm_isdst   = 0;\r
+\r
+    utime.actime = PrivateFile->UnixThunk->MkTime (&NewLastAccessSystemTime);\r
 \r
-    utime.actime = PrivateFile->UnixThunk->MkTime (&NewLastAccessSystemTime);
-
     NewLastWriteSystemTime.tm_year    = NewFileInfo->ModificationTime.Year;\r
     NewLastWriteSystemTime.tm_mon     = NewFileInfo->ModificationTime.Month;\r
     NewLastWriteSystemTime.tm_mday    = NewFileInfo->ModificationTime.Day;\r
     NewLastWriteSystemTime.tm_hour    = NewFileInfo->ModificationTime.Hour;\r
     NewLastWriteSystemTime.tm_min     = NewFileInfo->ModificationTime.Minute;\r
     NewLastWriteSystemTime.tm_sec     = NewFileInfo->ModificationTime.Second;\r
-    NewLastWriteSystemTime.tm_isdst   = 0;
+    NewLastWriteSystemTime.tm_isdst   = 0;\r
 \r
-    utime.modtime = PrivateFile->UnixThunk->MkTime (&NewLastWriteSystemTime);
-
-    if (utime.actime == (time_t)-1 || utime.modtime == (time_t)-1) {
+    utime.modtime = PrivateFile->UnixThunk->MkTime (&NewLastWriteSystemTime);\r
+\r
+    if (utime.actime == (time_t)-1 || utime.modtime == (time_t)-1) {\r
       goto Done;\r
     }\r
 \r
-    if (PrivateFile->UnixThunk->UTime (PrivateFile->FileName, &utime) == -1) {
+    if (PrivateFile->UnixThunk->UTime (PrivateFile->FileName, &utime) == -1) {\r
       goto Done;\r
     }\r
   }\r
@@ -2015,9 +2080,9 @@ Returns:
   NewAttr = OldAttr.st_mode;\r
 \r
   if (NewFileInfo->Attribute & EFI_FILE_READ_ONLY) {\r
-    NewAttr &= ~(S_IRUSR | S_IRGRP | S_IROTH);
+    NewAttr &= ~(S_IRUSR | S_IRGRP | S_IROTH);\r
   } else {\r
-    NewAttr |= S_IRUSR;
+    NewAttr |= S_IRUSR;\r
   }\r
 \r
   UnixStatus = PrivateFile->UnixThunk->Chmod (NewFileName, NewAttr);\r
@@ -2039,6 +2104,8 @@ Done:
     gBS->FreePool (NewFileName);\r
   }\r
 \r
+  gBS->RestoreTPL (OldTpl);\r
+  \r
   return Status;\r
 }\r
 \r
@@ -2077,30 +2144,43 @@ Returns:
 // TODO:    EFI_INVALID_PARAMETER - add return value to function comment\r
 {\r
   UNIX_EFI_FILE_PRIVATE     *PrivateFile;\r
+  EFI_STATUS                Status;\r
+  EFI_TPL                   OldTpl;\r
 \r
   if (This == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
+  \r
   PrivateFile = UNIX_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
 \r
 \r
   if (PrivateFile->IsDirectoryPath) {\r
-    return EFI_SUCCESS;\r
+    Status = EFI_SUCCESS;\r
+    goto Done;\r
   }\r
 \r
   if (PrivateFile->IsOpenedByRead) {\r
-    return EFI_ACCESS_DENIED;\r
+    Status = EFI_ACCESS_DENIED;\r
+    goto Done;\r
   }\r
 \r
-  if (PrivateFile->fd < 0) {
-    return EFI_DEVICE_ERROR;\r
+  if (PrivateFile->fd < 0) {\r
+    Status = EFI_DEVICE_ERROR;\r
+    goto Done;\r
   }\r
-
-  return PrivateFile->UnixThunk->FSync (PrivateFile->fd) == 0 ? EFI_SUCCESS : EFI_DEVICE_ERROR;\r
+\r
+  PrivateFile->UnixThunk->FSync (PrivateFile->fd) == 0 ? EFI_SUCCESS : EFI_DEVICE_ERROR;\r
+\r
+Done:\r
+  gBS->RestoreTPL (OldTpl);\r
+\r
+  return Status;\r
 \r
   //\r
   // bugbug: - Use Unix error reporting.\r
   //\r
 }\r
 \r
+\r