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