]> git.proxmox.com Git - mirror_edk2.git/blob - OvmfPkg/VirtioFsDxe/SimpleFsOpenVolume.c
OvmfPkg/VirtioFsDxe: flush, sync, release and forget in Close() / Delete()
[mirror_edk2.git] / OvmfPkg / VirtioFsDxe / SimpleFsOpenVolume.c
1 /** @file
2 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL.OpenVolume() member function for the Virtio
3 Filesystem driver.
4
5 Copyright (C) 2020, Red Hat, Inc.
6
7 SPDX-License-Identifier: BSD-2-Clause-Patent
8 **/
9
10 #include <Library/BaseLib.h> // InsertTailList()
11 #include <Library/MemoryAllocationLib.h> // AllocatePool()
12
13 #include "VirtioFsDxe.h"
14
15 /**
16 Open the root directory on the Virtio Filesystem.
17
18 Refer to EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_OPEN_VOLUME for the interface
19 contract.
20 **/
21 EFI_STATUS
22 EFIAPI
23 VirtioFsOpenVolume (
24 IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,
25 OUT EFI_FILE_PROTOCOL **Root
26 )
27 {
28 VIRTIO_FS *VirtioFs;
29 VIRTIO_FS_FILE *VirtioFsFile;
30 EFI_STATUS Status;
31 UINT64 RootDirHandle;
32
33 VirtioFs = VIRTIO_FS_FROM_SIMPLE_FS (This);
34
35 VirtioFsFile = AllocatePool (sizeof *VirtioFsFile);
36 if (VirtioFsFile == NULL) {
37 return EFI_OUT_OF_RESOURCES;
38 }
39
40 //
41 // Open the root directory.
42 //
43 Status = VirtioFsFuseOpenDir (VirtioFs, VIRTIO_FS_FUSE_ROOT_DIR_NODE_ID,
44 &RootDirHandle);
45 if (EFI_ERROR (Status)) {
46 goto FreeVirtioFsFile;
47 }
48
49 //
50 // Populate the new VIRTIO_FS_FILE object.
51 //
52 VirtioFsFile->Signature = VIRTIO_FS_FILE_SIG;
53 VirtioFsFile->SimpleFile.Revision = EFI_FILE_PROTOCOL_REVISION;
54 VirtioFsFile->SimpleFile.Open = VirtioFsSimpleFileOpen;
55 VirtioFsFile->SimpleFile.Close = VirtioFsSimpleFileClose;
56 VirtioFsFile->SimpleFile.Delete = VirtioFsSimpleFileDelete;
57 VirtioFsFile->SimpleFile.Read = VirtioFsSimpleFileRead;
58 VirtioFsFile->SimpleFile.Write = VirtioFsSimpleFileWrite;
59 VirtioFsFile->SimpleFile.GetPosition = VirtioFsSimpleFileGetPosition;
60 VirtioFsFile->SimpleFile.SetPosition = VirtioFsSimpleFileSetPosition;
61 VirtioFsFile->SimpleFile.GetInfo = VirtioFsSimpleFileGetInfo;
62 VirtioFsFile->SimpleFile.SetInfo = VirtioFsSimpleFileSetInfo;
63 VirtioFsFile->SimpleFile.Flush = VirtioFsSimpleFileFlush;
64 VirtioFsFile->IsDirectory = TRUE;
65 VirtioFsFile->IsOpenForWriting = FALSE;
66 VirtioFsFile->OwnerFs = VirtioFs;
67 VirtioFsFile->NodeId = VIRTIO_FS_FUSE_ROOT_DIR_NODE_ID;
68 VirtioFsFile->FuseHandle = RootDirHandle;
69
70 //
71 // One more file open for the filesystem.
72 //
73 InsertTailList (&VirtioFs->OpenFiles, &VirtioFsFile->OpenFilesEntry);
74
75 *Root = &VirtioFsFile->SimpleFile;
76 return EFI_SUCCESS;
77
78 FreeVirtioFsFile:
79 FreePool (VirtioFsFile);
80
81 return Status;
82 }