]>
Commit | Line | Data |
---|---|---|
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 | |
21 | EFI_STATUS\r | |
22 | EFIAPI\r | |
23 | VirtioFsOpenVolume (\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 |
c4edb49b | 75 | VirtioFsFile->FilePosition = 0;\r |
334c13e1 LE |
76 | VirtioFsFile->NodeId = VIRTIO_FS_FUSE_ROOT_DIR_NODE_ID;\r |
77 | VirtioFsFile->FuseHandle = RootDirHandle;\r | |
78 | \r | |
79 | //\r | |
80 | // One more file open for the filesystem.\r | |
81 | //\r | |
82 | InsertTailList (&VirtioFs->OpenFiles, &VirtioFsFile->OpenFilesEntry);\r | |
83 | \r | |
84 | *Root = &VirtioFsFile->SimpleFile;\r | |
85 | return EFI_SUCCESS;\r | |
86 | \r | |
7e8c83f7 LE |
87 | FreeCanonicalPathname:\r |
88 | FreePool (CanonicalPathname);\r | |
89 | \r | |
334c13e1 LE |
90 | FreeVirtioFsFile:\r |
91 | FreePool (VirtioFsFile);\r | |
92 | \r | |
93 | return Status;\r | |
b55d6622 | 94 | }\r |