]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/VirtioFsDxe/SimpleFsGetInfo.c
OvmfPkg: Apply uncrustify changes
[mirror_edk2.git] / OvmfPkg / VirtioFsDxe / SimpleFsGetInfo.c
CommitLineData
334c13e1
LE
1/** @file\r
2 EFI_FILE_PROTOCOL.GetInfo() member function for the Virtio Filesystem driver.\r
3\r
4 Copyright (C) 2020, Red Hat, Inc.\r
5\r
6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
7**/\r
8\r
b6b240f9
LE
9#include <Guid/FileSystemInfo.h> // gEfiFileSystemInfoGuid\r
10#include <Guid/FileSystemVolumeLabelInfo.h> // gEfiFileSystemVolumeLabelInfo...\r
11#include <Library/BaseLib.h> // StrSize()\r
12#include <Library/BaseMemoryLib.h> // CompareGuid()\r
13\r
334c13e1
LE
14#include "VirtioFsDxe.h"\r
15\r
b6b240f9
LE
16/**\r
17 Provide EFI_FILE_INFO about this particular file.\r
18**/\r
19STATIC\r
20EFI_STATUS\r
21GetFileInfo (\r
ac0a286f
MK
22 IN EFI_FILE_PROTOCOL *This,\r
23 IN OUT UINTN *BufferSize,\r
24 OUT VOID *Buffer\r
b6b240f9
LE
25 )\r
26{\r
ac0a286f
MK
27 VIRTIO_FS_FILE *VirtioFsFile;\r
28 VIRTIO_FS *VirtioFs;\r
29 UINTN AllocSize;\r
30 UINTN BasenameSize;\r
31 EFI_STATUS Status;\r
32 EFI_FILE_INFO *FileInfo;\r
33 VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE FuseAttr;\r
b6b240f9
LE
34\r
35 VirtioFsFile = VIRTIO_FS_FILE_FROM_SIMPLE_FILE (This);\r
36 VirtioFs = VirtioFsFile->OwnerFs;\r
37\r
38 AllocSize = *BufferSize;\r
39\r
40 //\r
41 // Calculate the needed size.\r
42 //\r
43 BasenameSize = 0;\r
ac0a286f
MK
44 Status = VirtioFsGetBasename (\r
45 VirtioFsFile->CanonicalPathname,\r
46 NULL,\r
47 &BasenameSize\r
48 );\r
b6b240f9
LE
49 ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
50 *BufferSize = OFFSET_OF (EFI_FILE_INFO, FileName) + BasenameSize;\r
51\r
52 if (*BufferSize > AllocSize) {\r
53 return EFI_BUFFER_TOO_SMALL;\r
54 }\r
55\r
56 //\r
57 // Set the structure size, and store the basename.\r
58 //\r
ac0a286f 59 FileInfo = Buffer;\r
b6b240f9 60 FileInfo->Size = *BufferSize;\r
ac0a286f
MK
61 Status = VirtioFsGetBasename (\r
62 VirtioFsFile->CanonicalPathname,\r
63 FileInfo->FileName,\r
64 &BasenameSize\r
65 );\r
b6b240f9
LE
66 ASSERT_EFI_ERROR (Status);\r
67\r
68 //\r
69 // Fetch the file attributes, and convert them into the caller's buffer.\r
70 //\r
71 Status = VirtioFsFuseGetAttr (VirtioFs, VirtioFsFile->NodeId, &FuseAttr);\r
72 if (!EFI_ERROR (Status)) {\r
73 Status = VirtioFsFuseAttrToEfiFileInfo (&FuseAttr, FileInfo);\r
74 }\r
ac0a286f 75\r
b6b240f9
LE
76 return (Status == EFI_BUFFER_TOO_SMALL) ? EFI_DEVICE_ERROR : Status;\r
77}\r
78\r
79/**\r
80 Provide EFI_FILE_SYSTEM_INFO about the filesystem this file lives on.\r
81**/\r
82STATIC\r
83EFI_STATUS\r
84GetFileSystemInfo (\r
ac0a286f
MK
85 IN EFI_FILE_PROTOCOL *This,\r
86 IN OUT UINTN *BufferSize,\r
87 OUT VOID *Buffer\r
b6b240f9
LE
88 )\r
89{\r
ac0a286f
MK
90 VIRTIO_FS_FILE *VirtioFsFile;\r
91 VIRTIO_FS *VirtioFs;\r
92 UINTN AllocSize;\r
93 UINTN LabelSize;\r
94 EFI_STATUS Status;\r
95 VIRTIO_FS_FUSE_STATFS_RESPONSE FilesysAttr;\r
96 UINT64 MaxBlocks;\r
97 EFI_FILE_SYSTEM_INFO *FilesysInfo;\r
b6b240f9
LE
98\r
99 VirtioFsFile = VIRTIO_FS_FILE_FROM_SIMPLE_FILE (This);\r
100 VirtioFs = VirtioFsFile->OwnerFs;\r
101\r
102 AllocSize = *BufferSize;\r
103\r
104 //\r
105 // Calculate the needed size.\r
106 //\r
ac0a286f 107 LabelSize = StrSize (VirtioFs->Label);\r
b6b240f9
LE
108 *BufferSize = OFFSET_OF (EFI_FILE_SYSTEM_INFO, VolumeLabel) + LabelSize;\r
109\r
110 if (*BufferSize > AllocSize) {\r
111 return EFI_BUFFER_TOO_SMALL;\r
112 }\r
113\r
114 //\r
115 // Fetch the filesystem attributes.\r
116 //\r
117 Status = VirtioFsFuseStatFs (VirtioFs, VirtioFsFile->NodeId, &FilesysAttr);\r
118 if (EFI_ERROR (Status)) {\r
119 return (Status == EFI_BUFFER_TOO_SMALL) ? EFI_DEVICE_ERROR : Status;\r
120 }\r
ac0a286f 121\r
b6b240f9
LE
122 //\r
123 // Sanity checks...\r
124 //\r
125 if (FilesysAttr.Frsize != FilesysAttr.Bsize) {\r
126 return EFI_UNSUPPORTED;\r
127 }\r
ac0a286f
MK
128\r
129 if ((FilesysAttr.Frsize == 0) || (FilesysAttr.Blocks == 0) ||\r
130 (FilesysAttr.Bavail > FilesysAttr.Blocks))\r
131 {\r
b6b240f9
LE
132 return EFI_DEVICE_ERROR;\r
133 }\r
ac0a286f 134\r
b6b240f9 135 MaxBlocks = DivU64x32 (MAX_UINT64, FilesysAttr.Frsize);\r
ac0a286f 136 if ((FilesysAttr.Blocks > MaxBlocks) || (FilesysAttr.Bavail > MaxBlocks)) {\r
b6b240f9
LE
137 return EFI_DEVICE_ERROR;\r
138 }\r
139\r
140 //\r
141 // Fill in EFI_FILE_SYSTEM_INFO.\r
142 //\r
143 FilesysInfo = Buffer;\r
144 FilesysInfo->Size = *BufferSize;\r
145 FilesysInfo->ReadOnly = FALSE;\r
ac0a286f
MK
146 FilesysInfo->VolumeSize = MultU64x32 (\r
147 FilesysAttr.Blocks,\r
148 FilesysAttr.Frsize\r
149 );\r
150 FilesysInfo->FreeSpace = MultU64x32 (\r
151 FilesysAttr.Bavail,\r
152 FilesysAttr.Frsize\r
153 );\r
154 FilesysInfo->BlockSize = FilesysAttr.Frsize;\r
b6b240f9
LE
155 CopyMem (FilesysInfo->VolumeLabel, VirtioFs->Label, LabelSize);\r
156\r
157 return EFI_SUCCESS;\r
158}\r
159\r
160/**\r
161 Return the filesystem label as EFI_FILE_SYSTEM_VOLUME_LABEL.\r
162**/\r
163STATIC\r
164EFI_STATUS\r
165GetFileSystemVolumeLabelInfo (\r
ac0a286f
MK
166 IN EFI_FILE_PROTOCOL *This,\r
167 IN OUT UINTN *BufferSize,\r
168 OUT VOID *Buffer\r
b6b240f9
LE
169 )\r
170{\r
ac0a286f
MK
171 VIRTIO_FS_FILE *VirtioFsFile;\r
172 VIRTIO_FS *VirtioFs;\r
173 UINTN AllocSize;\r
174 UINTN LabelSize;\r
175 EFI_FILE_SYSTEM_VOLUME_LABEL *FilesysVolumeLabel;\r
b6b240f9
LE
176\r
177 VirtioFsFile = VIRTIO_FS_FILE_FROM_SIMPLE_FILE (This);\r
178 VirtioFs = VirtioFsFile->OwnerFs;\r
179\r
180 AllocSize = *BufferSize;\r
181\r
182 //\r
183 // Calculate the needed size.\r
184 //\r
ac0a286f 185 LabelSize = StrSize (VirtioFs->Label);\r
b6b240f9
LE
186 *BufferSize = (OFFSET_OF (EFI_FILE_SYSTEM_VOLUME_LABEL, VolumeLabel) +\r
187 LabelSize);\r
188\r
189 if (*BufferSize > AllocSize) {\r
190 return EFI_BUFFER_TOO_SMALL;\r
191 }\r
192\r
193 //\r
194 // Store the label.\r
195 //\r
196 FilesysVolumeLabel = Buffer;\r
197 CopyMem (FilesysVolumeLabel->VolumeLabel, VirtioFs->Label, LabelSize);\r
198\r
199 return EFI_SUCCESS;\r
200}\r
201\r
334c13e1
LE
202EFI_STATUS\r
203EFIAPI\r
204VirtioFsSimpleFileGetInfo (\r
ac0a286f
MK
205 IN EFI_FILE_PROTOCOL *This,\r
206 IN EFI_GUID *InformationType,\r
207 IN OUT UINTN *BufferSize,\r
208 OUT VOID *Buffer\r
334c13e1
LE
209 )\r
210{\r
b6b240f9
LE
211 if (CompareGuid (InformationType, &gEfiFileInfoGuid)) {\r
212 return GetFileInfo (This, BufferSize, Buffer);\r
213 }\r
214\r
215 if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {\r
216 return GetFileSystemInfo (This, BufferSize, Buffer);\r
217 }\r
218\r
219 if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid)) {\r
220 return GetFileSystemVolumeLabelInfo (This, BufferSize, Buffer);\r
221 }\r
222\r
223 return EFI_UNSUPPORTED;\r
334c13e1 224}\r