Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions OvmfPkg/VirtioFsDxe/SimpleFsClose.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -76,5 +78,6 @@ VirtioFsSimpleFileClose (
}

FreePool (VirtioFsFile);
VirtioFsReleaseLock (CurrentTpl);
return EFI_SUCCESS;
}
3 changes: 3 additions & 0 deletions OvmfPkg/VirtioFsDxe/SimpleFsDelete.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -112,5 +114,6 @@ VirtioFsSimpleFileDelete (
}

FreePool (VirtioFsFile);
VirtioFsReleaseLock (CurrentTpl);
return Status;
}
5 changes: 5 additions & 0 deletions OvmfPkg/VirtioFsDxe/SimpleFsFlush.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand All @@ -35,6 +38,7 @@ VirtioFsSimpleFileFlush (
VirtioFsFile->FuseHandle
);
if (EFI_ERROR (Status)) {
VirtioFsReleaseLock (CurrentTpl);
return Status;
}
}
Expand All @@ -45,5 +49,6 @@ VirtioFsSimpleFileFlush (
VirtioFsFile->FuseHandle,
VirtioFsFile->IsDirectory
);
VirtioFsReleaseLock (CurrentTpl);
return Status;
}
23 changes: 13 additions & 10 deletions OvmfPkg/VirtioFsDxe/SimpleFsGetInfo.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
4 changes: 4 additions & 0 deletions OvmfPkg/VirtioFsDxe/SimpleFsGetPosition.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
12 changes: 11 additions & 1 deletion OvmfPkg/VirtioFsDxe/SimpleFsOpen.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -350,6 +352,7 @@ VirtioFsSimpleFileOpen (
PermitCreation = TRUE;
break;
default:
VirtioFsReleaseLock (CurrentTpl);
return EFI_INVALID_PARAMETER;
}

Expand All @@ -368,6 +371,7 @@ VirtioFsSimpleFileOpen (
//
// Unknown attribute requested.
//
VirtioFsReleaseLock (CurrentTpl);
return EFI_INVALID_PARAMETER;
}

Expand Down Expand Up @@ -418,6 +422,7 @@ VirtioFsSimpleFileOpen (
FileName
));
if (!BugCompat) {
VirtioFsReleaseLock (CurrentTpl);
return EFI_INVALID_PARAMETER;
}
}
Expand All @@ -427,6 +432,7 @@ VirtioFsSimpleFileOpen (
//
NewVirtioFsFile = AllocatePool (sizeof *NewVirtioFsFile);
if (NewVirtioFsFile == NULL) {
VirtioFsReleaseLock (CurrentTpl);
return EFI_OUT_OF_RESOURCES;
}

Expand Down Expand Up @@ -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;
}

//
Expand Down Expand Up @@ -564,6 +572,7 @@ VirtioFsSimpleFileOpen (
InsertTailList (&VirtioFs->OpenFiles, &NewVirtioFsFile->OpenFilesEntry);

*NewHandle = &NewVirtioFsFile->SimpleFile;
VirtioFsReleaseLock (CurrentTpl);
return EFI_SUCCESS;

FreeNewCanonicalPath:
Expand All @@ -572,5 +581,6 @@ VirtioFsSimpleFileOpen (
FreeNewVirtioFsFile:
FreePool (NewVirtioFsFile);

VirtioFsReleaseLock (CurrentTpl);
return Status;
}
5 changes: 5 additions & 0 deletions OvmfPkg/VirtioFsDxe/SimpleFsOpenVolume.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down Expand Up @@ -89,6 +92,7 @@ VirtioFsOpenVolume (
InsertTailList (&VirtioFs->OpenFiles, &VirtioFsFile->OpenFilesEntry);

*Root = &VirtioFsFile->SimpleFile;
VirtioFsReleaseLock (CurrentTpl);
return EFI_SUCCESS;

FreeCanonicalPathname:
Expand All @@ -97,5 +101,6 @@ VirtioFsOpenVolume (
FreeVirtioFsFile:
FreePool (VirtioFsFile);

VirtioFsReleaseLock (CurrentTpl);
return Status;
}
3 changes: 3 additions & 0 deletions OvmfPkg/VirtioFsDxe/SimpleFsRead.c
Original file line number Diff line number Diff line change
Expand Up @@ -436,14 +436,17 @@ 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);
} else {
Status = ReadRegularFile (VirtioFsFile, BufferSize, Buffer);
}

VirtioFsReleaseLock (CurrentTpl);
return Status;
}
23 changes: 13 additions & 10 deletions OvmfPkg/VirtioFsDxe/SimpleFsSetInfo.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
7 changes: 7 additions & 0 deletions OvmfPkg/VirtioFsDxe/SimpleFsSetPosition.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand All @@ -42,6 +45,7 @@ VirtioFsSimpleFileSetPosition (
VirtioFsFile->SingleFileInfoSize = 0;
VirtioFsFile->NumFileInfo = 0;
VirtioFsFile->NextFileInfo = 0;
VirtioFsReleaseLock (CurrentTpl);
return EFI_SUCCESS;
}

Expand All @@ -53,6 +57,7 @@ VirtioFsSimpleFileSetPosition (
// Caller is requesting absolute file position.
//
VirtioFsFile->FilePosition = Position;
VirtioFsReleaseLock (CurrentTpl);
return EFI_SUCCESS;
}

Expand All @@ -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;
}
5 changes: 5 additions & 0 deletions OvmfPkg/VirtioFsDxe/SimpleFsWrite.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down Expand Up @@ -80,5 +84,6 @@ VirtioFsSimpleFileWrite (
// error. In other words, (Transferred > 0) is inconsequential for the return
// value.
//
VirtioFsReleaseLock (CurrentTpl);
return Status;
}
21 changes: 21 additions & 0 deletions OvmfPkg/VirtioFsDxe/VirtioFsDxe.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include <Guid/FileInfo.h> // EFI_FILE_INFO
#include <IndustryStandard/VirtioFs.h> // VIRTIO_FS_TAG_BYTES
#include <Library/DebugLib.h> // CR()
#include <Library/UefiBootServicesTableLib.h> // gBS
#include <Protocol/SimpleFileSystem.h> // EFI_SIMPLE_FILE_SYSTEM_PROTOCOL
#include <Protocol/VirtioDevice.h> // VIRTIO_DEVICE_PROTOCOL
#include <Uefi/UefiBaseType.h> // EFI_EVENT
Expand Down Expand Up @@ -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.
//
Expand Down
Loading