diff --git a/OvmfPkg/VirtioFsDxe/SimpleFsClose.c b/OvmfPkg/VirtioFsDxe/SimpleFsClose.c index 0cae2126b773..4eac31d912d9 100644 --- a/OvmfPkg/VirtioFsDxe/SimpleFsClose.c +++ b/OvmfPkg/VirtioFsDxe/SimpleFsClose.c @@ -19,9 +19,11 @@ VirtioFsSimpleFileClose ( { VIRTIO_FS_FILE *VirtioFsFile; VIRTIO_FS *VirtioFs; + EFI_TPL CurrentTpl; VirtioFsFile = VIRTIO_FS_FILE_FROM_SIMPLE_FILE (This); VirtioFs = VirtioFsFile->OwnerFs; + CurrentTpl = VirtioFsAcquireLock (); // // All actions in this function are "best effort"; the UEFI spec requires @@ -76,5 +78,6 @@ VirtioFsSimpleFileClose ( } FreePool (VirtioFsFile); + VirtioFsReleaseLock (CurrentTpl); return EFI_SUCCESS; } diff --git a/OvmfPkg/VirtioFsDxe/SimpleFsDelete.c b/OvmfPkg/VirtioFsDxe/SimpleFsDelete.c index e745c4e25210..9d25a45ef165 100644 --- a/OvmfPkg/VirtioFsDxe/SimpleFsDelete.c +++ b/OvmfPkg/VirtioFsDxe/SimpleFsDelete.c @@ -20,9 +20,11 @@ VirtioFsSimpleFileDelete ( VIRTIO_FS_FILE *VirtioFsFile; VIRTIO_FS *VirtioFs; EFI_STATUS Status; + EFI_TPL CurrentTpl; VirtioFsFile = VIRTIO_FS_FILE_FROM_SIMPLE_FILE (This); VirtioFs = VirtioFsFile->OwnerFs; + CurrentTpl = VirtioFsAcquireLock (); // // All actions in this function are "best effort"; the UEFI spec requires @@ -112,5 +114,6 @@ VirtioFsSimpleFileDelete ( } FreePool (VirtioFsFile); + VirtioFsReleaseLock (CurrentTpl); return Status; } diff --git a/OvmfPkg/VirtioFsDxe/SimpleFsFlush.c b/OvmfPkg/VirtioFsDxe/SimpleFsFlush.c index d7d04b94e5ab..6127df6253c9 100644 --- a/OvmfPkg/VirtioFsDxe/SimpleFsFlush.c +++ b/OvmfPkg/VirtioFsDxe/SimpleFsFlush.c @@ -17,11 +17,14 @@ VirtioFsSimpleFileFlush ( VIRTIO_FS_FILE *VirtioFsFile; VIRTIO_FS *VirtioFs; EFI_STATUS Status; + EFI_TPL CurrentTpl; VirtioFsFile = VIRTIO_FS_FILE_FROM_SIMPLE_FILE (This); VirtioFs = VirtioFsFile->OwnerFs; + CurrentTpl = VirtioFsAcquireLock (); if (!VirtioFsFile->IsOpenForWriting) { + VirtioFsReleaseLock (CurrentTpl); return EFI_ACCESS_DENIED; } @@ -35,6 +38,7 @@ VirtioFsSimpleFileFlush ( VirtioFsFile->FuseHandle ); if (EFI_ERROR (Status)) { + VirtioFsReleaseLock (CurrentTpl); return Status; } } @@ -45,5 +49,6 @@ VirtioFsSimpleFileFlush ( VirtioFsFile->FuseHandle, VirtioFsFile->IsDirectory ); + VirtioFsReleaseLock (CurrentTpl); return Status; } diff --git a/OvmfPkg/VirtioFsDxe/SimpleFsGetInfo.c b/OvmfPkg/VirtioFsDxe/SimpleFsGetInfo.c index d4dc642c4de7..945dadd553ef 100644 --- a/OvmfPkg/VirtioFsDxe/SimpleFsGetInfo.c +++ b/OvmfPkg/VirtioFsDxe/SimpleFsGetInfo.c @@ -208,17 +208,20 @@ VirtioFsSimpleFileGetInfo ( OUT VOID *Buffer ) { - if (CompareGuid (InformationType, &gEfiFileInfoGuid)) { - return GetFileInfo (This, BufferSize, Buffer); - } + EFI_TPL CurrentTpl; + EFI_STATUS Status; - if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) { - return GetFileSystemInfo (This, BufferSize, Buffer); - } - - if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid)) { - return GetFileSystemVolumeLabelInfo (This, BufferSize, Buffer); + CurrentTpl = VirtioFsAcquireLock (); + if (CompareGuid (InformationType, &gEfiFileInfoGuid)) { + Status = GetFileInfo (This, BufferSize, Buffer); + } else if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) { + Status = GetFileSystemInfo (This, BufferSize, Buffer); + } else if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid)) { + Status = GetFileSystemVolumeLabelInfo (This, BufferSize, Buffer); + } else { + Status = EFI_UNSUPPORTED; } - return EFI_UNSUPPORTED; + VirtioFsReleaseLock (CurrentTpl); + return Status; } diff --git a/OvmfPkg/VirtioFsDxe/SimpleFsGetPosition.c b/OvmfPkg/VirtioFsDxe/SimpleFsGetPosition.c index 6c30dcec5723..320c2c90dfd9 100644 --- a/OvmfPkg/VirtioFsDxe/SimpleFsGetPosition.c +++ b/OvmfPkg/VirtioFsDxe/SimpleFsGetPosition.c @@ -17,12 +17,16 @@ VirtioFsSimpleFileGetPosition ( ) { VIRTIO_FS_FILE *VirtioFsFile; + EFI_TPL CurrentTpl; VirtioFsFile = VIRTIO_FS_FILE_FROM_SIMPLE_FILE (This); + CurrentTpl = VirtioFsAcquireLock (); if (VirtioFsFile->IsDirectory) { + VirtioFsReleaseLock (CurrentTpl); return EFI_UNSUPPORTED; } *Position = VirtioFsFile->FilePosition; + VirtioFsReleaseLock (CurrentTpl); return EFI_SUCCESS; } diff --git a/OvmfPkg/VirtioFsDxe/SimpleFsOpen.c b/OvmfPkg/VirtioFsDxe/SimpleFsOpen.c index 2ecf3d6c2325..162522ebd1d4 100644 --- a/OvmfPkg/VirtioFsDxe/SimpleFsOpen.c +++ b/OvmfPkg/VirtioFsDxe/SimpleFsOpen.c @@ -329,9 +329,11 @@ VirtioFsSimpleFileOpen ( UINT64 NewNodeId; UINT64 NewFuseHandle; BOOLEAN NewNodeIsDirectory; + EFI_TPL CurrentTpl; VirtioFsFile = VIRTIO_FS_FILE_FROM_SIMPLE_FILE (This); VirtioFs = VirtioFsFile->OwnerFs; + CurrentTpl = VirtioFsAcquireLock (); // // Validate OpenMode. @@ -350,6 +352,7 @@ VirtioFsSimpleFileOpen ( PermitCreation = TRUE; break; default: + VirtioFsReleaseLock (CurrentTpl); return EFI_INVALID_PARAMETER; } @@ -368,6 +371,7 @@ VirtioFsSimpleFileOpen ( // // Unknown attribute requested. // + VirtioFsReleaseLock (CurrentTpl); return EFI_INVALID_PARAMETER; } @@ -418,6 +422,7 @@ VirtioFsSimpleFileOpen ( FileName )); if (!BugCompat) { + VirtioFsReleaseLock (CurrentTpl); return EFI_INVALID_PARAMETER; } } @@ -427,6 +432,7 @@ VirtioFsSimpleFileOpen ( // NewVirtioFsFile = AllocatePool (sizeof *NewVirtioFsFile); if (NewVirtioFsFile == NULL) { + VirtioFsReleaseLock (CurrentTpl); return EFI_OUT_OF_RESOURCES; } @@ -456,7 +462,9 @@ VirtioFsSimpleFileOpen ( if (AsciiStrCmp (NewCanonicalPath, "/") == 0) { FreePool (NewCanonicalPath); FreePool (NewVirtioFsFile); - return OpenRootDirectory (VirtioFs, NewHandle, OpenForWriting); + Status = OpenRootDirectory (VirtioFs, NewHandle, OpenForWriting); + VirtioFsReleaseLock (CurrentTpl); + return Status; } // @@ -564,6 +572,7 @@ VirtioFsSimpleFileOpen ( InsertTailList (&VirtioFs->OpenFiles, &NewVirtioFsFile->OpenFilesEntry); *NewHandle = &NewVirtioFsFile->SimpleFile; + VirtioFsReleaseLock (CurrentTpl); return EFI_SUCCESS; FreeNewCanonicalPath: @@ -572,5 +581,6 @@ VirtioFsSimpleFileOpen ( FreeNewVirtioFsFile: FreePool (NewVirtioFsFile); + VirtioFsReleaseLock (CurrentTpl); return Status; } diff --git a/OvmfPkg/VirtioFsDxe/SimpleFsOpenVolume.c b/OvmfPkg/VirtioFsDxe/SimpleFsOpenVolume.c index d08b8e0a1d44..be4177fe2e2c 100644 --- a/OvmfPkg/VirtioFsDxe/SimpleFsOpenVolume.c +++ b/OvmfPkg/VirtioFsDxe/SimpleFsOpenVolume.c @@ -30,11 +30,14 @@ VirtioFsOpenVolume ( EFI_STATUS Status; CHAR8 *CanonicalPathname; UINT64 RootDirHandle; + EFI_TPL CurrentTpl; VirtioFs = VIRTIO_FS_FROM_SIMPLE_FS (This); + CurrentTpl = VirtioFsAcquireLock (); VirtioFsFile = AllocatePool (sizeof *VirtioFsFile); if (VirtioFsFile == NULL) { + VirtioFsReleaseLock (CurrentTpl); return EFI_OUT_OF_RESOURCES; } @@ -89,6 +92,7 @@ VirtioFsOpenVolume ( InsertTailList (&VirtioFs->OpenFiles, &VirtioFsFile->OpenFilesEntry); *Root = &VirtioFsFile->SimpleFile; + VirtioFsReleaseLock (CurrentTpl); return EFI_SUCCESS; FreeCanonicalPathname: @@ -97,5 +101,6 @@ VirtioFsOpenVolume ( FreeVirtioFsFile: FreePool (VirtioFsFile); + VirtioFsReleaseLock (CurrentTpl); return Status; } diff --git a/OvmfPkg/VirtioFsDxe/SimpleFsRead.c b/OvmfPkg/VirtioFsDxe/SimpleFsRead.c index 9940bd99fef4..da25e6f1b557 100644 --- a/OvmfPkg/VirtioFsDxe/SimpleFsRead.c +++ b/OvmfPkg/VirtioFsDxe/SimpleFsRead.c @@ -436,8 +436,10 @@ VirtioFsSimpleFileRead ( { VIRTIO_FS_FILE *VirtioFsFile; EFI_STATUS Status; + EFI_TPL CurrentTpl; VirtioFsFile = VIRTIO_FS_FILE_FROM_SIMPLE_FILE (This); + CurrentTpl = VirtioFsAcquireLock (); if (VirtioFsFile->IsDirectory) { Status = ReadFileInfoCache (VirtioFsFile, BufferSize, Buffer); @@ -445,5 +447,6 @@ VirtioFsSimpleFileRead ( Status = ReadRegularFile (VirtioFsFile, BufferSize, Buffer); } + VirtioFsReleaseLock (CurrentTpl); return Status; } diff --git a/OvmfPkg/VirtioFsDxe/SimpleFsSetInfo.c b/OvmfPkg/VirtioFsDxe/SimpleFsSetInfo.c index b5f1a58341b0..da7cd0fd7c70 100644 --- a/OvmfPkg/VirtioFsDxe/SimpleFsSetInfo.c +++ b/OvmfPkg/VirtioFsDxe/SimpleFsSetInfo.c @@ -625,17 +625,20 @@ VirtioFsSimpleFileSetInfo ( IN VOID *Buffer ) { - if (CompareGuid (InformationType, &gEfiFileInfoGuid)) { - return SetFileInfo (This, BufferSize, Buffer); - } - - if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) { - return SetFileSystemInfo (This, BufferSize, Buffer); - } + EFI_TPL CurrentTpl; + EFI_STATUS Status; - if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid)) { - return SetFileSystemVolumeLabelInfo (This, BufferSize, Buffer); + CurrentTpl = VirtioFsAcquireLock (); + if (CompareGuid (InformationType, &gEfiFileInfoGuid)) { + Status = SetFileInfo (This, BufferSize, Buffer); + } else if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) { + Status = SetFileSystemInfo (This, BufferSize, Buffer); + } else if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid)) { + Status = SetFileSystemVolumeLabelInfo (This, BufferSize, Buffer); + } else { + Status = EFI_UNSUPPORTED; } - return EFI_UNSUPPORTED; + VirtioFsReleaseLock (CurrentTpl); + return Status; } diff --git a/OvmfPkg/VirtioFsDxe/SimpleFsSetPosition.c b/OvmfPkg/VirtioFsDxe/SimpleFsSetPosition.c index dd05081396d6..a0f356b01936 100644 --- a/OvmfPkg/VirtioFsDxe/SimpleFsSetPosition.c +++ b/OvmfPkg/VirtioFsDxe/SimpleFsSetPosition.c @@ -22,14 +22,17 @@ VirtioFsSimpleFileSetPosition ( VIRTIO_FS *VirtioFs; EFI_STATUS Status; VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE FuseAttr; + EFI_TPL CurrentTpl; VirtioFsFile = VIRTIO_FS_FILE_FROM_SIMPLE_FILE (This); + CurrentTpl = VirtioFsAcquireLock (); // // Directories can only be rewound, per spec. // if (VirtioFsFile->IsDirectory) { if (Position != 0) { + VirtioFsReleaseLock (CurrentTpl); return EFI_UNSUPPORTED; } @@ -42,6 +45,7 @@ VirtioFsSimpleFileSetPosition ( VirtioFsFile->SingleFileInfoSize = 0; VirtioFsFile->NumFileInfo = 0; VirtioFsFile->NextFileInfo = 0; + VirtioFsReleaseLock (CurrentTpl); return EFI_SUCCESS; } @@ -53,6 +57,7 @@ VirtioFsSimpleFileSetPosition ( // Caller is requesting absolute file position. // VirtioFsFile->FilePosition = Position; + VirtioFsReleaseLock (CurrentTpl); return EFI_SUCCESS; } @@ -62,9 +67,11 @@ VirtioFsSimpleFileSetPosition ( VirtioFs = VirtioFsFile->OwnerFs; Status = VirtioFsFuseGetAttr (VirtioFs, VirtioFsFile->NodeId, &FuseAttr); if (EFI_ERROR (Status)) { + VirtioFsReleaseLock (CurrentTpl); return Status; } VirtioFsFile->FilePosition = FuseAttr.Size; + VirtioFsReleaseLock (CurrentTpl); return EFI_SUCCESS; } diff --git a/OvmfPkg/VirtioFsDxe/SimpleFsWrite.c b/OvmfPkg/VirtioFsDxe/SimpleFsWrite.c index 7f4ff8c5bbf3..f4e093d7e48d 100644 --- a/OvmfPkg/VirtioFsDxe/SimpleFsWrite.c +++ b/OvmfPkg/VirtioFsDxe/SimpleFsWrite.c @@ -21,15 +21,19 @@ VirtioFsSimpleFileWrite ( EFI_STATUS Status; UINTN Transferred; UINTN Left; + EFI_TPL CurrentTpl; VirtioFsFile = VIRTIO_FS_FILE_FROM_SIMPLE_FILE (This); VirtioFs = VirtioFsFile->OwnerFs; + CurrentTpl = VirtioFsAcquireLock (); if (VirtioFsFile->IsDirectory) { + VirtioFsReleaseLock (CurrentTpl); return EFI_UNSUPPORTED; } if (!VirtioFsFile->IsOpenForWriting) { + VirtioFsReleaseLock (CurrentTpl); return EFI_ACCESS_DENIED; } @@ -80,5 +84,6 @@ VirtioFsSimpleFileWrite ( // error. In other words, (Transferred > 0) is inconsequential for the return // value. // + VirtioFsReleaseLock (CurrentTpl); return Status; } diff --git a/OvmfPkg/VirtioFsDxe/VirtioFsDxe.h b/OvmfPkg/VirtioFsDxe/VirtioFsDxe.h index 0bbf5b789508..edd2d7a8a234 100644 --- a/OvmfPkg/VirtioFsDxe/VirtioFsDxe.h +++ b/OvmfPkg/VirtioFsDxe/VirtioFsDxe.h @@ -14,6 +14,7 @@ #include // EFI_FILE_INFO #include // VIRTIO_FS_TAG_BYTES #include // CR() +#include // gBS #include // EFI_SIMPLE_FILE_SYSTEM_PROTOCOL #include // VIRTIO_DEVICE_PROTOCOL #include // EFI_EVENT @@ -183,6 +184,26 @@ typedef struct { CR (OpenFilesEntryReference, VIRTIO_FS_FILE, OpenFilesEntry, \ VIRTIO_FS_FILE_SIG); +STATIC +inline +EFI_TPL +VirtioFsAcquireLock ( + VOID + ) +{ + return gBS->RaiseTPL (TPL_NOTIFY); +} + +STATIC +inline +VOID +VirtioFsReleaseLock ( + IN EFI_TPL PreviousTpl + ) +{ + gBS->RestoreTPL (PreviousTpl); +} + // // Initialization and helper routines for the Virtio Filesystem device. //