Add a lock to protect the critical region in Service APIs for gEfiBlockIoProtocolGuid...
authorqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 12 Mar 2007 09:48:53 +0000 (09:48 +0000)
committerqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 12 Mar 2007 09:48:53 +0000 (09:48 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2449 6f19259b-4bc3-4df7-8a09-765794883524

EdkUnixPkg/Dxe/UnixThunk/Bus/BlockIo/UnixBlockIo.c
EdkUnixPkg/Dxe/UnixThunk/Bus/SimpleFileSystem/UnixSimpleFileSystem.c

index 1425531..ffdf6cf 100644 (file)
@@ -1,6 +1,6 @@
 /*++\r
 \r
-Copyright (c) 2004 - 2005, Intel Corporation                                                         \r
+Copyright (c) 2004 - 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
@@ -1064,25 +1064,32 @@ UnixBlockIoReadBlocks (
   UNIX_BLOCK_IO_PRIVATE *Private;\r
   ssize_t                 len;\r
   EFI_STATUS              Status;\r
+  EFI_TPL                 OldTpl;\r
+\r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
 \r
   Private = UNIX_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   Status  = UnixBlockIoReadWriteCommon (Private, MediaId, Lba, BufferSize, Buffer, "UnixReadBlocks");\r
   if (EFI_ERROR (Status)) {\r
-    return Status;\r
+    goto Done;\r
   }\r
 \r
   len = Private->UnixThunk->Read (Private->fd, Buffer, BufferSize);\r
   if (len != BufferSize) {\r
     DEBUG ((EFI_D_INIT, "ReadBlocks: ReadFile failed.\n"));\r
-    return UnixBlockIoError (Private);\r
+    Status = UnixBlockIoError (Private);\r
+    goto Done;\r
   }\r
 \r
   //\r
   // If we wrote then media is present.\r
   //\r
   This->Media->MediaPresent = TRUE;\r
-  return EFI_SUCCESS;\r
+  Status = EFI_SUCCESS;\r
+\r
+  gBS->RestoreTPL (OldTpl);\r
+  return Status;\r
 }\r
 \r
 STATIC\r
@@ -1123,18 +1130,22 @@ UnixBlockIoWriteBlocks (
   UNIX_BLOCK_IO_PRIVATE *Private;\r
   ssize_t                 len;\r
   EFI_STATUS              Status;\r
+  EFI_TPL                 OldTpl;\r
+\r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
 \r
   Private = UNIX_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   Status  = UnixBlockIoReadWriteCommon (Private, MediaId, Lba, BufferSize, Buffer, "UnixWriteBlocks");\r
   if (EFI_ERROR (Status)) {\r
-    return Status;\r
+    goto Done;\r
   }\r
 \r
   len = Private->UnixThunk->Write (Private->fd, Buffer, BufferSize);\r
   if (len != BufferSize) {\r
     DEBUG ((EFI_D_INIT, "ReadBlocks: WriteFile failed.\n"));\r
-    return UnixBlockIoError (Private);\r
+    Status = UnixBlockIoError (Private);\r
+    goto Done;\r
   }\r
 \r
   //\r
@@ -1142,7 +1153,11 @@ UnixBlockIoWriteBlocks (
   //\r
   This->Media->MediaPresent = TRUE;\r
   This->Media->ReadOnly     = FALSE;\r
-  return EFI_SUCCESS;\r
+  Status = EFI_SUCCESS;\r
+\r
+Done:\r
+  gBS->RestoreTPL (OldTpl);\r
+  return Status;\r
 }\r
 \r
 STATIC\r
@@ -1193,7 +1208,10 @@ UnixBlockIoResetBlock (
 --*/\r
 {\r
   UNIX_BLOCK_IO_PRIVATE *Private;\r
+  EFI_TPL               OldTpl;\r
 \r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
+  \r
   Private = UNIX_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   if (Private->fd >= 0) {\r
@@ -1201,6 +1219,8 @@ UnixBlockIoResetBlock (
     Private->fd = -1;\r
   }\r
 \r
+  gBS->RestoreTPL (OldTpl);\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
index db272bd..51403eb 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
@@ -632,7 +632,6 @@ Returns:
   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
@@ -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,6 +989,8 @@ Returns:
 \r
   PrivateFile = UNIX_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
 \r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
+\r
   if (PrivateFile->fd >= 0) {\r
     PrivateFile->UnixThunk->Close (PrivateFile->fd);\r
   }\r
@@ -1002,6 +1006,9 @@ Returns:
   }\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
@@ -1250,11 +1260,14 @@ Returns:
   UINTN                   NameSize;\r
   UINTN                   ResultSize;\r
   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
@@ -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;\r
+  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);\r
-  if (Res == (UINTN)-1)\r
-    return EFI_DEVICE_ERROR;\r
+  if (Res == (UINTN)-1) {\r
+    Status = EFI_DEVICE_ERROR;\r
+    goto Done;\r
+  }\r
   *BufferSize = Res;\r
-  return EFI_SUCCESS;\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,23 +1455,29 @@ 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) {\r
-      return EFI_DEVICE_ERROR;\r
+      Status = EFI_DEVICE_ERROR;\r
+      goto Done;\r
     }\r
     PrivateFile->UnixThunk->RewindDir (PrivateFile->Dir);\r
-    return EFI_SUCCESS;\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
@@ -1456,9 +1485,11 @@ Returns:
       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);\r
-    return (*Position == (UINT64) -1) ? EFI_DEVICE_ERROR : EFI_SUCCESS;\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
@@ -1553,11 +1592,14 @@ Returns:
   INTN                              UnixStatus;\r
   UNIX_SIMPLE_FILE_SYSTEM_PRIVATE *PrivateRoot;\r
   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,16 +1607,18 @@ 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
-        return EFI_DEVICE_ERROR;\r
+    if (UnixStatus < 0) {\r
+        Status = EFI_DEVICE_ERROR;\r
+        goto Done;\r
+    }\r
 \r
     FileSystemInfoBuffer            = (EFI_FILE_SYSTEM_INFO *) Buffer;\r
     FileSystemInfoBuffer->Size      = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel);\r
@@ -1591,13 +1635,11 @@ Returns:
     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,\r
-                       &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
@@ -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
@@ -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) {\r
-    return EFI_DEVICE_ERROR;\r
+    Status = EFI_DEVICE_ERROR;\r
+    goto Done;\r
   }\r
 \r
-  return PrivateFile->UnixThunk->FSync (PrivateFile->fd) == 0 ? EFI_SUCCESS : EFI_DEVICE_ERROR;\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