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 (VirtioFs
, VIRTIO_FS_FUSE_ROOT_DIR_NODE_ID
,
52 if (EFI_ERROR (Status
)) {
53 goto FreeCanonicalPathname
;
57 // Populate the new VIRTIO_FS_FILE object.
59 VirtioFsFile
->Signature
= VIRTIO_FS_FILE_SIG
;
60 VirtioFsFile
->SimpleFile
.Revision
= EFI_FILE_PROTOCOL_REVISION
;
61 VirtioFsFile
->SimpleFile
.Open
= VirtioFsSimpleFileOpen
;
62 VirtioFsFile
->SimpleFile
.Close
= VirtioFsSimpleFileClose
;
63 VirtioFsFile
->SimpleFile
.Delete
= VirtioFsSimpleFileDelete
;
64 VirtioFsFile
->SimpleFile
.Read
= VirtioFsSimpleFileRead
;
65 VirtioFsFile
->SimpleFile
.Write
= VirtioFsSimpleFileWrite
;
66 VirtioFsFile
->SimpleFile
.GetPosition
= VirtioFsSimpleFileGetPosition
;
67 VirtioFsFile
->SimpleFile
.SetPosition
= VirtioFsSimpleFileSetPosition
;
68 VirtioFsFile
->SimpleFile
.GetInfo
= VirtioFsSimpleFileGetInfo
;
69 VirtioFsFile
->SimpleFile
.SetInfo
= VirtioFsSimpleFileSetInfo
;
70 VirtioFsFile
->SimpleFile
.Flush
= VirtioFsSimpleFileFlush
;
71 VirtioFsFile
->IsDirectory
= TRUE
;
72 VirtioFsFile
->IsOpenForWriting
= FALSE
;
73 VirtioFsFile
->OwnerFs
= VirtioFs
;
74 VirtioFsFile
->CanonicalPathname
= CanonicalPathname
;
75 VirtioFsFile
->FilePosition
= 0;
76 VirtioFsFile
->NodeId
= VIRTIO_FS_FUSE_ROOT_DIR_NODE_ID
;
77 VirtioFsFile
->FuseHandle
= RootDirHandle
;
80 // One more file open for the filesystem.
82 InsertTailList (&VirtioFs
->OpenFiles
, &VirtioFsFile
->OpenFilesEntry
);
84 *Root
= &VirtioFsFile
->SimpleFile
;
87 FreeCanonicalPathname
:
88 FreePool (CanonicalPathname
);
91 FreePool (VirtioFsFile
);