2 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL.OpenVolume() member function for the Virtio
5 Copyright (C) 2020, Red Hat, Inc.
7 SPDX-License-Identifier: BSD-2-Clause-Patent
10 #include <Library/BaseLib.h> // InsertTailList()
11 #include <Library/MemoryAllocationLib.h> // AllocatePool()
13 #include "VirtioFsDxe.h"
16 Open the root directory on the Virtio Filesystem.
18 Refer to EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_OPEN_VOLUME for the interface
24 IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL
*This
,
25 OUT EFI_FILE_PROTOCOL
**Root
29 VIRTIO_FS_FILE
*VirtioFsFile
;
31 CHAR8
*CanonicalPathname
;
34 VirtioFs
= VIRTIO_FS_FROM_SIMPLE_FS (This
);
36 VirtioFsFile
= AllocatePool (sizeof *VirtioFsFile
);
37 if (VirtioFsFile
== NULL
) {
38 return EFI_OUT_OF_RESOURCES
;
41 CanonicalPathname
= AllocateCopyPool (sizeof "/", "/");
42 if (CanonicalPathname
== NULL
) {
43 Status
= EFI_OUT_OF_RESOURCES
;
44 goto FreeVirtioFsFile
;
48 // Open the root directory.
50 Status
= VirtioFsFuseOpenDir (
52 VIRTIO_FS_FUSE_ROOT_DIR_NODE_ID
,
55 if (EFI_ERROR (Status
)) {
56 goto FreeCanonicalPathname
;
60 // Populate the new VIRTIO_FS_FILE object.
62 VirtioFsFile
->Signature
= VIRTIO_FS_FILE_SIG
;
63 VirtioFsFile
->SimpleFile
.Revision
= EFI_FILE_PROTOCOL_REVISION
;
64 VirtioFsFile
->SimpleFile
.Open
= VirtioFsSimpleFileOpen
;
65 VirtioFsFile
->SimpleFile
.Close
= VirtioFsSimpleFileClose
;
66 VirtioFsFile
->SimpleFile
.Delete
= VirtioFsSimpleFileDelete
;
67 VirtioFsFile
->SimpleFile
.Read
= VirtioFsSimpleFileRead
;
68 VirtioFsFile
->SimpleFile
.Write
= VirtioFsSimpleFileWrite
;
69 VirtioFsFile
->SimpleFile
.GetPosition
= VirtioFsSimpleFileGetPosition
;
70 VirtioFsFile
->SimpleFile
.SetPosition
= VirtioFsSimpleFileSetPosition
;
71 VirtioFsFile
->SimpleFile
.GetInfo
= VirtioFsSimpleFileGetInfo
;
72 VirtioFsFile
->SimpleFile
.SetInfo
= VirtioFsSimpleFileSetInfo
;
73 VirtioFsFile
->SimpleFile
.Flush
= VirtioFsSimpleFileFlush
;
74 VirtioFsFile
->IsDirectory
= TRUE
;
75 VirtioFsFile
->IsOpenForWriting
= FALSE
;
76 VirtioFsFile
->OwnerFs
= VirtioFs
;
77 VirtioFsFile
->CanonicalPathname
= CanonicalPathname
;
78 VirtioFsFile
->FilePosition
= 0;
79 VirtioFsFile
->NodeId
= VIRTIO_FS_FUSE_ROOT_DIR_NODE_ID
;
80 VirtioFsFile
->FuseHandle
= RootDirHandle
;
81 VirtioFsFile
->FileInfoArray
= NULL
;
82 VirtioFsFile
->SingleFileInfoSize
= 0;
83 VirtioFsFile
->NumFileInfo
= 0;
84 VirtioFsFile
->NextFileInfo
= 0;
87 // One more file open for the filesystem.
89 InsertTailList (&VirtioFs
->OpenFiles
, &VirtioFsFile
->OpenFilesEntry
);
91 *Root
= &VirtioFsFile
->SimpleFile
;
94 FreeCanonicalPathname
:
95 FreePool (CanonicalPathname
);
98 FreePool (VirtioFsFile
);