]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkUnixPkg/Dxe/UnixThunk/Bus/SimpleFileSystem/UnixSimpleFileSystem.c
Add a lock to protect the critical region in Service APIs for gEfiBlockIoProtocolGuid...
[mirror_edk2.git] / EdkUnixPkg / Dxe / UnixThunk / Bus / SimpleFileSystem / UnixSimpleFileSystem.c
index 42a361b53dc602d98709828a6f31ff1ab33e215c..51403ebea76d6cab54879ec24b694f18c80b9ea7 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
@@ -540,20 +540,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
@@ -629,10 +629,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
@@ -641,6 +640,7 @@ Returns:
   BOOLEAN                           LoopFinish;\r
   UINTN                             InfoSize;\r
   EFI_FILE_INFO                     *Info;\r
+  EFI_TPL                           OldTpl;\r
 \r
   TrailingDash = FALSE;\r
 \r
@@ -672,9 +672,8 @@ Returns:
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  //\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
   NewPrivateFile  = NULL;\r
@@ -683,7 +682,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 +726,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 +809,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 +832,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,10 +858,10 @@ 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) {
+        if (LastError != EEXIST) {\r
           //gBS->FreePool (TempFileName);\r
           Status = EFI_ACCESS_DENIED;\r
           goto Done;\r
@@ -870,11 +869,11 @@ OpenRoot:
       }\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 +886,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
@@ -954,6 +953,8 @@ Done: ;
     *NewHandle = &NewPrivateFile->EfiFile;\r
   }\r
 \r
+  gBS->RestoreTPL (OldTpl);\r
+\r
   return Status;\r
 }\r
 \r
@@ -980,6 +981,7 @@ Returns:
 // TODO:    EFI_INVALID_PARAMETER - add return value to function comment\r
 {\r
   UNIX_EFI_FILE_PRIVATE *PrivateFile;\r
+  EFITPL                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
@@ -1070,7 +1080,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 +1101,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 +1122,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 +1151,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 +1171,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 +1179,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,16 +1255,19 @@ 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
@@ -1266,62 +1279,62 @@ Returns:
     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
+      return EFI_DEVICE_ERROR;\r
+    *BufferSize = Res;\r
+    return EFI_SUCCESS;\r
   }\r
 \r
   //\r
-  // Read on a directory.
+  // Read on a directory.\r
   //\r
   if (PrivateFile->Dir == NULL) {\r
     return EFI_DEVICE_ERROR;\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
-    }
-  }
-
+    }\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
-  }
+  }\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;
+    return Status;\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;
+  return Status;\r
 }\r
 \r
 EFI_STATUS\r
@@ -1368,7 +1381,9 @@ 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
@@ -1388,14 +1403,22 @@ Returns:
     return EFI_ACCESS_DENIED;\r
   }\r
 \r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
+  \r
   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 +1455,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 +1519,28 @@ 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
+Done:\r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
+  return Status;\r
 }\r
 \r
 EFI_STATUS\r
@@ -1552,12 +1591,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 +1607,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 +1627,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 +1647,8 @@ Returns:
     Status      = EFI_SUCCESS;\r
   }\r
 \r
+Done:\r
+  gBS->RestoreTPL (OldTpl);\r
   return Status;\r
 }\r
 \r
@@ -1662,6 +1706,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 +1719,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 +1730,8 @@ Returns:
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
+  \r
   //\r
   // Initialise locals.\r
   //\r
@@ -1701,7 +1748,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 +1769,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 +1778,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 +1811,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 +1833,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 +1873,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 +1888,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 +1956,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 +2031,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 +2039,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 +2069,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 +2093,8 @@ Done:
     gBS->FreePool (NewFileName);\r
   }\r
 \r
+  gBS->RestoreTPL (OldTpl);\r
+  \r
   return Status;\r
 }\r
 \r
@@ -2077,30 +2133,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