2 EFI_FILE_PROTOCOL.GetInfo() member function for the Virtio Filesystem driver.
4 Copyright (C) 2020, Red Hat, Inc.
6 SPDX-License-Identifier: BSD-2-Clause-Patent
9 #include <Guid/FileSystemInfo.h> // gEfiFileSystemInfoGuid
10 #include <Guid/FileSystemVolumeLabelInfo.h> // gEfiFileSystemVolumeLabelInfo...
11 #include <Library/BaseLib.h> // StrSize()
12 #include <Library/BaseMemoryLib.h> // CompareGuid()
14 #include "VirtioFsDxe.h"
17 Provide EFI_FILE_INFO about this particular file.
22 IN EFI_FILE_PROTOCOL
*This
,
23 IN OUT UINTN
*BufferSize
,
27 VIRTIO_FS_FILE
*VirtioFsFile
;
32 EFI_FILE_INFO
*FileInfo
;
33 VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE FuseAttr
;
35 VirtioFsFile
= VIRTIO_FS_FILE_FROM_SIMPLE_FILE (This
);
36 VirtioFs
= VirtioFsFile
->OwnerFs
;
38 AllocSize
= *BufferSize
;
41 // Calculate the needed size.
44 Status
= VirtioFsGetBasename (VirtioFsFile
->CanonicalPathname
, NULL
,
46 ASSERT (Status
== EFI_BUFFER_TOO_SMALL
);
47 *BufferSize
= OFFSET_OF (EFI_FILE_INFO
, FileName
) + BasenameSize
;
49 if (*BufferSize
> AllocSize
) {
50 return EFI_BUFFER_TOO_SMALL
;
54 // Set the structure size, and store the basename.
57 FileInfo
->Size
= *BufferSize
;
58 Status
= VirtioFsGetBasename (VirtioFsFile
->CanonicalPathname
,
59 FileInfo
->FileName
, &BasenameSize
);
60 ASSERT_EFI_ERROR (Status
);
63 // Fetch the file attributes, and convert them into the caller's buffer.
65 Status
= VirtioFsFuseGetAttr (VirtioFs
, VirtioFsFile
->NodeId
, &FuseAttr
);
66 if (!EFI_ERROR (Status
)) {
67 Status
= VirtioFsFuseAttrToEfiFileInfo (&FuseAttr
, FileInfo
);
69 return (Status
== EFI_BUFFER_TOO_SMALL
) ? EFI_DEVICE_ERROR
: Status
;
73 Provide EFI_FILE_SYSTEM_INFO about the filesystem this file lives on.
78 IN EFI_FILE_PROTOCOL
*This
,
79 IN OUT UINTN
*BufferSize
,
83 VIRTIO_FS_FILE
*VirtioFsFile
;
88 VIRTIO_FS_FUSE_STATFS_RESPONSE FilesysAttr
;
90 EFI_FILE_SYSTEM_INFO
*FilesysInfo
;
92 VirtioFsFile
= VIRTIO_FS_FILE_FROM_SIMPLE_FILE (This
);
93 VirtioFs
= VirtioFsFile
->OwnerFs
;
95 AllocSize
= *BufferSize
;
98 // Calculate the needed size.
100 LabelSize
= StrSize (VirtioFs
->Label
);
101 *BufferSize
= OFFSET_OF (EFI_FILE_SYSTEM_INFO
, VolumeLabel
) + LabelSize
;
103 if (*BufferSize
> AllocSize
) {
104 return EFI_BUFFER_TOO_SMALL
;
108 // Fetch the filesystem attributes.
110 Status
= VirtioFsFuseStatFs (VirtioFs
, VirtioFsFile
->NodeId
, &FilesysAttr
);
111 if (EFI_ERROR (Status
)) {
112 return (Status
== EFI_BUFFER_TOO_SMALL
) ? EFI_DEVICE_ERROR
: Status
;
117 if (FilesysAttr
.Frsize
!= FilesysAttr
.Bsize
) {
118 return EFI_UNSUPPORTED
;
120 if (FilesysAttr
.Frsize
== 0 || FilesysAttr
.Blocks
== 0 ||
121 FilesysAttr
.Bavail
> FilesysAttr
.Blocks
) {
122 return EFI_DEVICE_ERROR
;
124 MaxBlocks
= DivU64x32 (MAX_UINT64
, FilesysAttr
.Frsize
);
125 if (FilesysAttr
.Blocks
> MaxBlocks
|| FilesysAttr
.Bavail
> MaxBlocks
) {
126 return EFI_DEVICE_ERROR
;
130 // Fill in EFI_FILE_SYSTEM_INFO.
132 FilesysInfo
= Buffer
;
133 FilesysInfo
->Size
= *BufferSize
;
134 FilesysInfo
->ReadOnly
= FALSE
;
135 FilesysInfo
->VolumeSize
= MultU64x32 (FilesysAttr
.Blocks
,
137 FilesysInfo
->FreeSpace
= MultU64x32 (FilesysAttr
.Bavail
,
139 FilesysInfo
->BlockSize
= FilesysAttr
.Frsize
;
140 CopyMem (FilesysInfo
->VolumeLabel
, VirtioFs
->Label
, LabelSize
);
146 Return the filesystem label as EFI_FILE_SYSTEM_VOLUME_LABEL.
150 GetFileSystemVolumeLabelInfo (
151 IN EFI_FILE_PROTOCOL
*This
,
152 IN OUT UINTN
*BufferSize
,
156 VIRTIO_FS_FILE
*VirtioFsFile
;
160 EFI_FILE_SYSTEM_VOLUME_LABEL
*FilesysVolumeLabel
;
162 VirtioFsFile
= VIRTIO_FS_FILE_FROM_SIMPLE_FILE (This
);
163 VirtioFs
= VirtioFsFile
->OwnerFs
;
165 AllocSize
= *BufferSize
;
168 // Calculate the needed size.
170 LabelSize
= StrSize (VirtioFs
->Label
);
171 *BufferSize
= (OFFSET_OF (EFI_FILE_SYSTEM_VOLUME_LABEL
, VolumeLabel
) +
174 if (*BufferSize
> AllocSize
) {
175 return EFI_BUFFER_TOO_SMALL
;
181 FilesysVolumeLabel
= Buffer
;
182 CopyMem (FilesysVolumeLabel
->VolumeLabel
, VirtioFs
->Label
, LabelSize
);
189 VirtioFsSimpleFileGetInfo (
190 IN EFI_FILE_PROTOCOL
*This
,
191 IN EFI_GUID
*InformationType
,
192 IN OUT UINTN
*BufferSize
,
196 if (CompareGuid (InformationType
, &gEfiFileInfoGuid
)) {
197 return GetFileInfo (This
, BufferSize
, Buffer
);
200 if (CompareGuid (InformationType
, &gEfiFileSystemInfoGuid
)) {
201 return GetFileSystemInfo (This
, BufferSize
, Buffer
);
204 if (CompareGuid (InformationType
, &gEfiFileSystemVolumeLabelInfoIdGuid
)) {
205 return GetFileSystemVolumeLabelInfo (This
, BufferSize
, Buffer
);
208 return EFI_UNSUPPORTED
;