From: "Laszlo Ersek" <lersek@redhat.com>
To: devel@edk2.groups.io, virtio-fs@redhat.com, lersek@redhat.com
Cc: "Ard Biesheuvel" <ard.biesheuvel@arm.com>,
"Jordan Justen" <jordan.l.justen@intel.com>,
"Philippe Mathieu-Daudé" <philmd@redhat.com>
Subject: [edk2 PATCH 26/48] OvmfPkg/VirtioFsDxe: implement EFI_FILE_PROTOCOL.Open()
Date: Wed, 16 Dec 2020 22:11:03 +0100 [thread overview]
Message-ID: <20201216211125.19496-27-lersek@redhat.com> (raw)
In-Reply-To: <20201216211125.19496-1-lersek@redhat.com>
Using the functions introduced previously, we can now implement
VirtioFsSimpleFileOpen().
This lets the "MKDIR" command to work in the UEFI shell, for example.
Cc: Ard Biesheuvel <ard.biesheuvel@arm.com>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Philippe Mathieu-Daudé <philmd@redhat.com>
Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3097
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
---
OvmfPkg/VirtioFsDxe/SimpleFsOpen.c | 480 +++++++++++++++++++-
1 file changed, 479 insertions(+), 1 deletion(-)
diff --git a/OvmfPkg/VirtioFsDxe/SimpleFsOpen.c b/OvmfPkg/VirtioFsDxe/SimpleFsOpen.c
index f0e249184079..2649c796ac97 100644
--- a/OvmfPkg/VirtioFsDxe/SimpleFsOpen.c
+++ b/OvmfPkg/VirtioFsDxe/SimpleFsOpen.c
@@ -1,22 +1,500 @@
/** @file
EFI_FILE_PROTOCOL.Open() member function for the Virtio Filesystem driver.
Copyright (C) 2020, Red Hat, Inc.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
+#include <Library/BaseLib.h> // AsciiStrCmp()
+#include <Library/MemoryAllocationLib.h> // AllocatePool()
+
#include "VirtioFsDxe.h"
+/**
+ Open the root directory, possibly for writing.
+
+ @param[in,out] VirtioFs The Virtio Filesystem device whose root directory
+ should be opened.
+
+ @param[out] NewHandle The new EFI_FILE_PROTOCOL instance through which
+ the root directory can be accessed.
+
+ @param[in] OpenForWriting TRUE if the root directory should be opened for
+ read-write access. FALSE if the root directory
+ should be opened for read-only access. Opening the
+ root directory for read-write access is useful for
+ calling EFI_FILE_PROTOCOL.Flush() or
+ EFI_FILE_PROTOCOL.SetInfo() later, for syncing or
+ touching the root directory, respectively.
+
+ @retval EFI_SUCCESS The root directory has been opened successfully.
+
+ @retval EFI_ACCESS_DENIED OpenForWriting is TRUE, but the root directory is
+ marked as read-only.
+
+ @return Error codes propagated from underlying functions.
+**/
+STATIC
+EFI_STATUS
+OpenRootDirectory (
+ IN OUT VIRTIO_FS *VirtioFs,
+ OUT EFI_FILE_PROTOCOL **NewHandle,
+ IN BOOLEAN OpenForWriting
+ )
+{
+ EFI_STATUS Status;
+ VIRTIO_FS_FILE *NewVirtioFsFile;
+
+ //
+ // VirtioFsOpenVolume() opens the root directory for read-only access. If the
+ // current request is to open the root directory for read-write access, so
+ // that EFI_FILE_PROTOCOL.Flush() or EFI_FILE_PROTOCOL.SetInfo()+timestamps
+ // can be used on the root directory later, then we have to check for write
+ // permission first.
+ //
+ if (OpenForWriting) {
+ VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE FuseAttr;
+ EFI_FILE_INFO FileInfo;
+
+ Status = VirtioFsFuseGetAttr (VirtioFs, VIRTIO_FS_FUSE_ROOT_DIR_NODE_ID,
+ &FuseAttr);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+ Status = VirtioFsFuseAttrToEfiFileInfo (&FuseAttr, &FileInfo);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+ if ((FileInfo.Attribute & EFI_FILE_READ_ONLY) != 0) {
+ return EFI_ACCESS_DENIED;
+ }
+ }
+
+ Status = VirtioFsOpenVolume (&VirtioFs->SimpleFs, NewHandle);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ NewVirtioFsFile = VIRTIO_FS_FILE_FROM_SIMPLE_FILE (*NewHandle);
+ NewVirtioFsFile->IsOpenForWriting = OpenForWriting;
+ return EFI_SUCCESS;
+}
+
+/**
+ Open an existent regular file or non-root directory.
+
+ @param[in,out] VirtioFs The Virtio Filesystem device on which the
+ regular file or directory should be opened.
+
+ @param[in] DirNodeId The inode number of the immediate parent
+ directory of the regular file or directory to
+ open.
+
+ @param[in] Name The single-component filename of the regular
+ file or directory to open, under the immediate
+ parent directory identified by DirNodeId.
+
+ @param[in] OpenForWriting TRUE if the regular file or directory should be
+ opened for read-write access. FALSE if the
+ regular file or directory should be opened for
+ read-only access. Opening a directory for
+ read-write access is useful for deleting,
+ renaming, syncing or touching the directory
+ later.
+
+ @param[out] NodeId The inode number of the regular file or
+ directory, returned by the Virtio Filesystem
+ device.
+
+ @param[out] FuseHandle The open handle to the regular file or
+ directory, returned by the Virtio Filesystem
+ device.
+
+ @param[out] NodeIsDirectory Set to TRUE on output if Name was found to refer
+ to a directory. Set to FALSE if Name was found
+ to refer to a regular file.
+
+ @retval EFI_SUCCESS The regular file or directory has been looked up
+ and opened successfully.
+
+ @retval EFI_ACCESS_DENIED OpenForWriting is TRUE, but the regular file or
+ directory is marked read-only.
+
+ @retval EFI_NOT_FOUND A directory entry called Name was not found in the
+ directory identified by DirNodeId. (EFI_NOT_FOUND
+ is not returned for any other condition.)
+
+ @return Errors propagated from underlying functions. If
+ the error code to propagate were EFI_NOT_FOUND, it
+ is remapped to EFI_DEVICE_ERROR.
+**/
+STATIC
+EFI_STATUS
+OpenExistentFileOrDirectory (
+ IN OUT VIRTIO_FS *VirtioFs,
+ IN UINT64 DirNodeId,
+ IN CHAR8 *Name,
+ IN BOOLEAN OpenForWriting,
+ OUT UINT64 *NodeId,
+ OUT UINT64 *FuseHandle,
+ OUT BOOLEAN *NodeIsDirectory
+ )
+{
+ EFI_STATUS Status;
+ UINT64 ResolvedNodeId;
+ VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE FuseAttr;
+ EFI_FILE_INFO FileInfo;
+ BOOLEAN IsDirectory;
+ UINT64 NewFuseHandle;
+
+ Status = VirtioFsFuseLookup (VirtioFs, DirNodeId, Name, &ResolvedNodeId,
+ &FuseAttr);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+ Status = VirtioFsFuseAttrToEfiFileInfo (&FuseAttr, &FileInfo);
+ if (EFI_ERROR (Status)) {
+ goto ForgetResolvedNodeId;
+ }
+
+ if (OpenForWriting && (FileInfo.Attribute & EFI_FILE_READ_ONLY) != 0) {
+ Status = EFI_ACCESS_DENIED;
+ goto ForgetResolvedNodeId;
+ }
+
+ IsDirectory = (BOOLEAN)((FileInfo.Attribute & EFI_FILE_DIRECTORY) != 0);
+ if (IsDirectory) {
+ //
+ // If OpenForWriting is TRUE here, that's not passed to
+ // VirtioFsFuseOpenDir(); it does not affect the FUSE_OPENDIR request we
+ // send. OpenForWriting=TRUE will only permit attempts to delete, rename,
+ // flush (sync), and touch the directory.
+ //
+ Status = VirtioFsFuseOpenDir (VirtioFs, ResolvedNodeId, &NewFuseHandle);
+ } else {
+ Status = VirtioFsFuseOpen (VirtioFs, ResolvedNodeId, OpenForWriting,
+ &NewFuseHandle);
+ }
+ if (EFI_ERROR (Status)) {
+ goto ForgetResolvedNodeId;
+ }
+
+ *NodeId = ResolvedNodeId;
+ *FuseHandle = NewFuseHandle;
+ *NodeIsDirectory = IsDirectory;
+ return EFI_SUCCESS;
+
+ForgetResolvedNodeId:
+ VirtioFsFuseForget (VirtioFs, ResolvedNodeId);
+ return (Status == EFI_NOT_FOUND) ? EFI_DEVICE_ERROR : Status;
+}
+
+/**
+ Create a directory.
+
+ @param[in,out] VirtioFs The Virtio Filesystem device on which the directory
+ should be created.
+
+ @param[in] DirNodeId The inode number of the immediate parent directory
+ of the directory to create.
+
+ @param[in] Name The single-component filename of the directory to
+ create, under the immediate parent directory
+ identified by DirNodeId.
+
+ @param[out] NodeId The inode number of the directory created, returned
+ by the Virtio Filesystem device.
+
+ @param[out] FuseHandle The open handle to the directory created, returned
+ by the Virtio Filesystem device.
+
+ @retval EFI_SUCCESS The directory has been created successfully.
+
+ @return Errors propagated from underlying functions.
+**/
+STATIC
+EFI_STATUS
+CreateDirectory (
+ IN OUT VIRTIO_FS *VirtioFs,
+ IN UINT64 DirNodeId,
+ IN CHAR8 *Name,
+ OUT UINT64 *NodeId,
+ OUT UINT64 *FuseHandle
+ )
+{
+ EFI_STATUS Status;
+ UINT64 NewChildDirNodeId;
+ UINT64 NewFuseHandle;
+
+ Status = VirtioFsFuseMkDir (VirtioFs, DirNodeId, Name, &NewChildDirNodeId);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ Status = VirtioFsFuseOpenDir (VirtioFs, NewChildDirNodeId, &NewFuseHandle);
+ if (EFI_ERROR (Status)) {
+ goto RemoveNewChildDir;
+ }
+
+ *NodeId = NewChildDirNodeId;
+ *FuseHandle = NewFuseHandle;
+ return EFI_SUCCESS;
+
+RemoveNewChildDir:
+ VirtioFsFuseRemoveFileOrDir (VirtioFs, DirNodeId, Name, TRUE /* IsDir */);
+ VirtioFsFuseForget (VirtioFs, NewChildDirNodeId);
+ return Status;
+}
+
+/**
+ Create a regular file.
+
+ @param[in,out] VirtioFs The Virtio Filesystem device on which the regular
+ file should be created.
+
+ @param[in] DirNodeId The inode number of the immediate parent directory
+ of the regular file to create.
+
+ @param[in] Name The single-component filename of the regular file to
+ create, under the immediate parent directory
+ identified by DirNodeId.
+
+ @param[out] NodeId The inode number of the regular file created,
+ returned by the Virtio Filesystem device.
+
+ @param[out] FuseHandle The open handle to the regular file created,
+ returned by the Virtio Filesystem device.
+
+ @retval EFI_SUCCESS The regular file has been created successfully.
+
+ @return Errors propagated from underlying functions.
+**/
+STATIC
+EFI_STATUS
+CreateRegularFile (
+ IN OUT VIRTIO_FS *VirtioFs,
+ IN UINT64 DirNodeId,
+ IN CHAR8 *Name,
+ OUT UINT64 *NodeId,
+ OUT UINT64 *FuseHandle
+ )
+{
+ return VirtioFsFuseOpenOrCreate (VirtioFs, DirNodeId, Name, NodeId,
+ FuseHandle);
+}
+
EFI_STATUS
EFIAPI
VirtioFsSimpleFileOpen (
IN EFI_FILE_PROTOCOL *This,
OUT EFI_FILE_PROTOCOL **NewHandle,
IN CHAR16 *FileName,
IN UINT64 OpenMode,
IN UINT64 Attributes
)
{
- return EFI_NO_MEDIA;
+ VIRTIO_FS_FILE *VirtioFsFile;
+ VIRTIO_FS *VirtioFs;
+ BOOLEAN OpenForWriting;
+ BOOLEAN PermitCreation;
+ BOOLEAN CreateDirectoryIfCreating;
+ VIRTIO_FS_FILE *NewVirtioFsFile;
+ EFI_STATUS Status;
+ CHAR8 *NewCanonicalPath;
+ BOOLEAN RootEscape;
+ UINT64 DirNodeId;
+ CHAR8 *LastComponent;
+ UINT64 NewNodeId;
+ UINT64 NewFuseHandle;
+ BOOLEAN NewNodeIsDirectory;
+
+ VirtioFsFile = VIRTIO_FS_FILE_FROM_SIMPLE_FILE (This);
+ VirtioFs = VirtioFsFile->OwnerFs;
+
+ //
+ // Validate OpenMode.
+ //
+ switch (OpenMode) {
+ case EFI_FILE_MODE_READ:
+ OpenForWriting = FALSE;
+ PermitCreation = FALSE;
+ break;
+ case EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE:
+ OpenForWriting = TRUE;
+ PermitCreation = FALSE;
+ break;
+ case EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE:
+ OpenForWriting = TRUE;
+ PermitCreation = TRUE;
+ break;
+ default:
+ return EFI_INVALID_PARAMETER;
+ }
+
+ //
+ // Validate the Attributes requested for the case when the file ends up being
+ // created, provided creation is permitted.
+ //
+ if (PermitCreation) {
+ if ((Attributes & ~EFI_FILE_VALID_ATTR) != 0) {
+ //
+ // Unknown attribute requested.
+ //
+ return EFI_INVALID_PARAMETER;
+ }
+
+ ASSERT (OpenForWriting);
+ if ((Attributes & EFI_FILE_READ_ONLY) != 0) {
+ DEBUG ((
+ DEBUG_ERROR,
+ ("%a: Label=\"%s\" CanonicalPathname=\"%a\" FileName=\"%s\" "
+ "OpenMode=0x%Lx Attributes=0x%Lx: nonsensical request to possibly "
+ "create a file marked read-only, for read-write access\n"),
+ __FUNCTION__,
+ VirtioFs->Label,
+ VirtioFsFile->CanonicalPathname,
+ FileName,
+ OpenMode,
+ Attributes
+ ));
+ return EFI_INVALID_PARAMETER;
+ }
+ CreateDirectoryIfCreating = (BOOLEAN)((Attributes &
+ EFI_FILE_DIRECTORY) != 0);
+ }
+
+ //
+ // Referring to a file relative to a regular file makes no sense (or at least
+ // it cannot be implemented consistently with how a file is referred to
+ // relative to a directory).
+ //
+ if (!VirtioFsFile->IsDirectory) {
+ DEBUG ((
+ DEBUG_ERROR,
+ ("%a: Label=\"%s\" CanonicalPathname=\"%a\" FileName=\"%s\": "
+ "nonsensical request to open a file or directory relative to a regular "
+ "file\n"),
+ __FUNCTION__,
+ VirtioFs->Label,
+ VirtioFsFile->CanonicalPathname,
+ FileName
+ ));
+ return EFI_INVALID_PARAMETER;
+ }
+
+ //
+ // Allocate the new VIRTIO_FS_FILE object.
+ //
+ NewVirtioFsFile = AllocatePool (sizeof *NewVirtioFsFile);
+ if (NewVirtioFsFile == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ //
+ // Create the canonical pathname at which the desired file is expected to
+ // exist.
+ //
+ Status = VirtioFsAppendPath (VirtioFsFile->CanonicalPathname, FileName,
+ &NewCanonicalPath, &RootEscape);
+ if (EFI_ERROR (Status)) {
+ goto FreeNewVirtioFsFile;
+ }
+ if (RootEscape) {
+ Status = EFI_ACCESS_DENIED;
+ goto FreeNewCanonicalPath;
+ }
+
+ //
+ // If the desired file is the root directory, just open the volume one more
+ // time, without looking up anything.
+ //
+ if (AsciiStrCmp (NewCanonicalPath, "/") == 0) {
+ FreePool (NewCanonicalPath);
+ FreePool (NewVirtioFsFile);
+ return OpenRootDirectory (VirtioFs, NewHandle, OpenForWriting);
+ }
+
+ //
+ // Split the new canonical pathname into most specific parent directory
+ // (given by DirNodeId) and last pathname component (i.e., immediate child
+ // within that parent directory).
+ //
+ Status = VirtioFsLookupMostSpecificParentDir (VirtioFs, NewCanonicalPath,
+ &DirNodeId, &LastComponent);
+ if (EFI_ERROR (Status)) {
+ goto FreeNewCanonicalPath;
+ }
+
+ //
+ // Try to open LastComponent directly under DirNodeId, as an existent regular
+ // file or directory.
+ //
+ Status = OpenExistentFileOrDirectory (VirtioFs, DirNodeId, LastComponent,
+ OpenForWriting, &NewNodeId, &NewFuseHandle, &NewNodeIsDirectory);
+ //
+ // If LastComponent could not be found under DirNodeId, but the request
+ // allows us to create a new entry, attempt creating the requested regular
+ // file or directory.
+ //
+ if (Status == EFI_NOT_FOUND && PermitCreation) {
+ ASSERT (OpenForWriting);
+ if (CreateDirectoryIfCreating) {
+ Status = CreateDirectory (VirtioFs, DirNodeId, LastComponent, &NewNodeId,
+ &NewFuseHandle);
+ } else {
+ Status = CreateRegularFile (VirtioFs, DirNodeId, LastComponent,
+ &NewNodeId, &NewFuseHandle);
+ }
+ NewNodeIsDirectory = CreateDirectoryIfCreating;
+ }
+
+ //
+ // Regardless of the branch taken, we're done with DirNodeId.
+ //
+ if (DirNodeId != VIRTIO_FS_FUSE_ROOT_DIR_NODE_ID) {
+ VirtioFsFuseForget (VirtioFs, DirNodeId);
+ }
+
+ if (EFI_ERROR (Status)) {
+ goto FreeNewCanonicalPath;
+ }
+
+ //
+ // Populate the new VIRTIO_FS_FILE object.
+ //
+ NewVirtioFsFile->Signature = VIRTIO_FS_FILE_SIG;
+ NewVirtioFsFile->SimpleFile.Revision = EFI_FILE_PROTOCOL_REVISION;
+ NewVirtioFsFile->SimpleFile.Open = VirtioFsSimpleFileOpen;
+ NewVirtioFsFile->SimpleFile.Close = VirtioFsSimpleFileClose;
+ NewVirtioFsFile->SimpleFile.Delete = VirtioFsSimpleFileDelete;
+ NewVirtioFsFile->SimpleFile.Read = VirtioFsSimpleFileRead;
+ NewVirtioFsFile->SimpleFile.Write = VirtioFsSimpleFileWrite;
+ NewVirtioFsFile->SimpleFile.GetPosition = VirtioFsSimpleFileGetPosition;
+ NewVirtioFsFile->SimpleFile.SetPosition = VirtioFsSimpleFileSetPosition;
+ NewVirtioFsFile->SimpleFile.GetInfo = VirtioFsSimpleFileGetInfo;
+ NewVirtioFsFile->SimpleFile.SetInfo = VirtioFsSimpleFileSetInfo;
+ NewVirtioFsFile->SimpleFile.Flush = VirtioFsSimpleFileFlush;
+ NewVirtioFsFile->IsDirectory = NewNodeIsDirectory;
+ NewVirtioFsFile->IsOpenForWriting = OpenForWriting;
+ NewVirtioFsFile->OwnerFs = VirtioFs;
+ NewVirtioFsFile->CanonicalPathname = NewCanonicalPath;
+ NewVirtioFsFile->NodeId = NewNodeId;
+ NewVirtioFsFile->FuseHandle = NewFuseHandle;
+
+ //
+ // One more file is now open for the filesystem.
+ //
+ InsertTailList (&VirtioFs->OpenFiles, &NewVirtioFsFile->OpenFilesEntry);
+
+ *NewHandle = &NewVirtioFsFile->SimpleFile;
+ return EFI_SUCCESS;
+
+FreeNewCanonicalPath:
+ FreePool (NewCanonicalPath);
+
+FreeNewVirtioFsFile:
+ FreePool (NewVirtioFsFile);
+
+ return Status;
}
--
2.19.1.3.g30247aa5d201
next prev parent reply other threads:[~2020-12-16 22:06 UTC|newest]
Thread overview: 65+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-12-16 21:10 [edk2 PATCH 00/48] ArmVirtPkg, OvmfPkg: virtio filesystem driver Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 01/48] OvmfPkg: introduce VirtioFsDxe Laszlo Ersek
2020-12-18 17:42 ` Ard Biesheuvel
2020-12-18 18:13 ` [Virtio-fs] " Dr. David Alan Gilbert
2020-12-19 21:16 ` Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 02/48] ArmVirtPkg: include VirtioFsDxe in the ArmVirtQemu* platforms Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 03/48] OvmfPkg/VirtioFsDxe: DriverBinding: open VirtioDevice, install SimpleFs Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 04/48] OvmfPkg/VirtioFsDxe: implement virtio device (un)initialization Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 05/48] OvmfPkg/VirtioFsDxe: add a scatter-gather list data type Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 06/48] OvmfPkg/VirtioFsDxe: introduce the basic FUSE request/response headers Laszlo Ersek
2020-12-17 11:49 ` [Virtio-fs] " Dr. David Alan Gilbert
2020-12-17 13:57 ` Laszlo Ersek
2020-12-17 14:06 ` Dr. David Alan Gilbert
2020-12-17 14:32 ` Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 07/48] OvmfPkg/VirtioFsDxe: map "errno" values to EFI_STATUS Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 08/48] OvmfPkg/VirtioFsDxe: submit the FUSE_INIT request to the device Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 09/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_OPENDIR Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 10/48] OvmfPkg/VirtioFsDxe: add shared wrapper for FUSE_RELEASE / FUSE_RELEASEDIR Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 11/48] OvmfPkg/VirtioFsDxe: implement EFI_SIMPLE_FILE_SYSTEM_PROTOCOL.OpenVolume() Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 12/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_FORGET Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 13/48] OvmfPkg/VirtioFsDxe: add a shared wrapper for FUSE_FSYNC / FUSE_FSYNCDIR Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 14/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_FLUSH Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 15/48] OvmfPkg/VirtioFsDxe: flush, sync, release and forget in Close() / Delete() Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 16/48] OvmfPkg/VirtioFsDxe: add helper for appending and sanitizing paths Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 17/48] OvmfPkg/VirtioFsDxe: manage path lifecycle in OpenVolume, Close, Delete Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 18/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_OPEN Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 19/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_MKDIR Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 20/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_CREATE Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 21/48] OvmfPkg/VirtioFsDxe: convert FUSE inode attributes to EFI_FILE_INFO Laszlo Ersek
2020-12-16 21:10 ` [edk2 PATCH 22/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_LOOKUP Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 23/48] OvmfPkg/VirtioFsDxe: split canon. path into last parent + last component Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 24/48] OvmfPkg/VirtioFsDxe: add a shared wrapper for FUSE_UNLINK / FUSE_RMDIR Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 25/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_GETATTR Laszlo Ersek
2020-12-16 21:11 ` Laszlo Ersek [this message]
2020-12-16 21:11 ` [edk2 PATCH 27/48] OvmfPkg/VirtioFsDxe: erase the dir. entry in EFI_FILE_PROTOCOL.Delete() Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 28/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_STATFS Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 29/48] OvmfPkg/VirtioFsDxe: add helper for formatting UEFI basenames Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 30/48] OvmfPkg/VirtioFsDxe: implement EFI_FILE_PROTOCOL.GetInfo() Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 31/48] OvmfPkg/VirtioFsDxe: implement EFI_FILE_PROTOCOL.GetPosition, .SetPosition Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 32/48] OvmfPkg/VirtioFsDxe: add a shared wrapper for FUSE_READ / FUSE_READDIRPLUS Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 33/48] OvmfPkg/VirtioFsDxe: implement EFI_FILE_PROTOCOL.Read() for regular files Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 34/48] OvmfPkg/VirtioFsDxe: convert FUSE dirent filename to EFI_FILE_INFO Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 35/48] OvmfPkg/VirtioFsDxe: add EFI_FILE_INFO cache fields to VIRTIO_FS_FILE Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 36/48] OvmfPkg/VirtioFsDxe: implement EFI_FILE_PROTOCOL.Read() for directories Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 37/48] OvmfPkg/VirtioFsDxe: implement EFI_FILE_PROTOCOL.Flush() Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 38/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_WRITE Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 39/48] OvmfPkg/VirtioFsDxe: implement EFI_FILE_PROTOCOL.Write() Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 40/48] OvmfPkg/VirtioFsDxe: handle the volume label in EFI_FILE_PROTOCOL.SetInfo Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 41/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_RENAME2 Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 42/48] OvmfPkg/VirtioFsDxe: add helper for composing rename/move destination path Laszlo Ersek
2020-12-18 17:39 ` Ard Biesheuvel
2020-12-19 22:40 ` Laszlo Ersek
2020-12-19 22:54 ` Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 43/48] OvmfPkg/VirtioFsDxe: handle file rename/move in EFI_FILE_PROTOCOL.SetInfo Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 44/48] OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_SETATTR Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 45/48] OvmfPkg/VirtioFsDxe: add helper for determining file size update Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 46/48] OvmfPkg/VirtioFsDxe: add helper for determining access time updates Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 47/48] OvmfPkg/VirtioFsDxe: add helper for determining file mode bits update Laszlo Ersek
2020-12-16 21:11 ` [edk2 PATCH 48/48] OvmfPkg/VirtioFsDxe: handle attribute updates in EFI_FILE_PROTOCOL.SetInfo Laszlo Ersek
2020-12-18 17:44 ` [edk2 PATCH 00/48] ArmVirtPkg, OvmfPkg: virtio filesystem driver Ard Biesheuvel
2020-12-20 0:09 ` Laszlo Ersek
2020-12-20 10:15 ` Ard Biesheuvel
2020-12-21 1:46 ` Laszlo Ersek
2020-12-21 10:10 ` Ard Biesheuvel
2020-12-21 18:02 ` [edk2-devel] " Laszlo Ersek
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201216211125.19496-27-lersek@redhat.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox