STATIC\r
EFI_STATUS\r
OpenRootDirectory (\r
- IN OUT VIRTIO_FS *VirtioFs,\r
- OUT EFI_FILE_PROTOCOL **NewHandle,\r
- IN BOOLEAN OpenForWriting\r
+ IN OUT VIRTIO_FS *VirtioFs,\r
+ OUT EFI_FILE_PROTOCOL **NewHandle,\r
+ IN BOOLEAN OpenForWriting\r
)\r
{\r
- EFI_STATUS Status;\r
- VIRTIO_FS_FILE *NewVirtioFsFile;\r
+ EFI_STATUS Status;\r
+ VIRTIO_FS_FILE *NewVirtioFsFile;\r
\r
//\r
// VirtioFsOpenVolume() opens the root directory for read-only access. If the\r
// permission first.\r
//\r
if (OpenForWriting) {\r
- VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE FuseAttr;\r
- EFI_FILE_INFO FileInfo;\r
-\r
- Status = VirtioFsFuseGetAttr (VirtioFs, VIRTIO_FS_FUSE_ROOT_DIR_NODE_ID,\r
- &FuseAttr);\r
+ VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE FuseAttr;\r
+ EFI_FILE_INFO FileInfo;\r
+\r
+ Status = VirtioFsFuseGetAttr (\r
+ VirtioFs,\r
+ VIRTIO_FS_FUSE_ROOT_DIR_NODE_ID,\r
+ &FuseAttr\r
+ );\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
+\r
Status = VirtioFsFuseAttrToEfiFileInfo (&FuseAttr, &FileInfo);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
+\r
if ((FileInfo.Attribute & EFI_FILE_READ_ONLY) != 0) {\r
return EFI_ACCESS_DENIED;\r
}\r
return Status;\r
}\r
\r
- NewVirtioFsFile = VIRTIO_FS_FILE_FROM_SIMPLE_FILE (*NewHandle);\r
+ NewVirtioFsFile = VIRTIO_FS_FILE_FROM_SIMPLE_FILE (*NewHandle);\r
NewVirtioFsFile->IsOpenForWriting = OpenForWriting;\r
return EFI_SUCCESS;\r
}\r
STATIC\r
EFI_STATUS\r
OpenExistentFileOrDirectory (\r
- IN OUT VIRTIO_FS *VirtioFs,\r
- IN UINT64 DirNodeId,\r
- IN CHAR8 *Name,\r
- IN BOOLEAN OpenForWriting,\r
- OUT UINT64 *NodeId,\r
- OUT UINT64 *FuseHandle,\r
- OUT BOOLEAN *NodeIsDirectory\r
+ IN OUT VIRTIO_FS *VirtioFs,\r
+ IN UINT64 DirNodeId,\r
+ IN CHAR8 *Name,\r
+ IN BOOLEAN OpenForWriting,\r
+ OUT UINT64 *NodeId,\r
+ OUT UINT64 *FuseHandle,\r
+ OUT BOOLEAN *NodeIsDirectory\r
)\r
{\r
- EFI_STATUS Status;\r
- UINT64 ResolvedNodeId;\r
- VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE FuseAttr;\r
- EFI_FILE_INFO FileInfo;\r
- BOOLEAN IsDirectory;\r
- UINT64 NewFuseHandle;\r
-\r
- Status = VirtioFsFuseLookup (VirtioFs, DirNodeId, Name, &ResolvedNodeId,\r
- &FuseAttr);\r
+ EFI_STATUS Status;\r
+ UINT64 ResolvedNodeId;\r
+ VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE FuseAttr;\r
+ EFI_FILE_INFO FileInfo;\r
+ BOOLEAN IsDirectory;\r
+ UINT64 NewFuseHandle;\r
+\r
+ Status = VirtioFsFuseLookup (\r
+ VirtioFs,\r
+ DirNodeId,\r
+ Name,\r
+ &ResolvedNodeId,\r
+ &FuseAttr\r
+ );\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
+\r
Status = VirtioFsFuseAttrToEfiFileInfo (&FuseAttr, &FileInfo);\r
if (EFI_ERROR (Status)) {\r
goto ForgetResolvedNodeId;\r
}\r
\r
- if (OpenForWriting && (FileInfo.Attribute & EFI_FILE_READ_ONLY) != 0) {\r
+ if (OpenForWriting && ((FileInfo.Attribute & EFI_FILE_READ_ONLY) != 0)) {\r
Status = EFI_ACCESS_DENIED;\r
goto ForgetResolvedNodeId;\r
}\r
//\r
Status = VirtioFsFuseOpenDir (VirtioFs, ResolvedNodeId, &NewFuseHandle);\r
} else {\r
- Status = VirtioFsFuseOpen (VirtioFs, ResolvedNodeId, OpenForWriting,\r
- &NewFuseHandle);\r
+ Status = VirtioFsFuseOpen (\r
+ VirtioFs,\r
+ ResolvedNodeId,\r
+ OpenForWriting,\r
+ &NewFuseHandle\r
+ );\r
}\r
+\r
if (EFI_ERROR (Status)) {\r
goto ForgetResolvedNodeId;\r
}\r
STATIC\r
EFI_STATUS\r
CreateDirectory (\r
- IN OUT VIRTIO_FS *VirtioFs,\r
- IN UINT64 DirNodeId,\r
- IN CHAR8 *Name,\r
- OUT UINT64 *NodeId,\r
- OUT UINT64 *FuseHandle\r
+ IN OUT VIRTIO_FS *VirtioFs,\r
+ IN UINT64 DirNodeId,\r
+ IN CHAR8 *Name,\r
+ OUT UINT64 *NodeId,\r
+ OUT UINT64 *FuseHandle\r
)\r
{\r
- EFI_STATUS Status;\r
- UINT64 NewChildDirNodeId;\r
- UINT64 NewFuseHandle;\r
+ EFI_STATUS Status;\r
+ UINT64 NewChildDirNodeId;\r
+ UINT64 NewFuseHandle;\r
\r
Status = VirtioFsFuseMkDir (VirtioFs, DirNodeId, Name, &NewChildDirNodeId);\r
if (EFI_ERROR (Status)) {\r
STATIC\r
EFI_STATUS\r
CreateRegularFile (\r
- IN OUT VIRTIO_FS *VirtioFs,\r
- IN UINT64 DirNodeId,\r
- IN CHAR8 *Name,\r
- OUT UINT64 *NodeId,\r
- OUT UINT64 *FuseHandle\r
+ IN OUT VIRTIO_FS *VirtioFs,\r
+ IN UINT64 DirNodeId,\r
+ IN CHAR8 *Name,\r
+ OUT UINT64 *NodeId,\r
+ OUT UINT64 *FuseHandle\r
)\r
{\r
- return VirtioFsFuseOpenOrCreate (VirtioFs, DirNodeId, Name, NodeId,\r
- FuseHandle);\r
+ return VirtioFsFuseOpenOrCreate (\r
+ VirtioFs,\r
+ DirNodeId,\r
+ Name,\r
+ NodeId,\r
+ FuseHandle\r
+ );\r
}\r
\r
EFI_STATUS\r
EFIAPI\r
VirtioFsSimpleFileOpen (\r
- IN EFI_FILE_PROTOCOL *This,\r
- OUT EFI_FILE_PROTOCOL **NewHandle,\r
- IN CHAR16 *FileName,\r
- IN UINT64 OpenMode,\r
- IN UINT64 Attributes\r
+ IN EFI_FILE_PROTOCOL *This,\r
+ OUT EFI_FILE_PROTOCOL **NewHandle,\r
+ IN CHAR16 *FileName,\r
+ IN UINT64 OpenMode,\r
+ IN UINT64 Attributes\r
)\r
{\r
- VIRTIO_FS_FILE *VirtioFsFile;\r
- VIRTIO_FS *VirtioFs;\r
- BOOLEAN OpenForWriting;\r
- BOOLEAN PermitCreation;\r
- BOOLEAN CreateDirectoryIfCreating;\r
- VIRTIO_FS_FILE *NewVirtioFsFile;\r
- EFI_STATUS Status;\r
- CHAR8 *NewCanonicalPath;\r
- BOOLEAN RootEscape;\r
- UINT64 DirNodeId;\r
- CHAR8 *LastComponent;\r
- UINT64 NewNodeId;\r
- UINT64 NewFuseHandle;\r
- BOOLEAN NewNodeIsDirectory;\r
+ VIRTIO_FS_FILE *VirtioFsFile;\r
+ VIRTIO_FS *VirtioFs;\r
+ BOOLEAN OpenForWriting;\r
+ BOOLEAN PermitCreation;\r
+ BOOLEAN CreateDirectoryIfCreating;\r
+ VIRTIO_FS_FILE *NewVirtioFsFile;\r
+ EFI_STATUS Status;\r
+ CHAR8 *NewCanonicalPath;\r
+ BOOLEAN RootEscape;\r
+ UINT64 DirNodeId;\r
+ CHAR8 *LastComponent;\r
+ UINT64 NewNodeId;\r
+ UINT64 NewFuseHandle;\r
+ BOOLEAN NewNodeIsDirectory;\r
\r
VirtioFsFile = VIRTIO_FS_FILE_FROM_SIMPLE_FILE (This);\r
VirtioFs = VirtioFsFile->OwnerFs;\r
// Validate OpenMode.\r
//\r
switch (OpenMode) {\r
- case EFI_FILE_MODE_READ:\r
- OpenForWriting = FALSE;\r
- PermitCreation = FALSE;\r
- break;\r
- case EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE:\r
- OpenForWriting = TRUE;\r
- PermitCreation = FALSE;\r
- break;\r
- case EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE:\r
- OpenForWriting = TRUE;\r
- PermitCreation = TRUE;\r
- break;\r
- default:\r
- return EFI_INVALID_PARAMETER;\r
+ case EFI_FILE_MODE_READ:\r
+ OpenForWriting = FALSE;\r
+ PermitCreation = FALSE;\r
+ break;\r
+ case EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE:\r
+ OpenForWriting = TRUE;\r
+ PermitCreation = FALSE;\r
+ break;\r
+ case EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE:\r
+ OpenForWriting = TRUE;\r
+ PermitCreation = TRUE;\r
+ break;\r
+ default:\r
+ return EFI_INVALID_PARAMETER;\r
}\r
\r
+ //\r
+ // Set CreateDirectoryIfCreating to suppress incorrect compiler/analyzer\r
+ // warnings.\r
+ //\r
+ CreateDirectoryIfCreating = FALSE;\r
+\r
//\r
// Validate the Attributes requested for the case when the file ends up being\r
// created, provided creation is permitted.\r
));\r
return EFI_INVALID_PARAMETER;\r
}\r
+\r
CreateDirectoryIfCreating = (BOOLEAN)((Attributes &\r
EFI_FILE_DIRECTORY) != 0);\r
}\r
// Create the canonical pathname at which the desired file is expected to\r
// exist.\r
//\r
- Status = VirtioFsAppendPath (VirtioFsFile->CanonicalPathname, FileName,\r
- &NewCanonicalPath, &RootEscape);\r
+ Status = VirtioFsAppendPath (\r
+ VirtioFsFile->CanonicalPathname,\r
+ FileName,\r
+ &NewCanonicalPath,\r
+ &RootEscape\r
+ );\r
if (EFI_ERROR (Status)) {\r
goto FreeNewVirtioFsFile;\r
}\r
+\r
if (RootEscape) {\r
Status = EFI_ACCESS_DENIED;\r
goto FreeNewCanonicalPath;\r
// (given by DirNodeId) and last pathname component (i.e., immediate child\r
// within that parent directory).\r
//\r
- Status = VirtioFsLookupMostSpecificParentDir (VirtioFs, NewCanonicalPath,\r
- &DirNodeId, &LastComponent);\r
+ Status = VirtioFsLookupMostSpecificParentDir (\r
+ VirtioFs,\r
+ NewCanonicalPath,\r
+ &DirNodeId,\r
+ &LastComponent\r
+ );\r
if (EFI_ERROR (Status)) {\r
goto FreeNewCanonicalPath;\r
}\r
\r
+ //\r
+ // Set NewNodeIsDirectory to suppress incorrect compiler/analyzer warnings.\r
+ //\r
+ NewNodeIsDirectory = FALSE;\r
+\r
//\r
// Try to open LastComponent directly under DirNodeId, as an existent regular\r
// file or directory.\r
//\r
- Status = OpenExistentFileOrDirectory (VirtioFs, DirNodeId, LastComponent,\r
- OpenForWriting, &NewNodeId, &NewFuseHandle, &NewNodeIsDirectory);\r
+ Status = OpenExistentFileOrDirectory (\r
+ VirtioFs,\r
+ DirNodeId,\r
+ LastComponent,\r
+ OpenForWriting,\r
+ &NewNodeId,\r
+ &NewFuseHandle,\r
+ &NewNodeIsDirectory\r
+ );\r
//\r
// If LastComponent could not be found under DirNodeId, but the request\r
// allows us to create a new entry, attempt creating the requested regular\r
// file or directory.\r
//\r
- if (Status == EFI_NOT_FOUND && PermitCreation) {\r
+ if ((Status == EFI_NOT_FOUND) && PermitCreation) {\r
ASSERT (OpenForWriting);\r
if (CreateDirectoryIfCreating) {\r
- Status = CreateDirectory (VirtioFs, DirNodeId, LastComponent, &NewNodeId,\r
- &NewFuseHandle);\r
+ Status = CreateDirectory (\r
+ VirtioFs,\r
+ DirNodeId,\r
+ LastComponent,\r
+ &NewNodeId,\r
+ &NewFuseHandle\r
+ );\r
} else {\r
- Status = CreateRegularFile (VirtioFs, DirNodeId, LastComponent,\r
- &NewNodeId, &NewFuseHandle);\r
+ Status = CreateRegularFile (\r
+ VirtioFs,\r
+ DirNodeId,\r
+ LastComponent,\r
+ &NewNodeId,\r
+ &NewFuseHandle\r
+ );\r
}\r
+\r
NewNodeIsDirectory = CreateDirectoryIfCreating;\r
}\r
\r
NewVirtioFsFile->IsOpenForWriting = OpenForWriting;\r
NewVirtioFsFile->OwnerFs = VirtioFs;\r
NewVirtioFsFile->CanonicalPathname = NewCanonicalPath;\r
+ NewVirtioFsFile->FilePosition = 0;\r
NewVirtioFsFile->NodeId = NewNodeId;\r
NewVirtioFsFile->FuseHandle = NewFuseHandle;\r
+ NewVirtioFsFile->FileInfoArray = NULL;\r
+ NewVirtioFsFile->SingleFileInfoSize = 0;\r
+ NewVirtioFsFile->NumFileInfo = 0;\r
+ NewVirtioFsFile->NextFileInfo = 0;\r
\r
//\r
// One more file is now open for the filesystem.\r