Add a canonical pathname field to VIRTIO_FS_FILE. Initialize the new field in EFI_SIMPLE_FILE_SYSTEM_PROTOCOL.OpenVolume().
Release the new field in EFI_FILE_PROTOCOL.Close() and EFI_FILE_PROTOCOL.Delete(). Cc: Ard Biesheuvel <[email protected]> Cc: Jordan Justen <[email protected]> Cc: Philippe Mathieu-Daudé <[email protected]> Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3097 Signed-off-by: Laszlo Ersek <[email protected]> --- OvmfPkg/VirtioFsDxe/VirtioFsDxe.h | 1 + OvmfPkg/VirtioFsDxe/SimpleFsClose.c | 1 + OvmfPkg/VirtioFsDxe/SimpleFsDelete.c | 1 + OvmfPkg/VirtioFsDxe/SimpleFsOpenVolume.c | 13 ++++++++++++- 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/OvmfPkg/VirtioFsDxe/VirtioFsDxe.h b/OvmfPkg/VirtioFsDxe/VirtioFsDxe.h index f4fed64c7217..487d215c7f38 100644 --- a/OvmfPkg/VirtioFsDxe/VirtioFsDxe.h +++ b/OvmfPkg/VirtioFsDxe/VirtioFsDxe.h @@ -132,16 +132,17 @@ typedef struct { // typedef struct { UINT64 Signature; EFI_FILE_PROTOCOL SimpleFile; BOOLEAN IsDirectory; BOOLEAN IsOpenForWriting; VIRTIO_FS *OwnerFs; LIST_ENTRY OpenFilesEntry; + CHAR8 *CanonicalPathname; // // In the FUSE wire protocol, every request except FUSE_INIT refers to a // file, namely by the "VIRTIO_FS_FUSE_REQUEST.NodeId" field; that is, by the // inode number of the file. However, some of the FUSE requests that we need // for some of the EFI_FILE_PROTOCOL member functions require an open file // handle *in addition* to the inode number. For simplicity, whenever a // VIRTIO_FS_FILE object is created, primarily defined by its NodeId field, // we also *open* the referenced file at once, and save the returned file diff --git a/OvmfPkg/VirtioFsDxe/SimpleFsClose.c b/OvmfPkg/VirtioFsDxe/SimpleFsClose.c index bc91ad726b2c..04b4f2c382d7 100644 --- a/OvmfPkg/VirtioFsDxe/SimpleFsClose.c +++ b/OvmfPkg/VirtioFsDxe/SimpleFsClose.c @@ -54,11 +54,12 @@ VirtioFsSimpleFileClose ( VirtioFsFuseForget (VirtioFs, VirtioFsFile->NodeId); } // // One fewer file left open for the owner filesystem. // RemoveEntryList (&VirtioFsFile->OpenFilesEntry); + FreePool (VirtioFsFile->CanonicalPathname); FreePool (VirtioFsFile); return EFI_SUCCESS; } diff --git a/OvmfPkg/VirtioFsDxe/SimpleFsDelete.c b/OvmfPkg/VirtioFsDxe/SimpleFsDelete.c index bbad64bf7886..e2fc2d72dfeb 100644 --- a/OvmfPkg/VirtioFsDxe/SimpleFsDelete.c +++ b/OvmfPkg/VirtioFsDxe/SimpleFsDelete.c @@ -58,11 +58,12 @@ VirtioFsSimpleFileDelete ( VirtioFsFuseForget (VirtioFs, VirtioFsFile->NodeId); } // // One fewer file left open for the owner filesystem. // RemoveEntryList (&VirtioFsFile->OpenFilesEntry); + FreePool (VirtioFsFile->CanonicalPathname); FreePool (VirtioFsFile); return Status; } diff --git a/OvmfPkg/VirtioFsDxe/SimpleFsOpenVolume.c b/OvmfPkg/VirtioFsDxe/SimpleFsOpenVolume.c index 67d2deb6bdf2..9c0ab434c186 100644 --- a/OvmfPkg/VirtioFsDxe/SimpleFsOpenVolume.c +++ b/OvmfPkg/VirtioFsDxe/SimpleFsOpenVolume.c @@ -23,32 +23,39 @@ EFIAPI VirtioFsOpenVolume ( IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This, OUT EFI_FILE_PROTOCOL **Root ) { VIRTIO_FS *VirtioFs; VIRTIO_FS_FILE *VirtioFsFile; EFI_STATUS Status; + CHAR8 *CanonicalPathname; UINT64 RootDirHandle; VirtioFs = VIRTIO_FS_FROM_SIMPLE_FS (This); VirtioFsFile = AllocatePool (sizeof *VirtioFsFile); if (VirtioFsFile == NULL) { return EFI_OUT_OF_RESOURCES; } + CanonicalPathname = AllocateCopyPool (sizeof "/", "/"); + if (CanonicalPathname == NULL) { + Status = EFI_OUT_OF_RESOURCES; + goto FreeVirtioFsFile; + } + // // Open the root directory. // Status = VirtioFsFuseOpenDir (VirtioFs, VIRTIO_FS_FUSE_ROOT_DIR_NODE_ID, &RootDirHandle); if (EFI_ERROR (Status)) { - goto FreeVirtioFsFile; + goto FreeCanonicalPathname; } // // Populate the new VIRTIO_FS_FILE object. // VirtioFsFile->Signature = VIRTIO_FS_FILE_SIG; VirtioFsFile->SimpleFile.Revision = EFI_FILE_PROTOCOL_REVISION; VirtioFsFile->SimpleFile.Open = VirtioFsSimpleFileOpen; @@ -59,24 +66,28 @@ VirtioFsOpenVolume ( VirtioFsFile->SimpleFile.GetPosition = VirtioFsSimpleFileGetPosition; VirtioFsFile->SimpleFile.SetPosition = VirtioFsSimpleFileSetPosition; VirtioFsFile->SimpleFile.GetInfo = VirtioFsSimpleFileGetInfo; VirtioFsFile->SimpleFile.SetInfo = VirtioFsSimpleFileSetInfo; VirtioFsFile->SimpleFile.Flush = VirtioFsSimpleFileFlush; VirtioFsFile->IsDirectory = TRUE; VirtioFsFile->IsOpenForWriting = FALSE; VirtioFsFile->OwnerFs = VirtioFs; + VirtioFsFile->CanonicalPathname = CanonicalPathname; VirtioFsFile->NodeId = VIRTIO_FS_FUSE_ROOT_DIR_NODE_ID; VirtioFsFile->FuseHandle = RootDirHandle; // // One more file open for the filesystem. // InsertTailList (&VirtioFs->OpenFiles, &VirtioFsFile->OpenFilesEntry); *Root = &VirtioFsFile->SimpleFile; return EFI_SUCCESS; +FreeCanonicalPathname: + FreePool (CanonicalPathname); + FreeVirtioFsFile: FreePool (VirtioFsFile); return Status; } -- 2.19.1.3.g30247aa5d201 _______________________________________________ Virtio-fs mailing list [email protected] https://www.redhat.com/mailman/listinfo/virtio-fs
